Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

891
Visualizações
Django, Djoser social auth: no se pudo encontrar el estado en los datos de la sesión del lado del servidor. código_estado 400

Estoy implementando un sistema de autenticación con django y reacciono. Las dos aplicaciones se ejecutan respectivamente en el puerto 8000, 3000. Implementé el sistema de autenticación usando el paquete Djoser. Este paquete usa algunas dependencias social_core y social_django. Todo parece estar configurado bien. Hago clic en el botón de inicio de sesión de Google... Soy redirigido a la página de inicio de sesión de Google y luego vuelvo a mi aplicación de reacción frontal en el puerto 3000 con los parámetros de estado y código en la URL.

En este punto, estoy publicando esos parámetros en el backend. El backend intenta validar el estado verificando si la clave de estado está presente en el almacenamiento de la sesión usando el siguiente código de ( 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

En este punto, por alguna razón, la clave de la sesión de estado no está allí... y recibo un error que dice que el estado no se puede encontrar en los datos de la sesión (error a continuación)

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

Recapitulo todas las acciones que realizo:

  1. Solicitud de front-end a backend para generar dado al proveedor google-oauth2 una URL de redireccionamiento. Con esta acción, se genera la URL y también se almacena la clave de estado en la sesión con un valor específico (google-oauth2_state).
  2. El front-end recibe la URL y la redirección a la página de autenticación de Google.
  3. Autenticación con google y redirección de regreso al front-end con un estado y parámetros de código en la url.
  4. El front-end obtiene la URL del formulario de datos y publica los datos en el back-end para verificar que el estado recibido sea igual al generado en el punto (1).

Por alguna razón, el código de estado no se conserva... Cualquier idea y ayuda serán realmente apreciadas.

Gracias a todos.

over 4 years ago · Santiago Trujillo
4 Respostas
Responde à pergunta

0

Sin la información detallada necesaria, solo puedo decir 2 posibles razones:

  1. Anuló el backend con operaciones de session incorrectas (o se cerró la sesión del usuario antes de que finalizara la autenticación).
  2. Front-end usó un parámetro de state incorrecto

Podría probar el inicio de sesión social sin front-end, digamos si está intentando iniciar sesión con Google:

  1. Ingrese la URL de inicio de sesión social en el navegador, como domain.com:8000/login/google-oauth2/
  2. Autorizar
  3. Vea si la página redirigió a su página de inicio de sesión predeterminada correctamente

En caso afirmativo, entonces probablemente necesite verificar su código de front-end, y si no, entonces verifique su código de back-end.

Al final, si no es tan sensible al riesgo potencial, también puede anular la clase GoogleOAuth2 de la siguiente manera para deshabilitar la verificación de estado:

 from social_core.backends import google class GoogleOAuth2(google.GoogleOAuth2): STATE_PARAMETER = False
over 4 years ago · Santiago Trujillo Relatório

0

Creo que es posible que necesite algunos cambios en el flujo de autorización en los pasos 3 y 4.

3. Autenticación con google y redirección de regreso al front-end con un estado y parámetros de código en la url.
4. Front-end obtenga la URL del formulario de datos y publique los datos en el back-end para verificar que el estado recibido sea igual al generado en el punto (1).

tal vez debería redirigir de nuevo al lado del servidor después de la autorización de Google.

luego, en el lado del servidor, ¡haz la verificación! validar el estado y el código (tal vez hacer más cosas).

luego deje que el servidor redirija al sitio front-end que deseaba antes.

por alguna razón, redirigir directamente al front-end perderá el parámetro .. :-)

over 4 years ago · Santiago Trujillo Relatório

0

ok, este es un problema común mientras trabaja con autenticación social. Tuve el mismo problema tantas veces.

el flujo :

  1. haga una solicitud a http://127.0.0.1:8000/auth/o/google-oauth2/?redirect_uri=http://localhost:3000/ (ejemplo)

  2. obtendrá una authorization_url . si nota que en esta autorización_url se presenta un estado. este es el 'estado del lado del servidor'.

  3. ahora debe hacer clic en el enlace de autorización_url. Luego obtendrá la página de autenticación de Google. Después de eso, será redirigido a su URL de redirección con un estado y un código. Recuerde que este estado debe ser el mismo estado que el estado del lado del servidor. (2)

  4. haga un requisito de publicación en http://127.0.0.1:8000/auth/o/google-oauth2/?state=''&code='' . si sus estados no son los mismos, tendrá algún problema.

cada vez que desee iniciar sesión, debe realizar una solicitud a http://127.0.0.1:8000/auth/o/google-oauth2/?redirect_uri=http://localhost:3000/ y luego a http://127.0.0.1:8000/auth/o/google-oauth2/?state=''&code='' por lo que obtendrá el mismo estado.

over 4 years ago · Santiago Trujillo Relatório

0

Permitir que Axios mantenga la sesión en la interfaz

 import axios from "axios"; axios.defaults.withCredentials = true; axios.get("url") .then(response => { console.log(response) }) .catch(error => { console.log(error); });

axios.defaults.withCredentials = verdadero;

CORS_ORIGIN_ALLOW_ALL = Verdadero

CORS_ALLOW_CREDENTIALS = Verdadero

over 4 years ago · Santiago Trujillo Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda