Creo que tengo esto ordenado, pero me encantaría escuchar si me equivoco. Tenemos un conjunto de aplicaciones Python + Angular.js, que utilizan tokens JWT para la autenticación, donde los tokens se cifran mediante una clave secreta, la carga útil identifica al usuario y el token se almacena en el lado del cliente en una cookie configurada como HTTP SOLAMENTE y tan seguro. Por diversos motivos, esto nos funciona bien, podemos usar una aplicación de middleware wsgi de Python en múltiples backends API, nuestro token se envía automáticamente en cada solicitud al dominio y podemos omitir el uso de las sesiones por completo. He revisado esta parte aquí y en otros lugares y estoy seguro de que es bueno. (Mi pregunta está aquí: enlace )
Mi nueva pregunta es cómo manejar tokens CSRF, dado que no estamos usando sesiones en absoluto. Estoy pensando lo siguiente:
- auth se maneja fuera del token jwt en la cookie descrita anteriormente, llamémosla accept_token_cookie. JS no puede leerlo, es HTTP SOLAMENTE. Tiene el ID de usuario.
- se envía una segunda cookie con nuestro token CSRF, que no es HTTP_ONLY, por lo que angular puede leerlo (llamémoslo csrf_cookie)
- csrf_cookies payload es un cifrado de nuestra carga útil de identidad (o parte de ella, como el correo electrónico del usuario), pero hecho con una segunda clave secreta
- cuando se realiza una solicitud XHR, mi JS verá el valor csrf_cookie y lo agregará a un encabezado
- en el ingreso, nuestro servidor decodifica ambas cookies y obtiene el token como enviado por angular en un encabezado personalizado. Si estos no coinciden todos, sabemos que esta solicitud es mala porque el javascript de solicitud no pudo leer nuestro csrf_cookie. Sin embargo, csrf_cookie todavía no se utiliza en absoluto para generar identidad, que es lo que deseamos para que la cookie accept_token permanezca totalmente opaca para el cliente.
De todas mis lecturas, lo anterior suena correcto. Si me equivoco, por favor dime por qué, gracias.