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这个只要是使用的库,一般和实现方式没有什么关系
00
相似问题