Django创建非auth单用途访问令牌

时间:2016-02-16 12:52:51

标签: python django

我正在创建一个应用,用户可以在其中添加评论到特定的地方。

我正在创建一个系统,在该系统中,每次审核都会在提交时进行,并会通过点击两个不同的方式向能够批准或拒绝审核的网站管理员发送电子邮件链接。

这些链接将映射到特定的Django视图函数,该函数将接收被批准/拒绝的特定审阅的ID,以及用于确保链接真实性的访问令牌。

我到处搜索,我只能找到" Auth令牌"用于登录用户,这不是我想要的。

我想到的一种方法是创建审核和表达ID的哈希值,在数据库中存储一个关于是否已访问此令牌的字段。但是这个解决方案看起来并不是很干净,而且#34;

任何生成这些令牌的方式?

1 个答案:

答案 0 :(得分:0)

Django附带了一个功能,您可以使用它:
https://docs.djangoproject.com/en/1.9/topics/signing/

如果我正确理解了您的用例,您可以使用对象ID作为要签名的值,然后创建一个接受签名值作为arg的视图,从中可以派生id,同时确保链接是真实的。

例如

from django.core import signing
from django.core.urlresolvers import reverse
from django.http import HttpResponseBadRequest
from django.shortcuts import get_object_or_404


signer = Signer()


def make_review_links(review_id):
    # a function to generate the links you can use in the email template
    signed = signer.sign(str(review_id))
    approve_link = reverse('approve_review', args=[review_id])
    reject_link = reverse('reject_review', args=[review_id])
    return approve_link, reject_link


def approve_review(request, signed):
    try:
        review_id = signer.unsign(value)
    except signing.BadSignature:
        return HttpResponseBadRequest("Invalid link")
    review = get_object_or_404(Review, pk=review_id)
    # approval code here

我确实同意你的问题的评论者,作为改变服务器上的数据的动作,这些应该是POST请求。模式与上面的模式相同,但不是从网址arg获取signed值的视图,而是从request.POST获取它。您甚至可能想要使用表格。

显然,只能通过HTML电子邮件从电子邮件进行POST。要支持文本电子邮件,您应该链接到一个中间页面(传递签名值),该页面显示带有批准/拒绝按钮的表单,该按钮应将签名值作为隐藏字段发布到上面的视图中。