Python Django中的URL令牌身份验证

Python Django中的URL令牌身份验证,python,django,url,authentication,Python,Django,Url,Authentication,我正在寻找一种方式,我可以发送给用户一个url的电子邮件,将他们登录到他们的用户。这甚至不一定要过期。我已经在会议上找到了大量的材料,但这不是我想要的。我需要的是: 用户向网站提交一些内容 他们在后台做了一个记录 发送一封包含链接“site.com/&token=foobar23124123”的电子邮件 用户可以使用该链接登录(可选:下周) 有没有什么东西是我缺少的,可以帮助我的,还是我必须实施我自己的解决方案?我是否可以从Django REST框架的令牌中包含令牌 感谢您抽出时间阅读我的问

我正在寻找一种方式,我可以发送给用户一个url的电子邮件,将他们登录到他们的用户。这甚至不一定要过期。我已经在会议上找到了大量的材料,但这不是我想要的。我需要的是:

  • 用户向网站提交一些内容
  • 他们在后台做了一个记录
  • 发送一封包含链接“site.com/&token=foobar23124123”的电子邮件
  • 用户可以使用该链接登录(可选:下周)
有没有什么东西是我缺少的,可以帮助我的,还是我必须实施我自己的解决方案?我是否可以从Django REST框架的令牌中包含令牌

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


我使用的是Django 1.9和Python 2.7,我不认为有什么东西可以使用url get参数对用户进行身份验证。AFAIK Django REST框架的令牌使用HTTP头作为令牌

您可以编写自己的auth后端,这非常简单。这里有一个例子

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
现在,当您调用
authenticate
login
函数时,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')
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')