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 相关文章推荐
Tornado服务器中绑定域名、虚拟主机的方法
Aug 22 Python
常见的在Python中实现单例模式的三种方法
Apr 08 Python
python中通过预先编译正则表达式提高效率
Sep 25 Python
Django中针对基于类的视图添加csrf_exempt实例代码
Feb 11 Python
python中实现将多个print输出合成一个数组
Apr 19 Python
Python 运行 shell 获取输出结果的实例
Jan 07 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
Apr 22 Python
pytorch 查看cuda 版本方式
Jun 23 Python
使用PyWeChatSpy自动回复微信拍一拍功能的实现代码
Jul 02 Python
python+requests接口自动化框架的实现
Aug 31 Python
python与js主要区别点总结
Sep 13 Python
python drf各类组件的用法和作用
Jan 12 Python
浅析Python中的套接字编程
Python中使用ipython的详细教程
详解Python类和对象内容
python析构函数用法及注意事项
Jun 22 #Python
Python自动化测试PO模型封装过程详解
python中的class_static的@classmethod的巧妙用法
Jun 22 #Python
Python答题卡识别并给出分数的实现代码
You might like
IIS php环境配置PHP5 MySQL5 ZendOptimizer phpmyadmin安装与配置
2008/11/18 PHP
PHP 远程关机实现代码
2009/11/10 PHP
PHP开发需要注意的安全问题
2010/09/01 PHP
PHP编程文件处理类SplFileObject和SplFileInfo用法实例分析
2017/07/22 PHP
thinkphp5.1 框架钩子和行为用法实例分析
2020/05/25 PHP
用javascript自动显示最后更新时间
2007/03/15 Javascript
实现变速回到顶部的JavaScript代码
2011/05/09 Javascript
jQuery-onload让第一次页面加载时图片是淡入方式显示
2012/05/23 Javascript
Array.prototype.concat不是通用方法反驳[译]
2012/09/20 Javascript
jquery获取特定name所有选中的checkbox,支持IE9标准模式
2013/03/18 Javascript
jquery 面包屑导航 具体实现
2013/06/05 Javascript
jQuery提示插件alertify使用指南
2015/04/21 Javascript
JavaScript中Date.toSource()方法的使用教程
2015/06/12 Javascript
jquery 抽奖小程序实现代码
2016/10/12 Javascript
基于jQuery实现火焰灯效果导航菜单
2017/01/04 Javascript
微信小程序中吸底按钮适配iPhone X方案
2017/11/29 Javascript
Angular 向组件传递模板的两种方法
2018/02/23 Javascript
解决vue-cli创建项目的loader问题
2018/03/13 Javascript
关于JavaScript中高阶函数的魅力详解
2018/09/07 Javascript
Layui数据表格之单元格编辑方式
2019/10/26 Javascript
jQuery使用ajax传递json对象到服务端及contentType的用法示例
2020/03/12 jQuery
Python采用socket模拟TCP通讯的实现方法
2014/11/19 Python
python实现爬虫统计学校BBS男女比例之数据处理(三)
2015/12/31 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
微信小程序python用户认证的实现
2019/07/29 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
Python selenium模块实现定位过程解析
2020/07/09 Python
python上selenium的弹框操作实现
2020/07/13 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
基于HTML5实现类似微信手机摇一摇功能(计算摇动次数)
2017/07/24 HTML / CSS
汽车装潢店创业计划书范文
2014/02/05 职场文书
党员教师工作决心书
2014/03/13 职场文书
毕业生实习期转正自我鉴定
2014/09/26 职场文书
孕妇离婚协议书范本
2014/11/20 职场文书
幼儿园大班个人总结
2015/02/28 职场文书
肖申克救赎观后感
2015/06/02 职场文书