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中Flask框架简单入门实例
Mar 21 Python
Python实现的简单hangman游戏实例
Jun 28 Python
Python实现TCP协议下的端口映射功能的脚本程序示例
Jun 14 Python
Python生成数字图片代码分享
Oct 31 Python
python中print()函数的“,”与java中System.out.print()函数中的“+”功能详解
Nov 24 Python
python批量读取txt文件为DataFrame的方法
Apr 03 Python
python 将列表中的字符串连接成一个长路径的方法
Oct 23 Python
Django实现学生管理系统
Feb 26 Python
pytorch ImageFolder的覆写实例
Feb 20 Python
python 使用cycle构造无限循环迭代器
Dec 02 Python
python多次执行绘制条形图
Apr 20 Python
利用Python脚本写端口扫描器socket,python-nmap
Jul 23 Python
浅析Python中的套接字编程
Python中使用ipython的详细教程
详解Python类和对象内容
python析构函数用法及注意事项
Jun 22 #Python
Python自动化测试PO模型封装过程详解
python中的class_static的@classmethod的巧妙用法
Jun 22 #Python
Python答题卡识别并给出分数的实现代码
You might like
利用谷歌 Translate API制作自己的翻译脚本
2014/06/04 PHP
PHP实现图片旋转效果实例代码
2014/10/01 PHP
PHP使用glob函数遍历目录或文件夹的方法
2014/12/16 PHP
在Mac OS下搭建LNMP开发环境的步骤详解
2017/03/10 PHP
Extjs学习笔记之九 数据模型(上)
2010/01/11 Javascript
jQuery EasyUI API 中文文档 - EasyLoader 加载器
2011/09/29 Javascript
JavaScript面向对象之Prototypes和继承
2012/07/12 Javascript
Javascript设置对象的ReadOnly属性(示例代码)
2013/12/25 Javascript
js中call与apply的用法小结
2013/12/28 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
2015/03/01 Javascript
jQuery实现鼠标滑过预览图片大图效果的方法
2017/04/26 jQuery
Vue波纹按钮组件制作
2018/04/30 Javascript
基于vue-cli 路由 实现类似tab切换效果(vue 2.0)
2019/05/08 Javascript
vue下的@change事件的实现
2019/10/25 Javascript
JS原形与原型链深入详解
2020/05/09 Javascript
[02:29]DOTA2英雄基础教程 陈
2013/12/17 DOTA
[01:12:27]EG vs Secret 2018国际邀请赛淘汰赛BO3 第二场 8.22
2018/08/23 DOTA
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
python使用邻接矩阵构造图代码示例
2017/11/10 Python
Python内置模块ConfigParser实现配置读写功能的方法
2018/02/12 Python
解决PyCharm的Python.exe已经停止工作的问题
2018/11/29 Python
keras 权重保存和权重载入方式
2020/05/21 Python
Html5自定义字体解决方法
2019/10/09 HTML / CSS
一道Delphi上机题
2012/06/04 面试题
物流经理自我评价
2013/09/23 职场文书
数学国培研修感言
2014/02/13 职场文书
遗体告别仪式主持词
2014/03/20 职场文书
访谈节目策划方案
2014/05/15 职场文书
国企干部对照检查材料
2014/08/22 职场文书
银行授权委托书样本
2014/10/13 职场文书
跑出一片天观后感
2015/06/08 职场文书
工作简报怎么写
2015/07/21 职场文书
导游词之海南天涯海角
2019/12/05 职场文书
Python数据清洗工具之Numpy的基本操作
2021/04/22 Python
美国运营商 T-Mobile 以 117.83Mb/s 的速度排第一位
2022/04/21 数码科技
HTML5页面打开微信小程序功能实现
2022/09/23 HTML / CSS