我正在尝试在我的 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"
。