我正在寻找一种方法,我可以向用户发送一封带有网址的电子邮件,该网址会将其记录到用户手中。这甚至不一定要过期。我在会议上找到了大量的材料,但这不是我追求的。我需要的是:
那里有什么我想念的东西可以帮助我,还是我必须实施自己的解决方案?我可能只是从Django REST框架的令牌中包含令牌吗?
感谢您抽出宝贵时间阅读我的问题。
我正在使用Django 1.9和Python 2.7
答案 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
现在,当您调用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')
<强>更新强>
或者您可以使用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')