【问题标题】:Set expiration time to sample django jwt token设置过期时间以采样 django jwt 令牌
【发布时间】:2020-08-17 05:30:26
【问题描述】:

我正在尝试创建一个手动令牌,我想添加过期时间。从这里 =>Documentation

这里=>

from rest_framework_simplejwt.tokens import RefreshToken


refresh = RefreshToken.for_user(user)

refresh.set_exp(lifetime=datetime.timedelta(days=10))
# refresh.lifetime = datetime.timedelta(days=10)

return Response ({            
                    'access': str(refresh.access_token),'refresh':str(refresh),"status":"success"
                    })

这里是setting.py=>

JWT_AUTH = {
    # how long the original token is valid for
    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(days=2),

    # allow refreshing of tokens
    'JWT_ALLOW_REFRESH': True,

    # this is the maximum time AFTER the token was issued that
    # it can be refreshed.  exprired tokens can't be refreshed.
    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(days=7),
}

但是为什么即使我添加了 10 天,这个访问令牌也会在 5 分钟后过期?如何添加过期时间?

此方法是为使用电子邮件和密码进行身份验证而创建的。因为默认身份验证使用用户 ID 和密码。有没有办法在 drf 示例 jwt 中使用电子邮件和密码进行身份验证?

【问题讨论】:

    标签: django-rest-framework jwt-auth django-rest-framework-jwt


    【解决方案1】:

    你有一个错误,因为你正在更新刷新时间,你必须访问 access_token

    def get_tokens_for_user(user):
    
        refresh = RefreshToken.for_user(user)
        access_token = refresh.access_token
        access_token.set_exp(lifetime=timedelta(days=10))
    
        return {
            'refresh': str(refresh),
            'access': str(access_token),
        }
    

    【讨论】:

      【解决方案2】:

      你可以决定使用 django-rest-framework-simplejwt 库还是 rest_framework_jwt

      对于 django-rest-framework-simplejwt 在你的 settings.py 中使用这种方式

      SIMPLE_JWT = {
      'ACCESS_TOKEN_LIFETIME': timedelta(days=10),
      'REFRESH_TOKEN_LIFETIME': timedelta(days=20),
      'ROTATE_REFRESH_TOKENS': False,
      'BLACKLIST_AFTER_ROTATION': True,
      
      'ALGORITHM': 'HS256',
      'SIGNING_KEY': settings.SECRET_KEY,
      'VERIFYING_KEY': None,
      'AUDIENCE': None,
      'ISSUER': None,
      
      'AUTH_HEADER_TYPES': ('Bearer',),
      'USER_ID_FIELD': 'id',
      'USER_ID_CLAIM': 'user_id',
      
      'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),
      'TOKEN_TYPE_CLAIM': 'token_type',
      
      'JTI_CLAIM': 'jti',
      'TOKEN_USER_CLASS': 'rest_framework_simplejwt.models.TokenUser',
      
      'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',
      'SLIDING_TOKEN_LIFETIME': timedelta(days=10),
      'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=20),
      }
      

      对于 rest_framework_jwt 在你的 settings.py 中使用这种方式

      JWT_AUTH = {
      'JWT_ENCODE_HANDLER':
      'rest_framework_jwt.utils.jwt_encode_handler',
      
      'JWT_DECODE_HANDLER':
      'rest_framework_jwt.utils.jwt_decode_handler',
      
      'JWT_PAYLOAD_HANDLER':
      'rest_framework_jwt.utils.jwt_payload_handler',
      
      'JWT_PAYLOAD_GET_USER_ID_HANDLER':
      'rest_framework_jwt.utils.jwt_get_user_id_from_payload_handler',
      
      'JWT_RESPONSE_PAYLOAD_HANDLER':
      'rest_framework_jwt.utils.jwt_response_payload_handler',
      
      'JWT_SECRET_KEY': settings.SECRET_KEY,
      'JWT_GET_USER_SECRET_KEY': None,
      'JWT_PUBLIC_KEY': None,
      'JWT_PRIVATE_KEY': None,
      'JWT_ALGORITHM': 'HS256',
      'JWT_VERIFY': True,
      'JWT_VERIFY_EXPIRATION': True,
      'JWT_LEEWAY': 0,
      'JWT_EXPIRATION_DELTA': datetime.timedelta(days=10),
      'JWT_AUDIENCE': None,
      'JWT_ISSUER': None,
      
      'JWT_ALLOW_REFRESH': False,
      'JWT_REFRESH_EXPIRATION_DELTA': datetime.timedelta(days=30),
      
      'JWT_AUTH_HEADER_PREFIX': 'JWT',
      'JWT_AUTH_COOKIE': None,
      
      }
      

      【讨论】:

      • 对于访问者 => 从日期时间导入 timedelta
      【解决方案3】:

      您正在使用 lib Simple JWT,根据documentation,在设置中,您必须使用“SIMPLE_JWT”而不是“JWT_AUTH”。

      【讨论】:

        猜你喜欢
        • 2020-08-18
        • 2016-08-08
        • 2016-11-13
        • 2020-11-08
        • 1970-01-01
        • 2019-04-18
        • 2018-11-26
        • 2023-04-04
        • 1970-01-01
        相关资源
        最近更新 更多