5

我正在尝试验证和解码 simple-jwt-django-rest-framework 令牌。我知道我们可以使用 simple-jwt 的验证 api。但我想在我的观点中解码和验证。以下是我正在尝试的当前代码:-

//in views.py

class home(APIView):
   def post(self,request,*args,**kwargs):
      print("request is ",request._request)
      verify_token_response = token_verify(request._request)
      print("status_code is ", verify_token_response.status_code)

      if(verify_token_response.status_code == 200):
        jwt_object  = JWTAuthentication() 
        validated_token = jwt_object.get_validated_token(request._request)
        user            = jwt_object.get_user(validated_token)
        print(user)
    
    return Response({
            'status':True, 
            'message':'home'
            })

此代码适用于我的令牌验证。它正在正确验证令牌,但是当我检索 valied_token 和用户时,它给了我以下错误:-

{
    "detail": "Given token not valid for any token type",
    "code": "token_not_valid",
    "messages": [
        {
            "token_class": "AccessToken",
            "token_type": "access",
            "message": "Token is invalid or expired"
        }
    ]
}
4

4 回答 4

4

我认为您应该发送 RAW_TOKEN 而不是 request._request

  if(verify_token_response.status_code == 200):
    jwt_object      = JWTAuthentication() 
    header          = jwt_object.get_header(request)
    raw_token       = jwt_object.get_raw_token(header)
    validated_token = jwt_object.get_validated_token(raw_token)
    user            = jwt_object.get_user(validated_token)
    print(user)
于 2020-07-14T06:21:21.530 回答
3

基本上任何 JWT 都是

  1. 有效载荷
  2. 秘密
  3. 编码算法

有效负载只是带有用户标识、角色、权限等的哈希图。

payload = {
  username: "James Bond",
  roles: ['admin'],
  permissions: ['user | add', 'user | edit'],
  id: 7,
}

Secret是一个类似于密码的长字符串,您在 setting.py 中有它

SECRET_KEY = config('SECRET_KEY')

编码算法是一种加密方法

要解码,您必须使用与 编码相同的SECRET_KEY 。

import jwt
# Token generated by simple-jwt-django-rest-framework or any
token = "eyJ0eXAiOiJKV1QiL....";
    
print(jwt.decode(token, config('SECRET_KEY'), algorithms=["HS256"]))

您可以将config('SECRET_KEY')替换为“123”或 settings.py 中的任何内容

于 2021-02-05T20:45:33.940 回答
3

您可以使用模块中的JWTAuthenticationrest_framework_simplejwt.authentication。它包含一个调用的方法 ,该方法authenticate(request)接受请求对象,检查令牌的有效性并返回与令牌关联的用户和经过解码的声明的验证令牌

from rest_framework_simplejwt.authentication import JWTAuthentication
JWT_authenticator = JWTAuthentication()

# authenitcate() verifies and decode the token
# if token is invalid, it raises an exception and returns 401
response = JWT_authenticator.authenticate(request)
if response is not None:
    # unpacking
    user , token = response
    print("this is decoded token claims", token.payload)
else:
    print("no token is provided in the header or the header is missing")
于 2021-07-12T06:45:59.167 回答
0

配置rest_framework_simplejwt认证的时候,是不是要SIMPLE_JWT在文件上配置变量settings.py,有这个ALGORITHMSIGNING_KEY怎么做的:

SIMPLE_JWT = {
    ...

    'ALGORITHM': 'HS512',
    'SIGNING_KEY': SECRET_KEY,
    ...
}

SIGNING_KEY文件中的SECRET_KEY常量在哪里settings.py。那么,是否可以ALGORITHMSIMPLE_JWTdict.key 中获取算法值呢?就我而言,算法是'HS512'.

知道算法后,是否必须导入SIMPLE_JWTfromsettings.py并且可以使用以下示例中的decode方法:jwt

import jwt
from your_project.settings import SIMPLE_JWT

...

token = "eyJ0eXAiOiJKV1QiLC..."
jwt.decode(
   token,
   SIMPLE_JWT['SIGNING_KEY'],
   algorithms=[SIMPLE_JWT['ALGORITHM']],
)
于 2021-05-02T01:06:20.790 回答