Django, социальная авторизация Djoser: не удалось найти состояние в данных сеанса на стороне сервера. status_code 400

Я реализую систему аутентификации с помощью django и реагирую. Два приложения запускаются соответственно на портах 8000, 3000. Я реализовал систему аутентификации с помощью пакета Djoser. Этот пакет использует некоторые зависимости social_core и social_django. Вроде все настроено нормально. Я нажимаю кнопку входа в Google ... Меня перенаправляют на страницу входа в Google, а затем обратно в мое внешнее приложение для реагирования на порт 3000 с состоянием и кодом параметры на URL.

На этом этапе я отправляю эти параметры в серверную часть. Бэкэнд пытается проверить состояние, проверяя, присутствует ли ключ состояния в хранилище сеанса, используя приведенный ниже код из (social_core / backends / oauth.py)

def validate_state(self):
        """Validate state value. Raises exception on error, returns state
        value if valid."""
        if not self.STATE_PARAMETER and not self.REDIRECT_STATE:
            return None
        state = self.get_session_state()
        request_state = self.get_request_state()
        if not request_state:
            raise AuthMissingParameter(self, 'state')
        elif not state:
            raise AuthStateMissing(self, 'state')
        elif not constant_time_compare(request_state, state):
            raise AuthStateForbidden(self)
        else:
            return state

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

{"error":["State could not be found in server-side session data."],"status_code":400}

Я резюмирую все свои действия:

  1. Внешний запрос к бэкэнду для генерации с учетом URL-адреса перенаправления провайдера google-oauth2. С помощью этого действия создается URL-адрес, а ключ состояния сохраняется в сеансе с определенным значением (google-oauth2_state).
  2. Внешний интерфейс получает URL-адрес и перенаправляет на страницу аутентификации Google.
  3. Аутентификация с помощью Google и перенаправление обратно к интерфейсу с параметрами state и code в URL-адресе.
  4. Внешний интерфейс получает URL-адрес формы данных и отправляет данные на сервер, чтобы убедиться, что полученное состояние равно сгенерированному в точке (1).

По некоторым причинам код штата не сохраняется ... Мы будем очень благодарны за любые идеи и помощь.

Спасибо всем.


person LucaT    schedule 15.02.2021    source источник
comment
Если вы разместите демонстрационный код, это поможет разобраться в проблеме.   -  person caot    schedule 01.05.2021
comment
Вы решили эту проблему? происходит и со мной! Но в моем случае разные URL-адреса для сервера и клиента, поэтому я предполагаю, что сохранение сеанса вызывает проблему, но не знаю, как это исправить! Любая помощь приложена.   -  person Ishika Jain    schedule 24.05.2021


Ответы (3)


Без необходимой детальной информации могу назвать только 2 возможные причины:

  1. Вы перекрыли серверную часть с помощью неправильных session операций (или пользователь вышел из системы до завершения аутентификации).
  2. Фронтенд использовал неверный параметр state

Вы можете протестировать социальный вход без внешнего интерфейса, скажем, если вы пытаетесь войти в систему с помощью Google:

  1. Введите URL-адрес для входа в социальную сеть в браузере, например domain.com:8000/login/google-oauth2/
  2. Авторизовать
  3. Проверьте, правильно ли страница перенаправлена ​​на страницу входа по умолчанию

Если да, то, вероятно, вам нужно проверить свой внешний код, а если нет, то проверьте свой внутренний код.

В конце, если вы не так чувствительны к потенциальному риску, вы также можете переопределить класс GoogleOAuth2, чтобы отключить проверку состояния:

from social_core.backends import google

class GoogleOAuth2(google.GoogleOAuth2):
    STATE_PARAMETER = False
person YKL    schedule 30.04.2021

Я думаю, вам могут потребоваться некоторые изменения в процессе авторизации на шагах № 3 и 4.

3.Аутентификация с помощью Google и перенаправление обратно на интерфейс с параметрами состояния и кода на URL-адресе.
4.Фронт-энд получает URL-адрес формы данных и отправляет данные на сервер, чтобы убедиться, что состояние получено равна сгенерированной в точке (1).

возможно, вам стоит перенаправить обратно на серверную часть после авторизации Google.

затем на стороне сервера сделайте проверку! проверьте состояние и код (возможно, сделайте еще что-нибудь).

затем позвольте серверу перенаправить на интерфейсный сайт, который вы хотели раньше.

по какой-то причине при перенаправлении на интерфейс напрямую параметр будет пропущен .. :-)

person tomy0608    schedule 30.04.2021

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

Поток:

  1. сделать запрос к http://127.0.0.1:8000/auth/o/google-oauth2/?redirect_uri=http://localhost:3000/ (пример)

  2. вы получите authorization_url. если вы заметили, что в этом authorization_url есть состояние. это «состояние серверной части».

  3. Теперь вам нужно щелкнуть ссылку authorization_url. Затем вы получите страницу аутентификации Google. После этого вы будете перенаправлены на свой URL-адрес перенаправления с состоянием и кодом. Помните, что это состояние должно быть таким же, как и состояние на стороне сервера. (2)

  4. сделать запрос на публикацию http://127.0.0.1:8000/auth/o/google-oauth2/?state=''&code=''. если ваши состояния не совпадают, тогда у вас возникнут проблемы.

каждый раз, когда вы хотите войти в систему, вам нужно сделать запрос к http://127.0.0.1:8000/auth/o/google-oauth2/?redirect_uri=http://localhost:3000/, а затем к http://127.0.0.1:8000/auth/o/google-oauth2/?state=''&code='', таким образом вы получите то же состояние.

person Rifat Rahman    schedule 23.06.2021