簡體   English   中英

Django中的URL令牌認證

[英]URL token authentication in Django

我正在尋找一種方法,我可以向用戶發送一封帶有網址的電子郵件,該網址會將其記錄到用戶手中。 這甚至不一定要過期。 我在會議上找到了大量的材料,但這不是我追求的。 我需要的是這個:

  • 用戶向網站提交了一些內容
  • 他們有一個在后台制作的帳戶
  • 系統會發送一封包含“site.com/&token=foobar23124123”鏈接的電子郵件
  • 用戶可以使用該鏈接登錄(可選:下周)

那里有什么我想念的東西可以幫助我,還是我必須實施自己的解決方案? 我可能只是包含來自Django REST框架的令牌的令牌嗎?

感謝您抽出寶貴時間閱讀我的問題。

我正在使用Django 1.9和Python 2.7

我不認為使用url get-parameters對用戶進行身份驗證。 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

現在,當您調用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')

更新

或者你可以使用這個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')

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM