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


Posted in Python onJune 22, 2021

本文为 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)

到此这篇关于DjangoRestFramework 使用 simpleJWT 登陆认证完整记录的文章就介绍到这了,更多相关DjangoRestFramework登陆认证内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
Python读写Json涉及到中文的处理方法
Sep 12 Python
Python网络爬虫与信息提取(实例讲解)
Aug 29 Python
python针对不定分隔符切割提取字符串的方法
Oct 26 Python
Python Pywavelet 小波阈值实例
Jan 09 Python
对python多线程中互斥锁Threading.Lock的简单应用详解
Jan 11 Python
浅谈python函数调用返回两个或多个变量的方法
Jan 23 Python
python使用装饰器作日志处理的方法
Jul 11 Python
python RC4加密操作示例【测试可用】
Sep 26 Python
PyQt5高级界面控件之QTableWidget的具体使用方法
Feb 23 Python
Python GUI编程学习笔记之tkinter控件的介绍及基本使用方法详解
Mar 30 Python
详解python tkinter包获取本地绝对路径(以获取图片并展示)
Sep 04 Python
python如何实现递归转非递归
Feb 25 Python
浅析Python中的套接字编程
Python中使用ipython的详细教程
详解Python类和对象内容
python析构函数用法及注意事项
Jun 22 #Python
Python自动化测试PO模型封装过程详解
python中的class_static的@classmethod的巧妙用法
Jun 22 #Python
Python答题卡识别并给出分数的实现代码
You might like
异世界新番又来了,同样是从零开始,男主的年龄降到5岁
2020/04/09 日漫
第九节--绑定
2006/11/16 PHP
PHP魔术引号所带来的安全问题分析
2014/07/15 PHP
[原创]php逐行读取txt文件写入数组的方法
2015/07/02 PHP
iOS10推送通知开发教程
2016/09/19 PHP
PHP面向对象继承用法详解(优化与减少代码重复)
2016/12/02 PHP
Ext JS Grid在IE6 下宽度的问题解决方法
2009/02/15 Javascript
基于jquery的设置页面文本框 只能输入数字的实现代码
2011/04/19 Javascript
JS和jquery获取各种屏幕的宽度和高度的代码
2013/08/02 Javascript
javascript制作的滑动图片菜单
2015/05/15 Javascript
JS中input表单隐藏域及其使用方法
2017/02/13 Javascript
jQuery实现的背景颜色渐变动画效果示例
2017/03/24 jQuery
ES6扩展运算符的用途实例详解
2017/08/20 Javascript
nodeJS服务器的创建和重新启动的实现方法
2018/05/12 NodeJs
详解vue指令与$nextTick 操作DOM的不同之处
2018/08/02 Javascript
JS+HTML5 canvas绘制验证码示例
2018/12/05 Javascript
JS实现换肤功能的方法实例详解
2019/01/30 Javascript
小程序实现搜索界面 小程序实现推荐搜索列表效果
2019/05/18 Javascript
微信小程序实现文件、图片上传功能
2020/08/18 Javascript
详解JavaScript中的坐标和距离
2019/05/27 Javascript
Vue-cli3.X使用px2 rem遇到的问题及解决方法
2019/08/08 Javascript
nodejs nedb 封装库与使用方法示例
2020/02/06 NodeJs
javascript 设计模式之享元模式原理与应用详解
2020/04/08 Javascript
haskell实现多线程服务器实例代码
2013/11/26 Python
Python中的列表生成式与生成器学习教程
2016/03/13 Python
TensorFlow2.1.0最新版本安装详细教程
2020/04/08 Python
css3 iphone玻璃透明气泡完美实现
2013/03/20 HTML / CSS
html5中valid、invalid、required的定义
2014/02/21 HTML / CSS
英国女性时尚鞋类的潮流制造者:Koi Footwear
2018/10/19 全球购物
毕业自荐书
2013/12/09 职场文书
优秀应届生求职信
2014/06/16 职场文书
新文化运动的基本口号
2014/06/21 职场文书
中秋节活动总结
2014/08/29 职场文书
护士长2014年度工作总结
2014/11/11 职场文书
MySQL命令行操作时的编码问题详解
2021/04/14 MySQL
Netflix《海贼王》真人版剧集多张片场照曝光
2022/04/04 日漫