11

私はDjangoの初心者です。django-allauth を使用して、シングル クリック サインインをセットアップしました。Google API コンソールからドメイン資格情報 (client_id と secret_key) を取得しました。しかし、問題は、django-allauth を使用すると、任意の Google アカウントからログインできる一方で、メール アドレスを自分のドメイン(@gmail.com ではなく @example.com) に制限したいことです。

django-social-auth には、このためのホワイト リスト ドメイン パラメータがあります。この情報を allauth に含めるにはどうすればよいですか? django-social-auth に何時間も費やした後、django-allauth のセットアップがはるかに簡単であることがわかりました

どんな助けでも大歓迎です。

4

3 に答える 3

17

私自身の質問に答える-

あなたがしたいことは、ユーザーがソーシャル アカウント プロバイダーによって認証された後、ユーザーがプロファイル ページに進む前に、ログインを停止することです。あなたはでこれを行うことができます

allauth /socialaccount/adaptor.pyのDefaultSocialAccountAdapterクラスのpre_social_login メソッド

ユーザーがソーシャル プロバイダーを介して認証に成功した直後で、ログインが実際に処理される前 (および pre_social_login シグナルが発行される前) に呼び出されます。このフックを使用して介入できます。たとえば、ImmediateHttpResponse を発生させてログインを中止できます。アダプタ フックとシグナルの両方が必要なのはなぜですか? たとえば、シグナル ハンドラ内からのフローに介入することは良くありません。複数のハンドラがアクティブで、未定の順序で実行される可能性があります。

次のようなことをします

from allauth.socialaccount.adaptor import DefaultSocialAccountAdapter

class MySocialAccount(DefaultSocialAccountAdapter):
    def pre_social_login(self, request, sociallogin):
        u = sociallogin.account.user
        if not u.email.split('@')[1] == "example.com"
            raise ImmediateHttpResponse(render_to_response('error.html'))

これは正確な実装ではありませんが、このようなものが機能します。

于 2013-10-07T18:49:26.520 に答える
0

allauth の allauth.socialaccount.forms.SignupForm を上書きし、サインアップ プロセス中にドメインをチェックする行で何かを行うことができます。Discalmer: これはすべてテストなしで書かれていますが、その行の何かが機能するはずです。

# settings.py
# not necesarry, but it would be a smart way to go instead of hardcoding it
ALLOWED_DOMAIN = 'example.com'

.

# forms.py
from django.conf import settings
from allauth.socialaccount.forms import SignupForm


class MySignupForm(SignupForm):

    def clean_email(self):
        data = self.cleaned_data['email']
        if data.split('@')[1].lower() == settings.ALLOWED_DOMAIN:
            raise forms.ValidationError(_(u'domena!'))
        return data

あなたのURLでallauthのデフォルトを上書きします(これをdjango-allauthのインクルードの前に置きます)

# urls.py

from allauth.socialaccount.views import SignupView
from .forms import MySignupForm


urlpatterns = patterns('',
    # ...
    url(r"^social/signup/$", SignupView.as_view(form_class=MySignupForm), name="account_signup"),
    # ...
)

「^social/signup/$」についてはよくわかりません。もう一度確認してください。

于 2013-10-03T08:40:15.037 に答える