DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

作者:PFFFei 时间:2021-03-29 18:34:12 

本文为 djangorestframework-simplejwt 使用记录。(官方文档)

 1. 安装 


pip install djangorestframework-simplejwt

 2. 使用

 创建 Django 项目及 app:


# 创建名为 simple 的工程
django-admin startproject simple

# 创建名为 users 的应用
cd simple
python manage.py startapp users

 目录结构如下:

DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

 在 `simple/settings.py` 中进行配置:


# simple/settings.py

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'users',                        # add
   'rest_framework',               # add
   'rest_framework_simplejwt',     # add
]

REST_FRAMEWORK = {                  # add
   'DEFAULT_AUTHENTICATION_CLASSES': (
       'rest_framework_simplejwt.authentication.JWTAuthentication',
   )
}

 同步数据库并创建超级用户:


# 同步数据库
python manage.py makemigrations
python manage.py migrate

# 创建超级用户
python manage.py createsuperuser

在 `simple/urls.py` 中编写路由: 


# simple/urls.py
from django.contrib import admin
from django.urls import path
from rest_framework_simplejwt.views import TokenRefreshView, TokenVerifyView, TokenObtainPairView

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

 使用 python http 工具进行接口测试:

http -f POST http://127.0.0.1:8000/login/ username=admin password=123456

DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

 3. 测试 API 接口

 在 `users/views.py` 中编写如下代码:


# users/views.py
from rest_framework import permissions
from rest_framework.response import Response
from rest_framework.views import APIView

class MyView(APIView):
   permission_classes = [permissions.IsAuthenticated]

def get(self, request, *args, **kwargs):
       return Response("Get information successfully!")

 然后在 `simple/urls.py` 中添加路由:


# simple/urls.py
from users import views    # add

urlpatterns = [
   ...
   path('info/', views.MyView.as_view()),    # add
]

 使用 python http 工具进行测试:

DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

4. 配置相关  


# settings.py

from datetime import timedelta

SIMPLE_JWT = {
   'ACCESS_TOKEN_LIFETIME': timedelta(minutes=5),  # 访问令牌的有效时间
   'REFRESH_TOKEN_LIFETIME': timedelta(days=1),    # 刷新令牌的有效时间

'ROTATE_REFRESH_TOKENS': False,     # 若为True,则刷新后新的refresh_token有更新的有效时间
   'BLACKLIST_AFTER_ROTATION': True,   # 若为True,刷新后的token将添加到黑名单中,
                                       # When True,'rest_framework_simplejwt.token_blacklist',should add to INSTALLED_APPS

'ALGORITHM': 'HS256',       # 对称算法:HS256 HS384 HS512  非对称算法:RSA
   'SIGNING_KEY': SECRET_KEY,
   'VERIFYING_KEY': None,      # if signing_key, verifying_key will be ignore.
   'AUDIENCE': None,
   'ISSUER': None,

'AUTH_HEADER_TYPES': ('Bearer',),           # Authorization: Bearer <token>
   'AUTH_HEADER_NAME': 'HTTP_AUTHORIZATION',   # if HTTP_X_ACCESS_TOKEN, X_ACCESS_TOKEN: Bearer <token>
   'USER_ID_FIELD': 'id',                      # 使用唯一不变的数据库字段,将包含在生成的令牌中以标识用户
   'USER_ID_CLAIM': 'user_id',

# 'AUTH_TOKEN_CLASSES': ('rest_framework_simplejwt.tokens.AccessToken',),   # default: access
   # 'TOKEN_TYPE_CLAIM': 'token_type',         # 用于存储令牌唯一标识符的声明名称 value:'access','sliding','refresh'
   #
   # 'JTI_CLAIM': 'jti',
   #
   # 'SLIDING_TOKEN_REFRESH_EXP_CLAIM': 'refresh_exp',     # 滑动令牌是既包含到期声明又包含刷新到期声明的令牌
   # 'SLIDING_TOKEN_LIFETIME': timedelta(minutes=5),       # 只要滑动令牌的到期声明中的时间戳未通过,就可以用来证明身份验证
   # 'SLIDING_TOKEN_REFRESH_LIFETIME': timedelta(days=1),  # path('token|refresh', TokenObtainSlidingView.as_view())
}

 5. 自定义返回 token 信息

 在 `users/serializers.py` 中编写如下代码:


# simple/serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer

class MyTokenObtainPairSerializer(TokenObtainPairSerializer):

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'] = self.user.username
       return data

 在 'users/views.py` 及 `simple/urls.py` 中编写如下代码:


# users/views.py
from rest_framework_simplejwt.views import TokenObtainPairView
from users.serializers import MyTokenObtainPairSerializer

class MyTokenObtainPairView(TokenObtainPairView):
   serializer_class = MyTokenObtainPairSerializer

# simple/urls.py
from users.views import MyTokenObtainPairView

urlpatterns = [
   ...
   # modify
   path('login/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'),
]

测试 API,可以看到返回的信息中多了 username 信息: 

http -f POST :8000/login/ username=admin password=123456

DjangoRestFramework 使用 simpleJWT 登陆认证完整记录

6. 手动颁发 token 

手动颁发 token 主要针对用户注册的情况,用户注册完之后直接返回 token。

以下代码即针对一个 user 对象手动颁发一个 token 并返回。(用户注册同理,即 user 对象为注册后获取的用户)


# users/views.py

class MyView(APIView):
   permission_classes = [permissions.IsAuthenticated]

def get(self, request, *args, **kwargs):
       return Response("Get information successfully!")

def post(self, request, *args, **kwargs):
       refresh = RefreshToken.for_user(request.user)
       content = {
           'refresh': str(refresh),
           'access': str(refresh.access_token),
       }
       return Response(content)

来源:https://blog.csdn.net/css_aaa/article/details/118097087

标签:DjangoRestFramework,simpleJWT,认证
0
投稿

猜你喜欢

  • Python定时器线程池原理详解

    2022-02-10 02:09:07
  • 在asp中使用js的encodeURIComponent方法

    2012-11-30 20:05:53
  • js 获取图像缩放后的实际宽高,位置等信息

    2024-05-22 10:41:09
  • pycharm new project变成灰色的解决方法

    2023-10-29 20:29:23
  • T-SQL篇如何防止SQL注入的解决方法

    2024-01-23 00:17:45
  • Python调用实现最小二乘法的方法详解

    2022-07-04 16:31:00
  • 对python同一个文件夹里面不同.py文件的交叉引用方法详解

    2023-12-24 00:54:27
  • JavaScript生成.xls文件的代码

    2024-04-22 22:17:34
  • JSON.stringify转换JSON时日期时间不准确的解决方法

    2014-07-20 13:25:07
  • Python定义一个Actor任务

    2022-05-30 09:24:50
  • Python中Scrapy+adbapi提高数据库写入效率实现

    2024-01-13 14:44:36
  • Vuex实现简单购物车

    2024-05-08 10:43:45
  • MYSQL 数据库命名与设计规范

    2024-01-23 04:19:45
  • Python中datetime常用时间处理方法

    2022-05-03 16:07:06
  • python列表的逆序遍历实现

    2021-08-02 02:01:28
  • IE7兼容模式与兼容视图

    2010-06-28 18:48:00
  • 在Python中通过threading模块定义和调用线程的方法

    2022-03-08 23:23:49
  • php引用地址改变变量值的问题

    2023-11-14 12:41:31
  • Mysql中实现提取字符串中的数字的自定义函数分享

    2024-01-25 10:56:20
  • PyTorch 1.0 正式版已经发布了

    2021-12-09 23:54:57
  • asp之家 网络编程 m.aspxhome.com