• Django中djangorestframework-simplejwt的使用


    发现了一篇很好的文章,上面说的很详细:

    链接地址:Django REST Framework教程(7): 如何使用JWT认证(神文多图) - 知乎

     或者如下步骤:

    使用simplejwt:
    1.安装:
    pip install djangorestframework-simplejwt
    
    2.配置
    1. # settings.py
    2. INSTALLED_APPS = [
    3. ...
    4. 'rest_framework',
    5. 'rest_framework_simplejwt',
    6. ]
    7. REST_FRAMEWORK = {
    8. 'DEFAULT_PERMISSION_CLASSES': (
    9. 'rest_framework.permissions.IsAuthenticated',
    10. ),
    11. # 认证类
    12. # 先进行token的验证,如果没有携带token就进行session认证,如果没有session就就基本认证
    13. # 认证顺序是从上到下,需要哪个加哪个
    14. 'DEFAULT_AUTHENTICATION_CLASSES': (
    15. 'rest_framework_simplejwt.authentication.JWTAuthentication',
    16. 'rest_framework.authentication.SessionAuthentication',
    17. 'rest_framework.authentication.BasicAuthentication',
    18. ),
    19. }
    20. SIMPLE_JWT = {
    21. # token有效时长(返回的 access 有效时长)
    22. 'ACCESS_TOKEN_LIFETIME': datetime.timedelta(seconds=30),
    23. # token刷新的有效时间(返回的 refresh 有效时长)
    24. 'REFRESH_TOKEN_LIFETIME': datetime.timedelta(seconds=20),
    25. }
    3.url.py
    1. from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView
    2. urlpatterns = [
    3. # 登录接口
    4. path('authorizations/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    5. # 刷新token
    6. path('refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    7. # 校验token
    8. path('verify/', TokenVerifyView.as_view(), name='token_verify'),
    9. ]
    4.其他设置
    1. # Django project settings.py
    2. from datetime import timedelta
    3. ...
    4. SIMPLE_JWT = {
    5. "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
    6. "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
    7. "ROTATE_REFRESH_TOKENS": False,
    8. "BLACKLIST_AFTER_ROTATION": False,
    9. "UPDATE_LAST_LOGIN": False,
    10. "ALGORITHM": "HS256",
    11. "SIGNING_KEY": settings.SECRET_KEY,
    12. "VERIFYING_KEY": "",
    13. "AUDIENCE": None,
    14. "ISSUER": None,
    15. "JSON_ENCODER": None,
    16. "JWK_URL": None,
    17. "LEEWAY": 0,
    18. "AUTH_HEADER_TYPES": ("Bearer",),
    19. "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    20. "USER_ID_FIELD": "id",
    21. "USER_ID_CLAIM": "user_id",
    22. "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",
    23. "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    24. "TOKEN_TYPE_CLAIM": "token_type",
    25. "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",
    26. "JTI_CLAIM": "jti",
    27. "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
    28. "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
    29. "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),
    30. "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
    31. "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
    32. "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
    33. "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
    34. "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
    35. "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
    36. }

    ACCESS_TOKEN_LIFETIME
    datetime.timedelta指定访问令牌有效时间的对象。该timedelta值在令牌生成期间添加到当前 UTC 时间以获得令牌的默认“exp”声明值。

    REFRESH_TOKEN_LIFETIME
    datetime.timedelta指定刷新令牌有效时间的对象。该timedelta值在令牌生成期间添加到当前 UTC 时间以获得令牌的默认“exp”声明值。

    ROTATE_REFRESH_TOKENS
    设置为 时True,如果将刷新令牌提交给 TokenRefreshView,则新的刷新令牌将与新的访问令牌一起返回。这个新的刷新令牌将通过 JSON 响应中的“刷新”键提供。新的刷新令牌将有一个更新的到期时间,该时间是通过将设置中的 timedelta 添加REFRESH_TOKEN_LIFETIME 到发出请求时的当前时间来确定的。如果黑名单应用程序正在使用中并且BLACKLIST_AFTER_ROTATION设置为True,则提交到刷新视图的刷新令牌将被添加到黑名单中。

    BLACKLIST_AFTER_ROTATION
    设置为 时,如果黑名单应用程序正在使用且设置设置True为 ,则提交给 的刷新令牌 将被添加到黑名单。您需要在设置文件中添加才能使用此设置。 TokenRefreshViewROTATE_REFRESH_TOKENSTrue’rest_framework_simplejwt.token_blacklist’,INSTALLED_APPS


    注:原文链接:DRF 使用djangorestframework-jwt 报错_名难取aaa的博客-CSDN博客
    5、 定制化jwt,可以将用户信息存入token中,也可以将用户信息从接口中返回
    1. from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
    2. from rest_framework_simplejwt.views import TokenObtainPairView
    3. class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    4. @classmethod
    5. def get_token(cls, user):
    6. token = super(MyTokenObtainPairSerializer, cls).get_token(user)
    7. # Add custom claims
    8. token['username'] = user.username
    9. token['password'] = user.password
    10. return token
    11. def validate(self, attrs):
    12. data = super().validate(attrs)
    13. # 获取Token对象
    14. refresh = self.get_token(self.user)
    15. # 加个token的键,值和access键一样
    16. data['token'] = data['access']
    17. # 然后把access键干掉
    18. del data['access']
    19. # 令牌到期时间
    20. data['expire'] = refresh.access_token.payload['exp'] # 有效期
    21. # 用户名
    22. data['username'] = self.user.username
    23. # 邮箱
    24. data['id'] = self.user.id
    25. return data
    26. class MyObtainTokenPairView(TokenObtainPairView):
    27. serializer_class = MyTokenObtainPairSerializer

    然后将url中的类替换为MyObtainTokenPairView即可

    返回结果:

     解密jwt结果:

  • 相关阅读:
    闲话Python编程-字典dict
    Java8中Stream详细用法大全
    stm32cubemx hal学习记录:PWR 低功耗停止模式
    构建供应商全生命周期管理机制,SRM系统规范工程企业供应体系,提升管理水平
    ajax - 终结篇jsonp,防抖节流
    adb详细教程(一)-下载安装与环境变量配置
    Go 学习之 Context 篇
    MySQL中为什么要有事务回滚机制?
    Kubernetes descheduler小记
    Spring Boot+Vue3前后端分离实战wiki知识库系统之用户管理&单点登录
  • 原文地址:https://blog.csdn.net/qq_44906497/article/details/133827288