2016-04-16 17 views
1

私は自分のユーザにログインするURLをメールで送信する方法を探しています。これは必ずしも期限切れにする必要はありません。私はセッションでたくさんの資料を見つけましたが、これは私が後にしたものではありません。私に必要なのはこれです:DjangoでのURLトークン認証

  • ユーザーは、ウェブサイトに何かを提出
  • 彼らは
  • メールが「&トークン= foobar23124123 site.com/」リンクを含む送出され、バックグラウンドで行われたアカウントを持っています
  • 、ユーザが(オプション:次の週のために)そのリンクを使用してログインすることができます

が、私はそれが私を助けるだろうか、私は自分のソリューションを実装しなければならない欠けていることをそこに何かありますか?私は潜在的にちょうどDjango RESTフレームワークのトークンからトークンを含めることができますか?

私の質問を読んでいただきありがとうございます。

私は、URLを取得パラメータを使用してユーザーを認証するためのものがあるとは思わないDjangoの1.9とPython 2.7

答えて

2

を使用しています。 AFAIK Django RESTフレームワークのトークンは、トークンにHTTPヘッダーを使用します。

独自の認証バックエンドを作成できます。非常に簡単です。あなたはauthenticatelogin機能ジャンゴを呼び出す際にここでの例では、

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 

でmyproject/setting.py

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

でmyproject/backends.pyであなたのそれぞれに対してユーザーをチェックしますバックエンド。手動で(これはビュー関数である)このように、ユーザがログインすることができます。

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')