Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

894
Vistas
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 Respuestas
Responde la pregunta

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 Denunciar

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 Denunciar

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 Denunciar

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 Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda