2017-11-29 8 views
1

ウェブアプリケーションにdjango-allauthを使用してソーシャルログイン(プロバイダ-google)を実装しました。私はアプリケーションに限られたドメインだけを許可したい。以下は、私が「abc.com」ドメインとアカウントのみを許可することができるよ「HD」パラメータを使用することによりallauthDjango allauthソーシャルログイン(Google OAuth 2) - ドメインの制限リスト

settings.py

AUTHENTICATION_BACKENDS = (
    'django.contrib.auth.backends.ModelBackend', 
    'allauth.account.auth_backends.AuthenticationBackend', 
) 
SOCIALACCOUNT_ADAPTER = 'mbaweb.socialaccount_adapter.NoNewUsersAccountAdapter' 

LOGIN_REDIRECT_URL = "/" 

SOCIALACCOUNT_PROVIDERS = { 
    'google': { 
     'SCOPE': [ 
      'profile', 
      'email', 
     ], 
     'AUTH_PARAMS': { 
      'access_type': 'online', 
      'hd': 'abc.com' 
     } 
    } 
} 

ための私の設定です。他のすべてのドメインアカウントを制限します。

しかし、私の要件は、例えばアプリケーション

にドメインのリストを可能にすることです: - allowed_domains = ['abc.com', 'xyz.co.in', 'pqr.com']

ことは、これを達成する方法はありますか?

ありがとうございました。

+0

settings.py – Satendra

+0

Google固有のすべての認証設定で、 'ALLOWED_HOSTS = ['abc.com'、 'def.com'、...]'を使うことができます:http://django-allauth.readthedocs .io/en/latest/providers.html#google 「AUTH_PARAMS」から 'hd'キーを削除すると問題が解決するはずです。 –

+0

hdを削除すると、アプリケーションにすべてのドメインが許可されます –

答えて

0

私が使用するアプローチは、SocialAccountAdapterというカスタムを書き込んで、特定の条件でis_open_for_signupに対して を返します。

設定では、これを追加します。

SOCIALACCOUNT_ADAPTER = 'myapp.auth.adapters.SocialAccountAdapter' 

を明らかに、あなたのコードに合わせてパスmyapp.authを変更します。適切なadapters.pyファイルで

、このような何かを追加:

from allauth.socialaccount.adapter import DefaultSocialAccountAdapter 


def email_domain(email): 
    """Extracts the domain from an email address. 

    Warning: this is simplified and you may want a true email address parser. 
    """ 
    return email.split('@')[-1] 


# Note: this would be better in settings.py 
allowed_signup_domains = [ 
    'abc.com', 
    'seconddomain.com', 
    'etcetc.com', 
] 


class SocialAccountAdapter(DefaultSocialAccountAdapter): 

    def is_open_for_signup(self, request, sociallogin): 
     if email_domain(sociallogin.user.email) not in allowed_signup_domains: 
      return False 
     return super(SocialAccountAdapter, self).is_open_for_signup(request, sociallogin) 

アプローチは完璧ではないですが、仕事をしていませんし、ユーザーにやや「優雅な」失敗を与えます。

+0

私は今のところ同じ方法を使用しています。エラーメッセージが表示されますが、使用はアカウントにログインします。ユーザーが他のアカウントを使用してログインしたい場合は、既にログインしているアカウントに手動で行ってログアウトする必要があります。その後、別のアカウントでログインします。また、エラーメッセージが表示されると、urlはoauth2コールバックURLになります。ユーザーがページを更新すると、混乱が増えます。 –

+0

ユーザーが無効なアカウントにログインする前に、これを制御したいと思います。 –

+0

私は再テストして、 'is_open_for_signup()'メソッドがFalseを返すと、そのユーザーはログインしていないことを確認し、そのユーザーの_no_アカウントが作成されていることを確認します。コールバックURLで停止し、そのページをリロードすると「ソーシャルネットワーク障害」と表示されます。完璧ではありませんが機能的でクリアです。 –

関連する問題