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
目录结构如下:
在 `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
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 工具进行测试:
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
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


猜你喜欢
- 本文实例讲述了Python实现连接MySql数据库及增删改查操作。分享给大家供大家参考,具体如下:在本文中介绍 Python3 使用PyMy
- 在编程时你一定碰到过时间触发的事件,在VB中有timer控件,而ASP中没有,假如你要不停地查询数据库来等待一个返回结果的话,我想你一定知道
- 译注:前两天看到一篇不错的英文文章,叫做 How browsers work,该文概要的介绍了浏览器从头到尾的工作机制,包括HTML等的解析
- 这是个郁闷的问题。主级获得ID列表 select ID from FS_SD_Address where PID=0
- Python在程序并行化方面多少有些声名狼藉。撇开技术上的问题,例如线程的实现和GIL,我觉得错误的教学指导才是主要问题。常见的经典Pyth
- 这篇文章主要介绍了通过实例解析python描述符原理作用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的
- 在使用列表、数组和矩阵的过程中,经常需要相互转换。特此总结相互间转换的过程及结果,供大家参考。第三方包:numpy
- 在Web标准中的页面布局是使用Div配合CSS来实现的。这其中最常用到的就是使整个页面水平居中的效果,这是在页面布局中基本,也是最应该首先掌
- 1、加字段:alter table 表名 ADD 字段名 类型;eg:alter table sys_cwzd ADD SCCLLJ VAR
- 爬取网页的流程一般如下:选着要爬的网址(url)使用 python 登录上这个网址(urlopen、requests 等)读取网页信息(re
- 第一部分:判断两张图片是否相同要查找重复的图片,必然绕不开判断两张图片是否相同。判断两张图片简单呀!图片可以看成数组,比较两个数组是否相等不
- 下半年毕业季,各种毕业设计纷涌而至,虽然学校教了Python,但是我相信各位肯定没有认真学,做作业就懵逼的那种~所以我都给大家准备好了!各种
- OpenCVOpenCV 是计算机视觉领域最受欢迎的开源库,起初它由 C/C ++ 编写,现在用 Python 也能使用。OpenCV 可以
- 字符串在Python内部的表示是Unicode编码,因此,在做编码转换时,通常需要以Unicode作为中间编码,即先将其他编码的字符串解码(
- 布局管理就是管理图形窗口中各个部件的位置和排列。图形窗口中的大量部件也需要通过布局管理,对部件进行整理分组、排列定位,才能使界面整齐有序、美
- MySQL:Unsafe statement written to the binary log using statement format since BINLOG_FORMAT = STATEM1:错误日志大量错误150602 14:40:02 [Warning] Unsafe statement written to the bi
- YOLOv5的Backbone设计在上一篇文章《YOLOV5的anchor设定》中我们讨论了anchor的产生原理和检测过程,对YOLOv5
- 如下所示:#!/usr/bin/python2.6 # -*- coding: utf-8 -*- import time cl
- 方法1:import requestsurl = "http://www.xxxx.net/login"#参数拼凑,附件
- 这篇文章主要介绍了PYTHON发送邮件YAGMAIL的简单实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价