django rest框架使用jwt RS256解码签名错误

Posted

技术标签:

【中文标题】django rest框架使用jwt RS256解码签名错误【英文标题】:django rest framwork Error decoding signature with jwt RS256 【发布时间】:2018-08-26 09:16:03 【问题描述】:

我正在使用带有 jwt 的 django rest 框架。

在设置中我使用了 RS256 算法

我想在用户身份验证后发送令牌,这是我的功能,我正在尝试使用 user_id 和 is_user 数据发送令牌,但当我将请求中的令牌传递给服务器服务器响应时:

detail
:
"Error decoding signature."

为什么?

这是我的http://localhost:8000/login/ 服务器回复:


    "username": "admin",
    "email": "",
    "token": "b'eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjoxLCJpc191c2VyIjp0cnVlfQ.kIz9TBYqVJVgFV5siM3QfNWHxBN28BlZRY_t8TFADmg'",
    "is_staff": false

登录功能:

JWT_SECRET = 'secret'
JWT_ALGORITHM = 'HS256'
JWT_EXP_DELTA_SECONDS = 20

   def validate(self, data):
        user_obj = None
        email = data.get('email', None)
        username = data.get('username', None)
        password = data.get('password')
        if not email and not username:
            raise ValidationError("email or username is required!")
        if '@' in username:
            email = username
        user = User.objects.filter(
            Q(email=email) |
            Q(username=username)
        ).distinct()

        # user = user.exclude(email__isnull=True).exclude(email__iexact='')
        if user.exists() and user.count() == 1:
            user_obj = user.first()
        else:
            raise ValidationError("this username/email is not valid")
        if user_obj:
            if not user_obj.check_password(password):
                raise ValidationError("password is incorrect")

        # payload_handler(user)
        # payload = payload_handler(user_obj)

        payload = 
            'user_id': user_obj.id,
            'is_user': True,
        
        jwt_token = jwt.encode(payload, JWT_SECRET, JWT_ALGORITHM)
        # code = json_response('token': jwt_token.decode('utf-8'))

        data['token'] = jwt_token
        return data

jwt 设置:

JWT_AUTH = 
    'JWT_SECRET_KEY': SECRET_KEY,
    'JWT_ALGORITHM': 'RS256',
    'JWT_AUTH_HEADER_PREFIX': 'Bearer',
    'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=6600),


【问题讨论】:

【参考方案1】:

对于您的“逻辑函数”,您使用 HS256 算法,在您的“jwt 设置”中,您使用 RS256。我想这一定是个问题。

【讨论】:

以上是关于django rest框架使用jwt RS256解码签名错误的主要内容,如果未能解决你的问题,请参考以下文章

使用 Django REST 框架进行 JWT 身份验证

使用 Django Rest 框架进行 JWT 令牌身份验证

Django rest 框架 jwt 令牌权限

Django Rest 框架 JWT

如何使用 JWT.IO 网站创建 RS256 JWT?

如何从 django rest 框架访问 jwt 令牌到 Angular 前端