2011-07-02 16 views
18

私はdjangoでデフォルト認証システムを使用していますが、私はOpenIDライブラリを使ってOpenID経由でユーザーを認証できます。私がしたいのは、ログインすることですが、デフォルトのdjango認証システムを使用しているようです。ユーザを認証するにはパスワードが必要です。実際にパスワードを使用せずにこれを回避する方法はありますか?パスワードなしのdjango認証

私はこのような何かをしたいのですが...

user = ... # queried the user based on the OpenID response 
user = authenticate(user) # function actually requires a username and password 
login(user) 

私はすぐにちょうどauthenticate機能をオフに残して、それは、ログインが必要とするbackendフィールドを、添付します。

+0

[パスワードなしでユーザーを手動でログイン](http://stackoverflow.com/questions/2787650/manually-logging-in-a-user-without-password)の可能な複製。 – easoncxz

答えて

2

独自のauthentication backendを作成してAUTHENTICATION_BACKENDSの設定に追加することで、簡単に修正できます。

すでにいくつかのOpenIDバックエンドが用意されています。そのため、少しの検索では、自分で作成する手間を省くことができます。

+0

私はdjango OpenIDバックエンドに問題がありました。なぜなら、Google独自のOpenIDのやり方と互換性がないからです。とにかく、私はすでにパスワードベースのバックエンドを持っていると言いましたが、厳密なOpenIDバックエンドに切り替えるのではなく、場合によってはOpenIDを使いたいだけです。 – voodoogiant

+0

@voodoogiant:キーワードの引数に応じて、認証バックエンドが選択されます。したがって、あなたのOpenIDバックエンドに 'openid_token'を、そしてあなたの通常の認証システムに' username'を 'password'で使用すると、どちらも機能します。 – Wolph

8

これはカスタムを書くことは簡単です

user.backend = 'django.contrib.auth.backends.ModelBackend' 
login(request, user) 

ユーザーがユーザーオブジェクト

+4

それは可能な解決策の1つですが、それはセッションに格納されないため、新しいタブを開いてサイトにアクセスすると、再度ログインする必要があります。 – voodoogiant

+1

これはセッションで保存され、後続のビューで機能します。あなたが設定したバックエンドはAUTHENTICATION_BACKENDS設定に含まれなければならないという唯一の問題があります。私はダウンボートを元に戻すことができたらいいのに、できない。 –

+0

@voodoogiant、私はまったく同じ問題を満たしました。つまり、セッションは保存されません。しかし、奇妙なことに、最初の2つのXHR要求はセッションIDからセッションデータを正しく取得できました。しかし、後のXHRリクエストはそうではなく、DjangoサーバはセッションIDをクッキーに設定して、応答として空の文字列にします。なぜなのかご存知ですか?それを解決する方法は? – jcyrss

19

だろうハックのビットですが、あなたが原料の束を書き換えしたくない場合は認証を削除このための認証バックエンド。あなたは、次の内容でyourapp/auth_backend.pyを作成する場合:

from django.contrib.auth.backends import ModelBackend 
from django.contrib.auth.models import User 


class PasswordlessAuthBackend(ModelBackend): 
    """Log in to Django without providing a password. 

    """ 
    def authenticate(self, username=None): 
     try: 
      return User.objects.get(username=username) 
     except User.DoesNotExist: 
      return None 

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

次に、あなたのsettings.pyに追加:

:あなたのビューで

AUTHENTICATION_BACKENDS = (
    # ... your other backends 
    'yourapp.auth_backend.PasswordlessAuthBackend', 
) 

を、あなたは今、パスワードなしで認証を呼び出すことができます

user = authenticate(username=user.username) 
login(request, user) 
+12

これはすばらしいことですが、いくつかの状況で正規の認証を使用したい場合や、他人のパスワードなしの認証を使用する場合は、新しいバックエンドが有効なユーザー名を使用したすべての試行を成功させないようにしてください。 authenticate()が呼び出されたときに試行されます。私の場合、authenticate()の呼び出し側が実際にパスワードなしの認証が機能することを確実にするために、特別なトークン引数を含める必要があります。 – Richard

関連する問題