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 Socket编程详细介绍
Mar 23 Python
Python队列的定义与使用方法示例
Jun 24 Python
CentOS7下python3.7.0安装教程
Jul 30 Python
使用python将图片按标签分入不同文件夹的方法
Dec 08 Python
pyqt5 禁止窗口最大化和禁止窗口拉伸的方法
Jun 18 Python
一篇文章弄懂Python中所有数组数据类型
Jun 23 Python
在Django model中设置多个字段联合唯一约束的实例
Jul 17 Python
计算Python Numpy向量之间的欧氏距离实例
May 22 Python
使用Keras 实现查看model weights .h5 文件的内容
Jun 09 Python
详解python 内存优化
Aug 17 Python
Python ConfigParser模块的使用示例
Oct 12 Python
几款好用的python工具库(小结)
Oct 20 Python
浅析Python中的套接字编程
Python中使用ipython的详细教程
详解Python类和对象内容
python析构函数用法及注意事项
Jun 22 #Python
Python自动化测试PO模型封装过程详解
python中的class_static的@classmethod的巧妙用法
Jun 22 #Python
Python答题卡识别并给出分数的实现代码
You might like
游戏人文件夹程序 ver 3.0
2006/07/14 Javascript
关于event.cancelBubble和event.stopPropagation()的区别介绍
2011/12/11 Javascript
web开发人员学习jQuery的6大理由及jQuery的优势介绍
2013/01/03 Javascript
JavaScript数组深拷贝和浅拷贝的两种方法
2014/04/16 Javascript
详解JavaScript时间格式化
2015/12/23 Javascript
Node.js操作Firebird数据库教程
2016/03/04 Javascript
漂亮! js实现颜色渐变效果
2016/08/12 Javascript
jQuery插件easyUI实现通过JS显示Dialog的方法
2016/09/16 Javascript
JavaScript运动框架 链式运动到完美运动(五)
2017/05/18 Javascript
vue.js移动数组位置,同时更新视图的方法
2018/03/08 Javascript
npm 更改默认全局路径以及国内镜像的方法
2018/05/16 Javascript
js之切换全屏和退出全屏实现代码实例
2019/09/09 Javascript
如何使用proxy实现一个简单完整的MVVM库的示例代码
2019/09/17 Javascript
jquery ajax 请求小技巧实例分析
2019/11/11 jQuery
JavaScript 接口原理与用法实例详解
2020/05/12 Javascript
vue实现简单计算商品价格
2020/09/14 Javascript
JavaScript实现页面高亮操作提示和蒙板
2021/01/04 Javascript
Handtrack.js库实现实时监测手部运动(推荐)
2021/02/08 Javascript
[01:19:11]Ti4 循环赛第二日 NaVi.us vs iG
2014/07/11 DOTA
python高并发异步服务器核心库forkcore使用方法
2013/11/26 Python
python实现的重启关机程序实例
2014/08/21 Python
python连接mongodb密码认证实例
2018/10/16 Python
python使用Plotly绘图工具绘制水平条形图
2020/03/25 Python
Python读写Excel表格的方法
2021/03/02 Python
Application Cache未缓存文件无法访问无法加载问题
2014/05/31 HTML / CSS
雷蛇美国官网:Razer
2020/04/03 全球购物
计算机专业应届毕业生自荐信
2013/09/26 职场文书
欢迎标语大全
2014/06/21 职场文书
过程装备与控制工程专业求职信
2014/07/02 职场文书
教师查摆问题及整改措施
2014/10/11 职场文书
广告业务员岗位职责
2015/02/13 职场文书
2015年五四青年节演讲稿
2015/03/18 职场文书
工程款催款函
2015/06/24 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
Redis 持久化 RDB 与 AOF的执行过程
2021/11/07 Redis
pandas时间序列之pd.to_datetime()的实现
2022/06/16 Python