django _generate_jwt_token处的格式字符串无效

baubqpgj  于 2023-08-08  发布在  Go
关注(0)|答案(3)|浏览(113)

这是我正在学习的教程,链接
https://thinkster.io/tutorials/django-json-api/authentication
正如标题所说,我在这一行收到这个错误“无效格式字符串”:
'exp':int(dt.strftime('% s'))
of _generate_jwt_token。
我查看了strftime的文档,没有这样的格式“%s”,有一个大写的S(' %S'),我将格式更改为大写的S,但在尝试解码授权令牌时,我得到了一个错误,其中我得到了以下错误
{“user”:{“detail”:“身份验证无效。无法解码令牌。"}}
如果我保留小写的s,我会得到“无效格式字符串”错误。

(authentication/backends.py)
def _authenticate_credentials(self, request, token):
    """
    Try to authenticate the given credentials. If authentication is
    successful, return the user and token. If not, throw an error.
    """
    try:
        payload = jwt.decode(token, settings.SECRET_KEY)
    except:
        msg = 'Invalid authentication. Could not decode token.'
        raise exceptions.AuthenticationFailed(msg)

(authentication/models.py)
def _generate_jwt_token(self):
        """
        Generates a JSON Web Token that stores this user's ID and has an expiry
        date set to 60 days into the future.
        """
        dt = datetime.now() + timedelta(days=60)

        token = jwt.encode({
            'id': self.pk,
            'exp': int(dt.strftime('%s'))
        }, settings.SECRET_KEY, algorithm='HS256')

        return token.decode('utf-8')

字符串
我希望下面的令牌“Token eyJ0eXAiOiJKV1QiLCJhbGciOiJI1NiJ9.eyJpZCI6MiwiZXhwIjo0fQ.TWICRQ6BgjWMXFMizjNAXgZ9T2xFnpGiQQuhRKtjckw”返回用户。

5tmbdcev

5tmbdcev1#

它应该是:

token = jwt.encode({
             'id': self.pk,
             'exp': dt.utcfromtimestamp(dt.timestamp())    #CHANGE HERE
    }, settings.SECRET_KEY, algorithm='HS256')

字符串
这是因为jwt比较到期时间和utc时间。您可以通过使用jwt调试工具再次检查您的密钥是否正确:https://jwt.io/
更多阅读这里:https://pyjwt.readthedocs.io/en/latest/usage.html#encoding-decoding-tokens-with-hs256

olhwl3o2

olhwl3o22#

我也被困在这里,是平台特定的%s导致了bug。我更改为%S(注意大写)

4smxwvx5

4smxwvx53#

尝试了许多建议的答案,但没有运气。终于能够让它与:

def _generate_jwt_token(self):
        dt = datetime.now() + timedelta(days=60)

        token = jwt.encode({
            'id': self.pk,
            'exp': int(dt.timestamp())    #HERE
            }, settings.SECRET_KEY, algorithm='HS256')

字符串

相关问题