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 авторизации, а затем перенаправляется к логину. Путь выглядит примерно так:

  1. https://myapp.com/oauth/authorize/?client_id=something
  2. https://myapp.com/login/?next=/oauth/authorize/?client_id=something
  3. (after selecting sign in with SAML login method) https://myapp.com/login/subdomain/?next=/oauth/authorize/?client_id=something
  4. Redirect to IdP
  5. Redirect back to assertion consumer url https://myapp.com/login/sso/saml/complete/
  6. 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 сессий, чтобы увидеть настройки сессии и получить отмеченное выше

Заранее благодарю за любую помощь.

Вернуться на верх