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属性以及响应状态代码-这允许对令牌的使用进行细粒度的报告。