最近用django 来实现JWT验证的时候发现, 使用django框架提取头部key的时候框架会自己加一些神奇的地方:
如果用 self.request.META:
自己定义的变量会变成
user -> HTTP_USER
user-name -> HTTP_USER_NAME
如果使用self.request.headers
定义的变量会变成
user -> User
user-name ->UserName 双峰命名
因此我关于认证头部的中间件代码会变为:
class JWTQueryParamsAuthentication(BaseAuthentication):
def authenticate(self, request):
info = request.META.get('HTTP_AUTHORIZATION','')
# info = request.headers
# print(info)
#
#
# print(info)
auth = info.split()
if not auth:
raise AuthenticationFailed({'msg': '未获取到请求头', 'code': 403})
if auth[0].lower() != 'jwt':
raise AuthenticationFailed({'msg': '请求头认证方式错误', 'code': 403})
if len(auth) == 1 or len(auth) > 2:
raise AuthenticationFailed({'msg': "非法请求头", 'code': 403})
token = auth[1]
# token = request.query_params.get("token")
payload = None
msg = None
try:
payload = jwt.decode(token, settings.SECRET_KEY, True)
except exceptions.ExpiredSignatureError as e:
msg = 'token已失效'
except exceptions.DecodeError:
msg = 'token认证失败'
except exceptions.InvalidTokenError:
msg = '非法的token'
if not payload:
raise AuthenticationFailed({'code':403, 'msg':msg})
#
# '''
# 这个中间件类里面可以有三种返回值
# 1.抛出异常, 后续不执行
# 2. 认证通过, return 元组 (1,2)---->1.request.user,里面可以是任何东西
# 2.request.auth
# 3.返回None, 进行下一次认证(?用来干嘛的没有细说)
# '''
return (payload, token)