栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

djangorestframework-simplejwt教程及使用

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

djangorestframework-simplejwt教程及使用

djangorestframework-simplejwt教程及使用
    • 一、说明
    • 二、功能
    • 三、安装
    • 四、项目配置(全局配置)

一、说明
  1. 适用版本(

    • Python (3.7, 3.8, 3.9, 3.10)
    • Django (2.2, 3.1, 3.2, 4.0)
    • Django REST Framework (3.10, 3.11, 3.12, 3.13)

  2. 功能

  3. 安装

  4. 配置

  5. 在视图中使用

二、功能

simplejwt是Django REST Framework的 JSON Web Token 身份验证插件。 提供 JSON Web Token 身份验证后端。

三、安装
  1. 安装
pip install djangorestframework-simplejwt
四、项目配置(全局配置)
  1. simplejwt基本配置

然后,您的 django 项目必须配置为使用该库。在 settings.py中,添加 rest_framework_simplejwt.authentication.JWTAuthentication到身份验证类列表:

REST_FRAMEWORK = {
    ...
    'DEFAULT_AUTHENTICATION_CLASSES': (
        ...
        'rest_framework_simplejwt.authentication.JWTAuthentication',
    )
    ...
}
curl 
  -X POST 
  -H "Content-Type: application/json" 
  -d '{"username": "davidattenborough", "password": "boatymcboatface"}' 
  //查看token地址
  http://localhost:8000/api/token/

...
{
  "access":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoiYWNjZXNzIiwiY29sZF9zdHVmZiI6IuKYgyIsImV4cCI6MTIzNDU2LCJqdGkiOiJmZDJmOWQ1ZTFhN2M0MmU4OTQ5MzVlMzYyYmNhOGJjYSJ9.NHlztMGER7UADHZJlxNG0WSi22a2KaYSfd1S-AuT7lU",
  "refresh":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyX3BrIjoxLCJ0b2tlbl90eXBlIjoicmVmcmVzaCIsImNvbGRfc3R1ZmYiOiLimIMiLCJleHAiOjIzNDU2NywianRpIjoiZGUxMmY0ZTY3MDY4NDI3ODg5ZjE1YWMyNzcwZGEwNTEifQ.aEoAYkSJjoWH1boshQAaTkf8G3yn0kapko6HFRt7Rh4"
}
  1. 其它设置
# Django project settings.py

from datetime import timedelta
...

SIMPLE_JWT = {
    'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),
    # 设置token过期时间,上面是5分钟
    'REFRESH_TOKEN_LIFETIME': timedelta(days=1),
    # 设置token刷新过期时间,上面是1天
    'ROTATE_REFRESH_TOKENS': False,
    #
    'BLACKLIST_AFTER_ROTATION': False,
    #黑名单应用程序【https://django-rest-framework-simplejwt.readthedocs.io/en/latest/blacklist_app.html】
    'UPDATe_LAST_LOGIN': False,
	#当设置为 时True,auth_user 表中的 last_login 字段在登录时更新 (TokenObtainPairView)。
    #会更新刷新token
    'ALGORITHM': 'HS256',
    #解码方式hs256
    'SIGNING_KEY': SECRET_KEY,
    'VERIFYING_KEY': None,
    'AUDIENCE': None,
    'ISSUER': None,
    'JWK_URL': None,
    'LEEWAY': 0,

    'AUTH_HEADER_TYPES': ('Bearer',),
    #请求头中协带Authorization: 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),
}

3 . 自定义令牌声明

如果您希望自定义由TokenObtainPairView和TokenObtainSlidingView视图生成的 Web 令牌中包含的声明,请为所需视图创建一个子类,并为其相应的序列化程序创建一个子类。以下是如何自定义生成的令牌中的声明的示例TokenObtainPairView:

from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework_simplejwt.views import TokenObtainPairView

#可以改变token的值,token加密
class MyTokenObtainPairSerializer(TokenObtainPairSerializer):
    @classmethod
    def get_token(cls, user):
        token = super().get_token(user)

        # Add custom claims
        token['name'] = user.name
        # ...

        return token
    #返回数据
	def validate(self, attrs):
        data = super().validate(attrs)

        refresh = self.get_token(self.user)

        data['refresh'] = str(refresh)
        data['access'] = str(refresh.access_token)
        data['username'] = 'hrj'
        return data
    
class MyTokenObtainPairView(TokenObtainPairView):
    serializer_class = MyTokenObtainPairSerializer

请注意,上面的示例将导致自定义声明出现在视图生成的刷新和访问令牌中。这是因为get_token上面的方法为视图生成了刷新令牌,而刷新令牌又用于生成视图的访问令牌。

与标准令牌视图一样,您还需要包含指向子类视图的 url 路由。

  1. 自定义登录
    可能有时候你需要的不仅仅是通过用户名登录,还可以通过手机邮箱等其他用户信息
    views.py
from django.contrib.auth.backends import ModelBackend
from django.db.models import Q

# 记得引入用户的model
class CustomBackend(ModelBackend):
    def authenticate(self, request, username=None, password=None, **kwargs):
        # noinspection PyBroadException
        try:
            # 小编这里添加了一个手机验证,如果需要其他验证再加就ok了
            user = UserProfile.objects.get(Q(username=username) | Q(mobile=username))
            if user.check_password(password):
                return user
        except Exception as e:
            return None

上面的修改完后你还需要将修改后的类配置到setting.py中

AUTHENTICATION_BACKENDS = (
    'users.views.CustomBackend',
)
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1009579.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号