restframework-simpleJWT重写认证机制

6 篇文章 0 订阅
2 篇文章 0 订阅
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
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值