token校验 Bearer token的实现

来源:6-8 重写first_or_404与get_or_404

lilj_01

2023-06-25

七月老师,您好;
我用装饰器的方式实现了Bearer Token的验证方式。能帮我看看这种方式是否妥当吗

from flask import request, g
from app.libs.error_code import AuthFailed
from itsdangerous import TimedJSONWebSignatureSerializer, BadSignature, SignatureExpired
from flask import current_app
from collections import namedtuple

User = namedtuple('User', ['uid', 'ac_type', 'scope'])


def token_required(route_function):
    def wrapper(*args, **kwargs):
        authorization_token = request.headers.get('Authorization')
        verify_bearer_token(authorization_token)
        return route_function(*args, **kwargs)

    return wrapper


def verify_bearer_token(authorization_token):
    if authorization_token and authorization_token.startswith('Bearer ') and len(authorization_token) > 7:
        token = authorization_token.split(' ')[1]
        user_info = verify_auth_token(token)
        if not user_info:
            raise AuthFailed(msg='token is invalid.', error_code=1002)
        else:
            # 在 g 对象中放置当前用户信息
            g.user = user_info
    else:
        raise AuthFailed(msg='token is invalid.', error_code=1002)


def verify_auth_token(token):
    s = TimedJSONWebSignatureSerializer(current_app.config['SECRET_KEY'])
    try:
        data = s.loads(token)
    except BadSignature:
        raise AuthFailed(msg='token is invalid.', error_code=1002)
    except SignatureExpired:
        raise AuthFailed(msg='token is expired.', error_code=1003)
    uid = data['uid']
    ac_type = data['type']
    user_info = User(uid, ac_type, '')
    return user_info

@token_required
def get_user():
    return 'cloud'
写回答

1回答

7七月

2023-06-25

这个大段代码挺难看出来,得具体上手调试。token这个只要是使用的库,一般和实现方式没有什么关系

0
0

Python Flask高级编程之RESTFul API前后端分离精讲

RESTFul+权限管理+token令牌+扩展flask=提升编程思维

2037 学习 · 359 问题

查看课程