1

サードパーティ サービス (Facebook、LinkedIn など) からの一意の ID に基づいてユーザーをログインさせるカスタム認証バックエンドを Django に実装しようとしています。一意の識別子が戻ってきたので、シームレスにログインしたいと思います。

しかし、カスタム バックエンドが機能せず、「None」が返されます。

これが私のカスタムバックエンドです:

from myapp.models import Account
from django.contrib.auth.models import User

class ThirdPartyServiceBackend(object):

    def authenticate(self,acct_id=None):
        if acct_id is not None:
            try:
                return User.objects.get(account__uniq_id=acct_id)
            except:
                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 = (
    'myproject.myapp.backends.ThirdPartyServiceBackend',
    'django.contrib.auth.backends.ModelBackend',
)

そして、これは私がviews.pyでそれを処理する方法です:

# oauth processing and everything goes here
try:
    # login and redirect to search page

    user = authenticate(acct_id=third_party_service_user_info['id'])

    if user is not None:
        auth_login(request,user)
        return HttpResponseRedirect('/')

この呼び出しはシェルで問題なく機能します。ユーザーが返されます。しかし、認証呼び出しは失敗しています - 私が間違っていることについて何か考えはありますか?

4

1 に答える 1

2

Django ドキュメントから:

ユーザーが認証されると、Django はユーザーのセッションでユーザーを認証するために使用されたバックエンドを保存し、現在認証されているユーザーへのアクセスが必要なときはいつでも、そのセッションの間同じバックエンドを再利用します。これは事実上、認証ソースがセッションごとにキャッシュされることを意味するため、AUTHENTICATION_BACKENDS を変更した場合、別の方法を使用してユーザーに再認証を強制する必要がある場合は、セッション データを消去する必要があります。これを行う簡単な方法は、Session.objects.all().delete() を実行することです。

それを試してください、私は同じ問題を抱えていましたが、それが私の修正でした。

于 2013-01-15T10:57:13.830 に答える