Django-social-auth не перенаправляет на предоставленный следующий параметр запроса для входа в систему SAML
У меня есть django приложение, которое использует django-social-auth и позволяет использовать три типа SSO аутентификации, Google, Office 365 и SAML2.0. В случае SAML2.0 приложение позволяет конечному пользователю указать свой собственный IdP, и для этого у нас есть пользовательский класс Database SAML Auth, который позволяет нам хранить информацию об IdP пользователя в базе данных и регистрировать пользователя. Это работает как ожидалось, и пользователи могут без проблем входить в систему с помощью SAML, Google или Office 365.
Проблема возникает, когда мне нужно перенаправить на определенный URL после завершения входа в систему. Это работает, как ожидалось, для Google и Office 365, но не для входа в систему SAML.
Например, у меня есть мобильное приложение, которое аутентифицируется через OAUTH в веб-приложении django. Когда это мобильное приложение запускает свой поток oauth, оно переходит к URL авторизации, а затем перенаправляется к логину. Путь выглядит примерно так:
- https://myapp.com/oauth/authorize/?client_id=something
- https://myapp.com/login/?next=/oauth/authorize/?client_id=something
- (after selecting sign in with SAML login method) https://myapp.com/login/subdomain/?next=/oauth/authorize/?client_id=something
- Redirect to IdP
- Redirect back to assertion consumer url https://myapp.com/login/sso/saml/complete/
- Redirect to account page https://myapp.com/manage/ (not https://myapp.com/oauth/authorize/?client_id=something as expected)
Конечно, разочарование заключается в том, что это нарушает oauth-поток моего мобильного приложения, поскольку пользователь входит в веб-приложение, но никогда не авторизуется в мобильном приложении.
Согласно документации по социальным аутентификациям python, значение ?next= должно использоваться, если оно присутствует, для перенаправления пользователя после успешной аутентификации.
Я провел много отладки, и я могу видеть в методе social-core do_auth
, что следующий параметр действительно добавляется к сессии, как ожидалось.
Но когда я отлаживаю и смотрю на сессию, возвращаемую в методе social-core do_complete
после того, как IdP отправляет пользователя обратно в мое приложение, сессия пуста и не содержит никаких данных, включая отсутствие моего следующего параметра.
В какой-то момент все это работало, как и ожидалось. Однако теперь это перестало работать, и я не могу найти никаких изменений в коде, которые указывали бы на причину этого. Мой вопрос к сообществу заключается в том, не упустил ли я что-то, что могло бы решить мою проблему и вернуть меня на путь, где SAML login перенаправляет, как и ожидалось.
Некоторые дополнительные детали, которые могут быть полезны:
- Django версии 2.2.24
- Python 3.6
- social-auth-app-django версии 3.0.0 и 5.0.0 протестированы
- social-auth-core версий 3.3.3 и 4.1.0 протестировано
Мои промежуточные модули (обратите внимание, что многие из них являются пользовательскими промежуточными модулями как часть нашего приложения):
MIDDLEWARE = [
'instana.instrumentation.django.middleware.InstanaMiddleware',
# HealthCheckMiddleware must be before db queries or ALLOWED_HOSTS checks.
'eventboard.middleware.HealthCheckMiddleware',
'eventboard.middleware.OriginalXForwardedProtoMiddleware',
'eventboard.middleware.DebugMiddleware',
'eventboard.middleware.ContentSecurityPolicy',
# CookiesSameSite needs to be before SessionMiddleware.
# Later Django versions support SameSite cookies, so this middleware and
# pip package can be removed when we upgrade Django.
'django_cookies_samesite.middleware.CookiesSameSite',
'common.middleware.RequestIDMiddleware',
'common.middleware.APIErrorHandler',
# CorsMiddleware must be before 'django.middleware.common.CommonMiddleware'
# (https://github.com/ottoyiu/django-cors-headers/#setup)
'corsheaders.middleware.CorsMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'accounts.middleware.TwoFactorMiddleware',
'accounts.middleware.PasswordChangeMiddleware',
'accounts.middleware.VerifyActiveMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.gzip.GZipMiddleware',
'billing.middleware.CartMiddleware',
# todo: convert new relic to instana
# 'accounts.middleware.NewRelicAccountPushMiddleware',
'accounts.middleware.SentryContextMiddleware',
'accounts.middleware.SocialAuthExceptionMiddleware',
'accounts.middleware.RealIPMethodMiddleware',
'common.sqla.middleware.SQLAlchemyMiddleware',
'django.middleware.security.SecurityMiddleware',
]
Уже предпринимались попытки поиска и устранения неисправностей:
- Удаление/перестановка промежуточного оборудования
- Измените настройки в приложении django как для сессионных куки, так и для настроек безопасности SOCIAL_AUTH .
- Запустите несколько PDB сессий, чтобы увидеть настройки сессии и получить отмеченное выше
Заранее благодарю за любую помощь.