OAuth2 csrf_detected con la funcionalidad 'Conectar' de Discord

Hola! Necesito desesperadamente ayuda para entender este error:


Pasos para reproducir:
Cuando un usuario hace clic en su botón “Conectar” de Discord en Preferencias,


redirige correctamente al usuario a la página de autorización de Discord.

Sin embargo, después de hacer clic en el botón Autorizar, el usuario es redirigido y se encuentra con este mensaje en nuestro foro:
image
y el error en la parte superior de este tema aparece en los registros del administrador.


Siento que he leído y probado todo para solucionar esto, pero sigue sucediendo. Me he asegurado de que la configuración del sitio del ID y Secreto del Cliente de Discord sean correctas.
También me he asegurado de que la URI tuviera la sintaxis correcta (basándome en algunos temas relacionados que he visto):

¿Alguna sugerencia? Estoy dispuesto a probar cualquier cosa, incluso si no estás seguro de que funcione :laughing:

¿Alguna idea? Todavía estoy luchando con esto :confused:

Creo que (?) lo he reducido a un problema de nginx y/o de caché. ¿Se supone que hay algo específico de autenticación o específico de CSRF definido en discourse.conf que podríamos estar omitiendo?

@merefield, @david, @sam - lamento molestarlos, pero veo sus nombres en muchas de las discusiones anteriores relacionadas con csrf. ¿Tienen alguna recomendación para esto? Con la autenticación de Discord integrada en Discourse, no sé qué podría estar causando esto.

Agradezco de antemano toda la ayuda, gracias :cara_sonriente:

Debemos estar rompiendo uno de estos?

Todavía no puedo encontrar un patrón. A veces funciona y me conecta correctamente, pero otras veces me encuentro con la página de csrf.
Por el momento, sospecho más de la última verificación de condición en verified_request?.
¿Hay alguna manera de comprobar fácilmente si (valid_request_origin? && any_authenticity_token_valid?) está devolviendo true?

Pido disculpas por la falta de información depurable, pero creo que (dolorosamente) pude encontrar (al menos lo que creo) es el problema. Todavía no estoy seguro de cuál es la solución, así que por favor sigan leyendo :kissing_heart:


Las imágenes a continuación muestran una instancia consecutiva en la que pude vincular mi cuenta con éxito, la actualicé/lo intenté de nuevo y, sin éxito, llegué a la página de detección de csrf. Estaba en una ventana de incógnito y no hice/cambié literalmente nada entre la conexión exitosa y el fallo de csrf. Esto es lo que encontré:

Así que esta primera imagen muestra la cookie _forum_session coincidiendo en los encabezados de las solicitudes 1 y 2, lo que resultó en una conexión exitosa.

Sin embargo, después de recargar la página y volver a intentarlo (y fallar en la conexión), pueden ver que mi búsqueda en el lado izquierdo solo muestra 1 ocurrencia de la cookie _forum_session en un encabezado de solicitud cuando resultó en un fallo.

tl;dr: Estoy bastante seguro de que el problema se deriva de que la cookie forum_session en el encabezado de la solicitud discord?reconnect y luego el encabezado de la solicitud callback? no coinciden. ¿Qué podría causar que sean diferentes?

Ok, creo que nos estamos acercando.

Así que en esta imagen a continuación, puedes ver una solicitud POST de actualización ocurriendo directamente después de la solicitud POST discord?reconnect.


Y efectivamente, está estableciendo la cookie _forum_session, lo que provoca la discrepancia como describí anteriormente.

Si reviso una instancia de conexión exitosa (abajo), puedes ver que la actualización solo ocurre antes de la solicitud POST discord?reconnect.

Esto hace que la cookie _forum_session coincida y que la cuenta se conecte con éxito sin el problema de csrf.

¿Cómo evito que esa actualización ocurra después de que el usuario haya comenzado el proceso de conexión?

@FerrariFlunker disculpa la lentitud en la respuesta, pero no he tenido la oportunidad de revisarlo, sería genial si el equipo principal pudiera hacerlo.

Si sirve de consuelo, creo que puedo reproducir el error, estoy recibiendo el mismo error:

(discord) ¡Fallo de autenticación! csrf_detected: OmniAuth::Strategies::OAuth2::CallbackError, csrf_detected | CSRF detectado

No te preocupes @merefield, ¡agradezco la respuesta!

¿Estás recibiendo ese error en tu propio entorno? Creo que de todos modos, este error debe ser revisado por el equipo principal. Llevo más de 2 semanas depurando esto y todavía no he encontrado una respuesta :confused:

1 me gusta

¡Buena investigación! Este tipo de condición de carrera ciertamente podría causar los problemas que estás viendo.

Dicho esto, no hemos tenido ningún otro informe de este problema, por lo que parece ser algo específico de tu sitio/configuración. ¿Qué complementos tienes instalados en el sitio? ¿Puedes abrir la llamada “update” y ver qué carga útil se está enviando?

3 Me gusta

Después de revisar las llamadas de actualización, creo que tienes razón. Aquí hay algunas capturas de pantalla de solicitudes de ‘actualización’ confirmadas que causaron fallos de csrf.

Veo un patrón que involucra cdn :face_with_monocle: ¿Qué podría estar mal configurado con eso? Hazme saber si todavía necesitas una lista de nuestros plugins, solo pensé en ahorrarle a esta respuesta +1 imagen :smile:

1 me gusta

¡Tengo una actualización emocionante! Hace unos días, eché un vistazo más de cerca a la carga útil de ‘actualización’ y logré asociar esto:

¡con uno de nuestros plugins! :partying_face: :expressionless: :smile:
Después de deshabilitar el plugin, realizar más pruebas y lanzar con éxito la función relacionada a la comunidad… creo que puedo decir con confianza que encontramos al culpable.

Así que este plugin resultó ser el causante del problema: GitHub - discourse/discourse-chat: Chat inside Discourse

En retrospectiva, tiene sentido por qué este sería el culpable: el plugin todavía está marcado como experimental y no está destinado a sitios de producción. :sweat:

Dado que llevo más de 3 semanas diagnosticando este problema y necesito volver a encarrilarme con los otros proyectos de nuestra comunidad :face_with_spiral_eyes:, desafortunadamente no podré ayudar a encontrar la solución para el plugin discourse-chat.

Si alguien termina implementando una solución para el plugin, nosotros (lo más probable :smile:) consideraríamos volver a habilitar el plugin en nuestro sitio, pero por ahora necesitamos una funcionalidad de cuentas asociadas Connect estable.

¡Gracias de nuevo a todos los que ayudaron a diagnosticar! :+1:

2 Me gusta

¡Gracias por la investigación súper detallada @FerrariFlunker!

Acabo de hacer un PR para una corrección en el núcleo de Discourse:

La razón por la que se corrigió después de eliminar el plugin de chat es que Chat hace un uso intensivo de esta API ‘PresenceChannel’, por lo que es mucho más probable que ocurra el problema. No creo que se requieran cambios en el chat.

4 Me gusta

¿Debería esto solucionar el mismo problema con los inicios de sesión de Google? A mis usuarios en una de mis instancias donde estábamos probando el complemento de chat les encantó, pero rompió los inicios de sesión de Google con el mismo error que los inicios de sesión de Discord.

5 Me gusta

Sí, esta corrección se aplicará a todos los tipos de inicio de sesión diferentes :+1:

3 Me gusta