Django-REST-Framework JWT 实现SSO认证(下)
在上一篇博客中,我已经对JSON Web 认证做了简单的解释,这篇博客是续篇,若不了解,请看上一篇博客:https://www.cnblogs.com/yushenglin/p/10863184.html
一.安装djangorestframwork-jwt
二.用法
在你的settings.py
,添加JSONWebTokenAuthentication
到Django REST框架DEFAULT_AUTHENTICATION_CLASSES
。
在您urls.py
添加以下URL路由以启用通过POST获取令牌包括用户的用户名和密码。
如果您使用用户名admin和密码password123创建了用户,则可以通过在终端中执行以下操作来轻松测试端点是否正常工作。
或者,您可以使用Django REST框架支持的所有内容类型来获取身份验证令牌。例如:
现在,为了访问受保护的API,您必须包含Authorization: JWT <your_token>
标题。
刷新令牌
如果JWT_ALLOW_REFRESH
为True,则可以“刷新” 未过期的令牌以获得具有更新到期时间的全新令牌。添加这样的URL模式:
将现有令牌传递给刷新端点,如下所示:{"token": EXISTING_TOKEN}
。请注意,只有非过期的令牌才有效。JSON响应看起来与正常获取令牌端点相同{"token": NEW_TOKEN}
。
可以重复使用令牌刷新(令牌1 - >令牌2 - >令牌3),但此令牌链存储原始令牌(使用用户名/密码凭据获取)的时间,如orig_iat
。您只能保持令人耳目一新的令牌JWT_REFRESH_EXPIRATION_DELTA
。
一个典型的用例可能是一个Web应用程序,您希望让用户“登录”该站点而无需重新输入密码,或者在令牌过期之前被意外踢出。想象一下,他们有一个1小时的令牌,只是在他们还在做某事的最后一刻。使用移动设备,您可以存储用户名/密码以获取新令牌,但这在浏览器中不是一个好主意。每次用户加载页面时,您都可以检查是否存在现有的未过期令牌,如果它已接近过期,请刷新它以扩展其会话。换句话说,如果用户正在积极使用您的网站,他们可以保持他们的“会话”活着。
验证令牌
在一些微服务架构中,身份验证由单个服务处理。其他服务委派确认用户已登录此身份验证服务的责任。这通常意味着服务将从用户接收的JWT传递给身份验证服务,并在将受保护资源返回给用户之前等待JWT有效的确认。
使用验证端点在此包中支持此设置。添加以下URL模式:
将令牌传递给验证端点将返回200响应和令牌(如果有效)。否则,它将返回400 Bad Request以及识别令牌无效的错误。
其他设置
您可以覆盖一些其他设置,类似于您使用Django REST框架本身的方式。以下是所有可用的默认值。
这个包使用JSON Web Token Python实现PyJWT,并允许修改它的一些可用选项。
参数解释
JWT_SECRET_KEY
这是用于签署JWT的密钥。确保这是安全的,不共享或公开。
默认是您的项目settings.SECRET_KEY
。
JWT_GET_USER_SECRET_KEY
这是JWT_SECRET_KEY的更强大版本。它是根据用户定义的,因此如果令牌被泄露,可以由所有者轻松更改。更改此值将使给定用户的所有令牌都无法使用。值应该是一个函数,接受用户作为唯一参数并返回它的密钥。
默认是None
。
JWT_PUBLIC_KEY
这是一个类型的对象cryptography.hazmat.primitives.asymmetric.rsa.RSAPublicKey
。它将用于验证传入JWT的签名。JWT_SECRET_KEY
设置时将覆盖。阅读文档以获取更多详细信息。请注意,JWT_ALGORITHM
必须设置为一个RS256
,RS384
或RS512
。
默认是None
。
JWT_PRIVATE_KEY
这是一个类型的对象cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey
。它将用于签署JWT的签名组件。JWT_SECRET_KEY
设置时将覆盖。阅读文档以获取更多详细信息。请注意,JWT_ALGORITHM
必须设置为一个RS256
,RS384
或RS512
。
默认是None
。
JWT_ALGORITHM
可能的值是PyJWT中用于加密签名的任何支持算法。
默认是"HS256"
。
JWT_VERIFY
如果秘密是错误的,它会引发一个jwt.DecodeError,告诉你这样。您仍然可以通过设置JWT_VERIFY
to来获取有效负载False
。
默认是True
。
JWT_VERIFY_EXPIRATION
您可以通过设置JWT_VERIFY_EXPIRATION
为关闭到期时间验证False
。如果没有过期验证,JWT将永远存在,意味着攻击者可以无限期地使用泄露的令牌。
默认是True
。
JWT_LEEWAY
这允许您验证过去但不是很远的过期时间。例如,如果您有一个JWT有效负载,其过期时间设置为创建后30秒,但您知道有时您将在30秒后处理它,您可以设置10秒的余地以获得一些余量。
默认为0
秒。
JWT_EXPIRATION_DELTA
这是Python的一个实例datetime.timedelta
。将添加此项datetime.utcnow()
以设置到期时间。
默认为datetime.timedelta(seconds=300)
(5分钟)。
JWT_AUDIENCE
这是一个字符串,将根据aud
令牌的字段进行检查(如果存在)。
默认为None
(如果aud
JWT上存在则失败)。
JWT_ISSUER
这是一个字符串,将根据iss
令牌字段进行检查。
默认是None
(不要检查iss
JWT)。
JWT_ALLOW_REFRESH
启用令牌刷新功能。发行的令牌rest_framework_jwt.views.obtain_jwt_token
将有一个orig_iat
字段。默认是False
JWT_REFRESH_EXPIRATION_DELTA
限制令牌刷新,是一个datetime.timedelta
实例。这是在原始令牌之后可以刷新未来令牌的时间。
默认为datetime.timedelta(days=7)
(7天)。
JWT_PAYLOAD_HANDLER
指定自定义函数以生成令牌有效内容
JWT_PAYLOAD_GET_USER_ID_HANDLER
如果您的存储user_id
方式与默认的有效负载处理程序不同,请实现此功能以user_id
从有效负载中获取。注意:将不赞成使用JWT_PAYLOAD_GET_USERNAME_HANDLER
。
JWT_PAYLOAD_GET_USERNAME_HANDLER
如果您的存储username
方式与默认的有效负载处理程序不同,请实现此功能以username
从有效负载中获取。
JWT_RESPONSE_PAYLOAD_HANDLER
负责控制登录或刷新后返回的响应数据。覆盖以返回自定义响应,例如包括用户的序列化表示。
默认返回JWT令牌。
如:
默认是 {'token': token}
JWT_AUTH_HEADER_PREFIX
您可以修改需要与令牌一起发送的Authorization标头值前缀。默认值为JWT
。此决定是在PR #4中引入的,以允许在DRF中同时使用此程序包和OAuth2。
用于令牌和授权标头的另一个常见值是Bearer
。
默认是JWT
。
JWT_AUTH_COOKIE
如果除了Authorization标头之外还要使用http cookie作为令牌的有效传输,则可以将其设置为字符串。您在此处设置的字符串将用作cookie名称,该名称将在请求令牌时在响应标头中设置。如果设置,令牌验证过程也将查看此cookie。如果请求中存在标头和cookie,则“授权”标头优先。
默认为None
且在创建令牌时未设置cookie,在验证令牌时也不接受。
扩展 JSONWebTokenAuthentication
现在JSONWebTokenAuthentication
假设JWT将在标题中,或者如果配置了cookie(请参阅JWT_AUTH_COOKIE)。JWT规范不要求这样做(参见:拨打服务电话)。例如,JWT可能会出现在查询字符串中。在用户无法设置标题(例如HTML中的src元素)的情况下,需要在查询字符串中发送JWT的能力。
要实现此功能,用户可以编写自定义Authentication
:
建议使用BaseJSONWebTokenAuthentication
一个新的基类,它没有解析HTTP头的逻辑。
手动创建新令牌
有时您可能希望手动生成令牌,例如在创建帐户后立即将令牌返回给用户。你可以这样做:
Django-REST-Framework JWT 实现SSO认证(下)的更多相关文章
- 6 Django REST framework JWT 和登录功能实现
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证. 我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web token ( ...
- Django REST framework JWT学习
1.JWT学习 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. Json web toke ...
- Django REST Framework JWT提供的登录签发的视图
Django REST Framework JWT提供了一个视图.在我们登录的时候,会校验用户名.密码是否正确.如果信息无误,可以返回一个JWT token.就可以简单地实现了记录用户登录状态. 用法 ...
- Django-REST-Framework JWT 实现SSO认证(上)
一.什么是Django-REST-Framework? Django-REST-framework 是基于Django框架的一个web RESTful风格开发的框架,它可以实现API接口的快速开发,但 ...
- Django rest framework(1)----认证
目录 Django组件库之(一) APIView源码 Django restframework (1) ----认证 Django rest framework(2)----权限 Django ...
- Django REST Framework JWT 用户的登录注册
安装配配置 pip install djangorestframework-jwt 配置setting ########### 1.在INSTALLED_APPS中加入'rest_framework. ...
- JWT验证机制【刘新宇】【Django REST framework中使用JWT】
JWT 在用户注册或登录后,我们想记录用户的登录状态,或者为用户创建身份认证的凭证.我们不再使用Session认证机制,而使用Json Web Token认证机制. 什么是JWT Json web t ...
- Django rest framework源码分析(1)----认证
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
- Django rest framework(7)----分页
目录 Django rest framework(1)----认证 Django rest framework(2)----权限 Django rest framework(3)----节流 Djan ...
随机推荐
- bzoj 1370 Gang团伙
题目大意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足 1. 我朋友的朋友是我的朋友 2. 我敌人的敌人是我的朋友 所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个 ...
- POJ3675 Telescope 圆和多边形的交
POJ3675 用三角剖分可以轻松搞定,数据也小 随便AC. #include<iostream> #include<stdio.h> #include<stdlib.h ...
- Python print 输出不换行,只有空格
for x in open("/home/soyo/桌面/中期内容/6.txt"): print x, ,,,]: print x, #print 输出没有换行,只有空格 结果: ...
- mldonkey设置!看图(转载)
转自:http://www.nenew.net/ubuntu-mldonkey-application.html 这里不是争论区,amule和mldonkey各有各好,看个人爱好,没有高下,都是程序员 ...
- bzoj 1668: [Usaco2006 Oct]Cow Pie Treasures 馅饼里的财富【记忆化搜索+剪枝】
c[x][y]为从(x,y)到(n,m)的最大值,记忆化一下 有个剪枝是因为y只能+1所以当n-x>m-y时就算x也一直+1也是走不到(n,m)的,直接返回0即可 #include<ios ...
- bzoj 1620: [Usaco2008 Nov]Time Management 时间管理【贪心】
按s从大到小排序,逆推时间模拟工作 #include<iostream> #include<cstdio> #include<algorithm> using na ...
- 11.7NOIP模拟题
/* 有循环节 */ #include<cstdio> #include<cstring> #include<iostream> #include<algor ...
- android_app c++框架
找遍了全网,没有一个完整的可用的框架.ndk自带的android_native_app_glue确实不太好用,闭关几天,写出了一个框架.完全的消息队列调用,目前测试的主体框架是没有什么问题了,程序入口 ...
- 384 Shuffle an Array 打乱数组
打乱一个没有重复元素的数组.示例:// 以数字集合 1, 2 和 3 初始化数组.int[] nums = {1,2,3};Solution solution = new Solution(nums) ...
- 275 H-Index II H指数 II
这是 H指数 进阶问题:如果citations 是升序的会怎样?你可以优化你的算法吗? 详见:https://leetcode.com/problems/h-index-ii/description/ ...