SOCIAL_AUTH_LOGIN_ERROR_URL не работает Django 2.0.6 - PullRequest
0 голосов
/ 02 июля 2018

Я работаю в веб-приложении для своей организации (скажем, «student.uni» и «academics.uni») Моя организация использует службы Google, поэтому это домены Google, и я хочу ограничить доступ к приложению только для тех доменов, которые используют «social_django» Я работаю с Django 2.0.6 и Python 3.6.5

Я использую это для ограничения доступа к приложению, работает хорошо:

SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = ['student.uni', 'academics.uni']

Хорошо работает, когда я вхожу в систему или регистрируюсь с разрешенной учетной записью, но, когда домен учетной записи не разрешен, я хочу перенаправить или отправить пользователя на другую страницу, чтобы сообщить ему, что произошло.

Я пытался с:

SOCIAL_AUTH_LOGIN_ERROR_URL = 'principal'

Но я не могу заставить его работать, так как я получаю либо исключение AuthForbidden, либо ошибку 500, если я устанавливаю DEBUG = False

Любое предложение о том, как мне поступить, чтобы перенаправить или отправить сообщение, когда домен не разрешен? Большое спасибо

Код:

Settings.py (не все, но соответствующий код)

    INSTALLED_APPS = [
    'django.contrib.admin',
    'django.contrib.auth',
    'django.contrib.contenttypes',
    'django.contrib.sessions',
    'django.contrib.messages',
    'django.contrib.staticfiles',
    'apps.user',
    'apps.inv',
    'apps.sol',
    'social_django',
]



AUTHENTICATION_BACKENDS = (
 'social_core.backends.open_id.OpenIdAuth',  # for Google authentication
 'social_core.backends.google.GoogleOpenId',  # for Google authentication
 'social_core.backends.google.GoogleOAuth2',  # for Google authentication

 'django.contrib.auth.backends.ModelBackend',
)

LOGIN_URL =  'login'
LOGIN_REDIRECT_URL = 'principal'
#DEBUG = False
SOCIAL_AUTH_LOGIN_ERROR_URL = 'principal'

SOCIAL_AUTH_GOOGLE_OAUTH2_KEY ='****.apps.googleusercontent.com'
SOCIAL_AUTH_GOOGLE_OAUTH2_SECRET = '******'
SOCIAL_AUTH_GOOGLE_OAUTH2_WHITELISTED_DOMAINS = ['student.uni', 'academics.uni']

страница, которую я получаю, когда пытаюсь войти с другой учетной записью домена:

AuthForbidden at /auth/complete/google-oauth2/
Your credentials aren't allowed
Request Method: GET
Request URL:    http://127.0.0.1:8000/auth/complete/google-oauth2/?state=8*********&code=4/***********-***********************************&authuser=0&session_state=*****************************..e40c&prompt=none
Django Version: 2.0.6
Exception Type: AuthForbidden
Exception Value:    
Your credentials aren't allowed
Exception Location: C:\ambientes\prueba\lib\site-packages\social_core\pipeline\social_auth.py in auth_allowed, line 14
Python Executable:  C:\ambientes\prueba\Scripts\python.exe
Python Version: 3.6.5
Python Path:    
['C:\\proyectosDjango\\Modular',
 'C:\\ambientes\\prueba\\Scripts\\python36.zip',
 'C:\\Users\\espar\\AppData\\Local\\Programs\\Python\\Python36-32\\DLLs',
 'C:\\Users\\espar\\AppData\\Local\\Programs\\Python\\Python36-32\\lib',
 'C:\\Users\\espar\\AppData\\Local\\Programs\\Python\\Python36-32',
 'C:\\ambientes\\prueba',
 'C:\\ambientes\\prueba\\lib\\site-packages']
Server time:    Dom, 1 Jul 2018 15:45:32 -0500

1 Ответ

0 голосов
/ 07 июля 2018

После (много?) Исследований я нашел способ сделать это. Возобновление: я хочу, чтобы только письма из списка доменов (предоставленных 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 дал мне ошибку)

это должно работать. Надеюсь, это кому-нибудь поможет.

...