Django中的URL令牌认证

时间:2016-04-16 18:49:41

标签: python django url authentication

我正在寻找一种方法,我可以向用户发送一封带有网址的电子邮件,该网址会将其记录到用户手中。这甚至不一定要过期。我在会议上找到了大量的材料,但这不是我追求的。我需要的是:

  • 用户向网站提交内容
  • 他们有一个在后台制作的帐户
  • 发送一封包含“site.com/&token=foobar23124123”链接的电子邮件
  • 用户可以使用该链接登录(可选:下周)

那里有什么我想念的东西可以帮助我,还是我必须实施自己的解决方案?我可能只是从Django REST框架的令牌中包含令牌吗?

感谢您抽出宝贵时间阅读我的问题。

我正在使用Django 1.9和Python 2.7

1 个答案:

答案 0 :(得分:3)

我认为使用url get-parameters对用户进行身份验证并不存在。 AFAIK Django REST框架的令牌使用标头的HTTP标头。

您可以编写自己的身份验证后端,这很容易。这是一个例子

的myproject / setting.py

AUTHENTICATION_BACKENDS = [
    'myproject.backends.UrlTokenBackend',
    'django.contrib.auth.backends.ModelBackend'
]

的myproject / backends.py

class UrlTokenBackend(ModelBackend):
    def authenticate(self, token):
        try:
            user = User.objects.get(token=token)
        except User.DoesNotExist:
            return None

        if not user.is_active:
            return None

        return user

    def get_user(self, user_id):
        try:
            return User.objects.get(pk=user_id)
        except User.DoesNotExist:
            return None

现在,当您调用authenticatelogin函数时,Django会针对您的每个后端检查您的用户。您可以像这样手动登录用户(这是视图功能):

from django.contrib.auth import authenticate, login

def user_auth(request):
    token = request.GET.get('token')
    user = authenticate(token=token)
    login(request, user)

    return redirect('index')

<强>更新

或者您可以使用this hack并仅执行此操作(不使用自定义后端):

def user_auth(request):
    token = request.GET.get('token')
    user = User.objects.get(token=token)
    user.backend = 'django.contrib.auth.backends.ModelBackend'
    login(request, user)

    return redirect('index')