from rest_framework_simplejwt.authentication import JWTAuthentication
class MyJWTAuthentication(JWTAuthentication):
'''
修改JWT认证类,返回自定义User表对象
'''
def authenticate(self, request):
header = self.get_header(request)
if header is None:
return None
# 获取 access_token
raw_token = self.get_raw_token(header)
user = None
token = None
if raw_token is None:
return None
# 定义当前 access_token白名单
wraw_token = str(raw_token, 'utf-8') + config.JWT_WHITE_LIST_TAG
# 是否被录入黑名单
if cache.has_key(str(validated_token) + config.JWT_BLACK_LIST_TAG):
raise AuthenticationFailed(_('Token contained no recognizable user identification'))
# 当出现 在白名单中时
elif cache.has_key(wraw_token):
# 在缓存中 获取 在 中间件 设置的 用户对象
user = cache.get(wraw_token)["user_obj"]
token = raw_token
else:
try:
# 对收到的access_token 进行认证
token = self.get_validated_token(raw_token)
# 根据认证后的 access_token 获取用户对象
user = self.get_user(token)
except Exception as e:
# 普通 access_token异常不进行处理 该怎样抛出响应就抛出响应
# 原access_token异常,为刷新接口时,获取 request.data 的 refresh_token
if request.data.get("refresh_token"):
refresh_token = request.data.get("refresh_token")
# 获取当前 refresh_token 的 有效时间
refresh_time_remaining = output_time_remaining(refresh_token)
# refresh_token 在有效期内
if refresh_time_remaining > 0:
# 且不在黑名单中
if not cache.has_key(refresh_token):
decoded_data = jwt_decode(str(refresh_token), config.JWT_SECRET_KEY, verify=False,
algorithms="HS256")
# 获取 用户对象
user = Person_info.objects.get(**{'person_id': decoded_data["user_id"]})
return user, token
def get_user(self, validated_token):
try:
user_id = validated_token['user_id']
except KeyError:
raise InvalidToken(_('Token contained no recognizable user identification'))
try:
user = Person_info.objects.get(**{'person_id': user_id})
except Person_info.DoesNotExist:
raise AuthenticationFailed(_('User not found'), code='user_not_found')
return user
restframework-simpleJWT重写认证机制
于 2022-06-30 11:56:29 首次发布