Django-REST-Framework JWT 实现SSO认证(下)

摘要:
或者,您可以使用DjangoREST框架支持的所有内容类型来获取身份验证令牌。其他服务委派确认用户已登录此身份验证服务的责任。参数解释JWT_SECRET_KEY这是用于签署JWT的密钥。JWT_GET_USER_SECRET_KEY这是JWT_SECRET_KEY的更强大版本。JWT_SECRET_KEY设置时将覆盖。请注意,JWT_ALGORITHM必须设置为一个RS256,RS384或RS512。将添加此项datetime.utcnow()以设置到期时间。JWT_ISSUER这是一个字符串,将根据iss令牌字段进行检查。JWT_ALLOW_REFRESH启用令牌刷新功能。默认是FalseJWT_REFRESH_EXPIRATION_DELTA限制令牌刷新,是一个datetime.timedelta实例。JWT_RESPONSE_PAYLOAD_HANDLER负责控制登录或刷新后返回的响应数据。

在上一篇博客中,我已经对JSON Web 认证做了简单的解释,这篇博客是续篇,若不了解,请看上一篇博客:https://www.cnblogs.com/yushenglin/p/10863184.html

一.安装djangorestframwork-jwt

Django-REST-Framework JWT 实现SSO认证(下)第1张

二.用法

在你的settings.py,添加JSONWebTokenAuthentication到Django REST框架DEFAULT_AUTHENTICATION_CLASSES

Django-REST-Framework JWT 实现SSO认证(下)第2张

在您urls.py添加以下URL路由以启用通过POST获取令牌包括用户的用户名和密码。

Django-REST-Framework JWT 实现SSO认证(下)第3张

如果您使用用户名admin和密码password123创建了用户,则可以通过在终端中执行以下操作来轻松测试端点是否正常工作

Django-REST-Framework JWT 实现SSO认证(下)第4张

或者,您可以使用Django REST框架支持的所有内容类型来获取身份验证令牌。例如:

Django-REST-Framework JWT 实现SSO认证(下)第5张

现在,为了访问受保护的API,您必须包含Authorization: JWT <your_token>标题。

Django-REST-Framework JWT 实现SSO认证(下)第6张

刷新令牌

如果JWT_ALLOW_REFRESH为True,则可以“刷新”未过期的令牌以获得具有更新到期时间的全新令牌。添加这样的URL模式:

Django-REST-Framework JWT 实现SSO认证(下)第7张

将现有令牌传递给刷新端点,如下所示:{"token": EXISTING_TOKEN}请注意,只有非过期的令牌才有效。JSON响应看起来与正常获取令牌端点相同{"token": NEW_TOKEN}

Django-REST-Framework JWT 实现SSO认证(下)第8张

可以重复使用令牌刷新(令牌1 - >令牌2 - >令牌3),但此令牌链存储原始令牌(使用用户名/密码凭据获取)的时间,如orig_iat您只能保持令人耳目一新的令牌JWT_REFRESH_EXPIRATION_DELTA

一个典型的用例可能是一个Web应用程序,您希望让用户“登录”该站点而无需重新输入密码,或者在令牌过期之前被意外踢出。想象一下,他们有一个1小时的令牌,只是在他们还在做某事的最后一刻。使用移动设备,您可以存储用户名/密码以获取新令牌,但这在浏览器中不是一个好主意。每次用户加载页面时,您都可以检查是否存在现有的未过期令牌,如果它已接近过期,请刷新它以扩展其会话。换句话说,如果用户正在积极使用您的网站,他们可以保持他们的“会话”活着。

验证令牌

在一些微服务架构中,身份验证由单个服务处理。其他服务委派确认用户已登录此身份验证服务的责任。这通常意味着服务将从用户接收的JWT传递给身份验证服务,并在将受保护资源返回给用户之前等待JWT有效的确认。

使用验证端点在此包中支持此设置。添加以下URL模式:

Django-REST-Framework JWT 实现SSO认证(下)第9张

将令牌传递给验证端点将返回200响应和令牌(如果有效)。否则,它将返回400 Bad Request以及识别令牌无效的错误。

Django-REST-Framework JWT 实现SSO认证(下)第10张

其他设置

您可以覆盖一些其他设置,类似于您使用Django REST框架本身的方式。以下是所有可用的默认值。

Django-REST-Framework JWT 实现SSO认证(下)第11张

这个包使用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必须设置为一个RS256RS384RS512

默认是None

JWT_PRIVATE_KEY

这是一个类型的对象cryptography.hazmat.primitives.asymmetric.rsa.RSAPrivateKey它将用于签署JWT的签名组件。JWT_SECRET_KEY设置时将覆盖阅读文档以获取更多详细信息。请注意,JWT_ALGORITHM必须设置为一个RS256RS384RS512

默认是None

JWT_ALGORITHM

可能的值是PyJWT中用于加密签名的任何支持算法

默认是"HS256"

JWT_VERIFY

如果秘密是错误的,它会引发一个jwt.DecodeError,告诉你这样。您仍然可以通过设置JWT_VERIFYto来获取有效负载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(如果audJWT上存在失败)。

JWT_ISSUER

这是一个字符串,将根据iss令牌字段进行检查

默认是None(不要检查issJWT)。

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令牌。

如:

Django-REST-Framework JWT 实现SSO认证(下)第12张

默认是{'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

Django-REST-Framework JWT 实现SSO认证(下)第13张

建议使用BaseJSONWebTokenAuthentication一个新的基类,它没有解析HTTP头的逻辑。

手动创建新令牌

有时您可能希望手动生成令牌,例如在创建帐户后立即将令牌返回给用户。你可以这样做:

Django-REST-Framework JWT 实现SSO认证(下)第14张

免责声明:文章转载自《Django-REST-Framework JWT 实现SSO认证(下)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇4.4 移除控制标记ubuntu下禁用和恢复触摸板下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

【jmeter】JMeter处理Cookie与Session

有些网站保存信息是使用Cookie,有些则是使用Session.对于这两种方式,JMeter都给予一定的支持。 1.Cookie 添加方式:线程组-配置元件-HTTP Cookie 管理器,如下图: 2.Session 添加方式:线程组-前置处理器 -HTTP URL 重写修饰符,如下图: 有些tomcat的session实现不是通过cookie的,而...

什么是Cookie 隔离?

或者说:请求资源的时候不要让它带cookie怎么做 如果静态文件都放在主域名下,那静态文件请求的时候都带有的cookie的数据提交给server的,非常浪费流量, 所以不如隔离开。 因为cookie有域的限制,因此不能跨域提交请求,故使用非主要域名的时候,请求头中就不会带有cookie数据, 这样可以降低请求头的大小,降低请求时间,从而达到降低整体请求延...

Django学习笔记之安全

CSRF攻击 CSRF攻击概述 CSRF(Cross Site Request Forgery, 跨站域请求伪造)是一种网络的攻击方式,它在 2007 年曾被列为互联网 20 大安全隐患之一。其他安全隐患,比如 SQL 脚本注入,跨站域脚本攻击等在近年来已经逐渐为众人熟知,很多网站也都针对他们进行了防御。然而,对于大多数人来说,CSRF 却依然是一个陌生的...

.Net Core官方的 JWT 授权验证

什么是JWT? JSON Web令牌(JWT)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息作为JSON对象。由于此信息是经过数字签名的,因此可以被验证和信任。可以使用秘密(使用HMAC算法)或使用RSA或ECDSA的公钥/私钥对对JWT进行签名。 尽管可以对JWT进行加密以提供双方之间的保密性,但我们将重...

postman (一)

一、基本介绍 Postman一款非常流行的API调试工具;其实,开发人员用的更多。因为测试人员做接口测试会有更多选择,Jmeter、soapUI等。不过,对于开发过程中去调试接口,Postman确实足够的简单方便,而且功能强大。 诞生 Postman 诞生于 2013 年,一开始只是 Abhinav Asthana 着手于解决 API 测试的工具,随着这个...

重新整理 .net core 实践篇————网关中的身份签名认证[三十七]

前言 简单整理一下网关中的jwt,jwt用于授权认证的,其实关于认证授权这块https://www.cnblogs.com/aoximin/p/12268520.html 这个链接的时候就已经写了,当然只写到了4节,后面有10节没有写,是相对复杂的场景,后续会补齐。 正文 jwt 是json web tokens,是一种支持前面的数据结构。 至于什么是jw...