DRF 使用djangorestframework-jwt 报错

报错信息

 ImportError: Could not import 'rest_framework_jwt.authentication.JSONWebTokenAuthentication' for API setting 'DEFAULT_AUTHENTICATION_CLASSES'. ImportError: cannot import name 'smart_text' from 'django.utils.encoding'

原因

  • JSON Web Token不再维护,故不使用。
  • 官方建议的是使用simpleJWT认证

要求

官方文档:djangorestframework-jwt

  • Python (2.7, 3.3, 3.4, 3.5)
  • Django (1.8, 1.9, 1.10)
  • Django REST Framework (3.0, 3.1, 3.2, 3.3, 3.4, 3.5)
    在这里插入图片描述
    所以新版的django无法使用

解决方案

使用simplejwt

官方文档:djangorestframework-simplejwt

安装

pip install djangorestframework-simplejwt

配置

setting.py

# settings.py
INSTALLED_APPS = [
	...
    'rest_framework', 
    'rest_framework_simplejwt', 
]

REST_FRAMEWORK = {
    'DEFAULT_PERMISSION_CLASSES': (
        'rest_framework.permissions.IsAuthenticated',
    ),
    # 认证类
    # 先进行token的验证,如果没有携带token就进行session认证,如果没有session就就基本认证
    # 认证顺序是从上到下,需要哪个加哪个
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'rest_framework_simplejwt.authentication.JWTAuthentication',
        'rest_framework.authentication.SessionAuthentication',
        'rest_framework.authentication.BasicAuthentication',
    ),
}
SIMPLE_JWT = {
    # token有效时长(返回的 access 有效时长)
    'ACCESS_TOKEN_LIFETIME': datetime.timedelta(seconds=30),
    # token刷新的有效时间(返回的 refresh 有效时长)
    'REFRESH_TOKEN_LIFETIME': datetime.timedelta(seconds=20),
}

urls.py

from rest_framework_simplejwt.views import TokenObtainPairView, TokenRefreshView, TokenVerifyView

urlpatterns = [
    path('authorizations/', TokenObtainPairView.as_view(), name='token_obtain_pair'),
    path('refresh/', TokenRefreshView.as_view(), name='token_refresh'),
    path('verify/', TokenVerifyView.as_view(), name='token_verify'),
]

或者
点源码进去看一样的

from rest_framework_simplejwt.views import token_obtain_pair, token_refresh, token_verify

urlpatterns = [
    path('authorizations/', token_obtain_pair, name='token_obtain_pair'),
    path('refresh/', token_refresh, name='token_refresh'),
    path('verify/', token_verify, name='token_verify'),
]
  • 登录接口,返回refresh和access值
  • refresh用来刷新获取新的Token值
  • access用来请求身份认证的Token
  • access的过期时间参照配置ACCESS_TOKEN_LIFETIME
  • refresh的过期时间参照配置REFRESH_TOKEN_LIFETIME
  • 当用refresh刷新后,access的过期时间等于【当前刷新的此刻时间+ACCESS_TOKEN_LIFETIME】

其他设置

# Django project settings.py

from datetime import timedelta
...

SIMPLE_JWT = {
    "ACCESS_TOKEN_LIFETIME": timedelta(minutes=5),
    "REFRESH_TOKEN_LIFETIME": timedelta(days=1),
    "ROTATE_REFRESH_TOKENS": False,
    "BLACKLIST_AFTER_ROTATION": False,
    "UPDATE_LAST_LOGIN": False,

    "ALGORITHM": "HS256",
    "SIGNING_KEY": settings.SECRET_KEY,
    "VERIFYING_KEY": "",
    "AUDIENCE": None,
    "ISSUER": None,
    "JSON_ENCODER": None,
    "JWK_URL": None,
    "LEEWAY": 0,

    "AUTH_HEADER_TYPES": ("Bearer",),
    "AUTH_HEADER_NAME": "HTTP_AUTHORIZATION",
    "USER_ID_FIELD": "id",
    "USER_ID_CLAIM": "user_id",
    "USER_AUTHENTICATION_RULE": "rest_framework_simplejwt.authentication.default_user_authentication_rule",

    "AUTH_TOKEN_CLASSES": ("rest_framework_simplejwt.tokens.AccessToken",),
    "TOKEN_TYPE_CLAIM": "token_type",
    "TOKEN_USER_CLASS": "rest_framework_simplejwt.models.TokenUser",

    "JTI_CLAIM": "jti",

    "SLIDING_TOKEN_REFRESH_EXP_CLAIM": "refresh_exp",
    "SLIDING_TOKEN_LIFETIME": timedelta(minutes=5),
    "SLIDING_TOKEN_REFRESH_LIFETIME": timedelta(days=1),

    "TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainPairSerializer",
    "TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSerializer",
    "TOKEN_VERIFY_SERIALIZER": "rest_framework_simplejwt.serializers.TokenVerifySerializer",
    "TOKEN_BLACKLIST_SERIALIZER": "rest_framework_simplejwt.serializers.TokenBlacklistSerializer",
    "SLIDING_TOKEN_OBTAIN_SERIALIZER": "rest_framework_simplejwt.serializers.TokenObtainSlidingSerializer",
    "SLIDING_TOKEN_REFRESH_SERIALIZER": "rest_framework_simplejwt.serializers.TokenRefreshSlidingSerializer",
}
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

官方文档

详细请看官方文档:setting

Django是一个高级的Python Web框架,它鼓励快速开发和干净、实用的设计。Django的主要目标是简化构建复杂、数据库驱动的网站的过程。以下是你提到的几个库和它们的作用: 1. Django==5.1: 这是指你正在使用Django框架的版本。版本5.1是Django的一个较新版本,它包含了许多新特性和改进。 2. django-cors-headers==4.4.0: 这是一个Django中间件,用于解决跨源资源共享(CORS)的问题。当你希望你的Django应用能够接收来自不同源(域名、协议或端口)的请求时,使用这个库可以添加适当的HTTP头(CORS headers),允许跨域请求。 3. djangorestframework==3.15.2: Django REST framework 是一个灵活且强大的工具包,用于构建Web API。它为Django应用提供了一种简单而快速的方法来创建RESTful风格的Web服务端点。 4. djangorestframework-simplejwt==5.3.1: 这是一个Django REST framework的第三方库,它实现了JSON Web Token (JWT) 认证。JWT是一种开放标准(RFC 7519),用于在网络应用环境间安全地传输信息。这个库允许使用JWT作为API的认证机制。 5. drf-yasg==1.21.7: 这是“Django REST framework - Yet another Swagger generator”的缩写。它是一个自动生成Swagger文档的工具,Swagger是一个广泛使用API描述语言,允许开发者和团队设计、构建、记录和使用RESTful Web服务。这个库可以自动从Django REST framework的视图中提取API文档并生成Swagger文档。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值