После (много?) Исследований я нашел способ сделать это.
Возобновление: я хочу, чтобы только письма из списка доменов (предоставленных Google) могли регистрироваться на моем сайте: example1@domain1.com, example2@another.domain.com
Вы можете найти основные шаги для входа в систему с помощью Google здесь и здесь
Выполнив эти шаги, вы сможете войти в систему с любого аккаунта Google, Facebook, Twitter, независимо от его домена.
Следующим шагом является определение следующей переменной в вашем settings.py
SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = ['domain1.edu.com', 'domain2.edu.com']
Это позволит отфильтровать домены, которые вы хотите зарегистрировать.
Вы могли бы также настроить следующие, хотя они не имеют отношения ко мне прямо сейчас, я думаю, что лучше иметь их
SOCIAL_AUTH_LOGIN_ERROR_URL = '/user/error/'
SOCIAL_AUTH_RAISE_EXCEPTIONS = False
URL-адрес ошибки определяет путь, по которому приложение должно перенаправляться в случае ошибки при входе в систему
Мое решение начинается здесь:
когда система обнаруживает, что вашему домену разрешено , все должно работать хорошо, но когда обнаруживается, что вашего домена нет в белом списке, выдается исключение AuthForbidden (да, даже когда я определил, что он не должен вызывать исключения с переменной выше). Поскольку исключение не является ошибкой, оно не перейдет к SOCIAL_AUTH_LOGIN_ERROR_URL, и вы получите экран исключения.
Решение - создать собственный метод конвейера. Вы можете найти введение в трубопроводы здесь
1 - Создайте файл pipeline.py в той же папке, что и settings.py
2. Определите метод auth_allowed, чтобы он не вызывал исключение, а перенаправлял куда-то еще (или делал все, что вы хотите). Я сделал это так:
from django.shortcuts import redirect
def auth_allowed(backend, details, response, *args, **kwargs):
if not backend.auth_allowed(response, details):
return redirect('user:error')#<-here goes your url as defined on your urls.py
3 - Определить конвейер в settings.py , заменив auth_allowed вашим пользовательским методом
SOCIAL_AUTH_PIPELINE = (
'social_core.pipeline.social_auth.social_details',
'social_core.pipeline.social_auth.social_uid',
'modular.pipeline.auth_allowed',
'social_core.pipeline.social_auth.social_user',
'social_core.pipeline.user.get_username',
'social_core.pipeline.user.create_user',
'social_core.pipeline.social_auth.associate_user',
'social_core.pipeline.social_auth.load_extra_data',
'social_core.pipeline.user.user_details',
)
(по модулю это имя моего проекта, напишите название вашего проекта)
(многие посты покажут вам методы, вызываемые только «social.pipeline ...». Вместо этого я использовал «social_core.pipeline ...», потому что social дал мне ошибку)
это должно работать. Надеюсь, это кому-нибудь поможет.