jwt integration django drf



我正在尝试在我的 Django 应用程序上实现 JWT,但我有一些困惑

当我使用电子邮件通行证在邮递员上提出邮政请求时:

http:www.127.0.0.1:8000/token/

我得到刷新和访问令牌:

{
"refresh": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImV4cCI6MTU3NDUwMTcxNSwianRpIjoiNDg5YjjZmQyY2IwNDI4YjgxMzg4NDU1YmQ1ZGM3NDYiLCJ1c2VyX2lkIjo2fQ.5Bms8FiqOdlIeyi1k1cRcfLC1qmHEH05MysZnzMcKCA",
"access": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiZXhwIjoxNTc0NDE1NjE1LCJqdGkiOiI1OTBkMGjZjJlYmE0YjNmOTE1MzI5NTEyOGExNzUyMCIsInVzZXJfaWQiOjZ9.7HZYpD-mCp5li4PnGSuwQGyVa7nsDYvUVWaxdyKYk-E"
}

当我这样做时:

http:www.127.0.0.1:8000/rest-auth/login/

我得到访问令牌:

{
"token": "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VyX2lkIjo2LCJ1c2VybmFtZSI6ImFrYXNAbWFpbC5jb20iLCJleHAiOjE1NzQ0MTU4NTYsImVtYWlsIjoiYWthc0BtYWlsLmNvbSIsIm9yaWdfaWF0IjoxNTc0NDE1Nzk2fQ.DEpZNq-kFFqYb3ZfAiYDB1CigfY36qpS9o-T7rJ5-_I",
"user": {
    "email": "akas@mail.com",
    "password": "pbkdf2_sha256$150000$OdHDeKGCViax$BvOXGFheSJoNb692ZVYxoWnZxK2xZQpvbu7HA/SC5Po="
       }
 }

然后,当我在标头授权中添加此访问令牌时,我可以发出GET请求

我不明白这两个访问令牌有什么区别?

您的第一对令牌无效,它们在结构上与第二对令牌截然不同。

JWT 由三部分组成,由句点分隔。 (RFC 7519 具有完整的规范。 第一部分是标题;第三部分是签名;但中间部分是一组声明,实际上是令牌的有趣内容。 前两部分只是 base64 编码,因此您可以对它们进行解码以查看里面的内容。 第一个访问令牌的声明如下所示

{"token_type":"access","exp":1574415615,"jti":"590d0hٌ?X?M?َLML̎MLL?LM?L?????

但第二个是

{"user_id":6,"username":"akas@mail.com","exp":1574415856,"email":"akas@mail.com","orig_iat":1574415796}

这向我表明,您的应用程序中有两个不同的 JWT 实现,并且其中一个配置错误; 由于第一个令牌无法解码为 JSON,因此无法有效使用。

调试时还有一件有趣的事情可能是一个提示。 如果我获取您的访问令牌并将其复制到 https://jwt.io/首页上的解码器中,并删除令牌中间jZj字符,则得到

{
  "token_type": "access",
  "exp": 1574415615,
  "jti": "590d0beba4b3f9153295128a17520",
  "user_id": 6
}

这(直到签名(可能会起作用。 不过,这两种代币之间的不同主张看起来仍然很奇怪。

("jti"是令牌唯一标识符的标准声明;它最有用的应用是保留已吊销令牌的黑名单。 还有一个标准的"sub"声明,用于标识令牌的主题,该令牌可能会取代您的"user_id"

最新更新