django应用程序,使用jwt管理到受保护url的一次性和过期链接。

django-jwt-expiringlinks的Python项目详细描述


django应用程序,使用jwt管理到受保护url的一次性和过期链接。

用例

此应用程序的主要用例是在- 基于请求,无需先登录站点。

典型的例子是从邮件列表中取消订阅- 您希望能够识别用户并处理请求, 但要求用户先登录会带来一个障碍。

使用jwt,我们可以“预认证”对url的访问。

假设

这不是一个通用的链接生成应用程序-它有一些隐含的 内置假设:

  • 链接正在发送给单个用户
  • 收件人是已知的django用户
  • 生成的令牌仅对初始请求进行身份验证
  • 令牌将not登录用户
  • 链接不敏感,并且不包含敏感数据

实施

所使用的底层技术是jwt-有关更多信息,请参见jwt.io 具体细节。总结是,它可以用于基于任意json负载生成base64编码和签名的令牌。该签名用于确保有效负载未被篡改。有效负载本身不加密,任何人都可以解码,因此确保不包含敏感数据。(注意:您可以对令牌进行加密,但基本假设是您不发送敏感数据,您只需确保接收的数据与发送的数据相同即可。)

django中的实现包括两个部分:在离开应用程序时将令牌添加到url(例如,在电子邮件中),然后在有人单击链接并返回到站点时验证令牌。

为了添加令牌,您需要创建一个新的requestToken对象,并且 然后对其调用encode方法。这将返回3部分签名的jwt (header.payload.signature)。您需要用 收件人User,和目标url-以确保仅使用令牌 访问预期的端点。

。代码::python

>>> from django_jwt.models import RequestToken
>>> # create a new RequestToken, and encode the contents
>>> token = RequestToken.objects.create_token(
...     user=User.objects.filter(...),
...     target_url=reverse('foobar')
... ).encode()
>>> token
1234567.qwertyuiop.zxcvbnm
>>>

现在,您有一个绑定到标记集url的标记和一个预期的收件人。 如果用户(任何user-remmember,我们是not正在验证最终用户)单击此url,他们将作为未经验证的用户到达端点。如果url需要身份验证,请求将失败,因为用户尚未进行身份验证。

为了使用jwt而不是完全身份验证,我们必须在view函数中添加一个decorator来扩展令牌,验证它(防止篡改,并符合令牌负载的“not before time”和“expiration time”属性),然后设置用户。

decorator执行一个更重要的任务,在函数运行之后-它记录令牌的使用-从请求中提取源IP和用户代理(用于审核目的),并更新令牌use_count属性以及响应状态代码-这允许对令牌的使用进行细粒度的报告。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
java楼梯的最大高度   java Jackson从1.7.1更新到2.8.6 JsonTypeInfo子类型反序列化   Spring WebApp中的java JPA异常处理   java在SwingWorker(doInBackground)中从WorkerThread调用多个方法?   java Android Studio构建到jar   java是添加多个按钮组的更有效方法   java MySQL JDBC连接池最大大小   java如何防止元素<Integer>变成元素<Object>   Java:处理大型XML文件提取数据而不编写状态自动机?   SpringBoot和React Web应用程序中CAS的java重定向问题   需要java算法方面的帮助吗   java在JDK 16中使用PowerMock   java异常错误本机方法签名   在Java Android中将JSON映射到数组/对象   如何打开一个窗口。java程序中的dat文件   java应用程序引擎+Maven+热插拔   java Moxy的getValueByXPath为除根元素以外的所有元素返回null