¿Dónde debo almacenar los tokens de acceso OAuth2?

11

Estoy creando un back-end de API REST para una aplicación móvil. En nuestra elección de diseño, decidimos dejar que los proveedores de OAuth2 se encarguen de la seguridad de inicio de sesión.

Sin embargo, no estoy seguro de cuál es la mejor práctica para el token de acceso, que obtengo de los proveedores de OAuth2.

La situación es que recibo un token de acceso del proveedor de OAuth2 cuando el usuario inicia sesión. Necesitaré usar este token, cada vez que la aplicación móvil realice una solicitud a mi back-end. Así que puedo validar contra el proveedor OAuth2, para ver si el token sigue siendo válido.

Sé que voy a crear un JWT y entregarlo a la aplicación móvil, que utilizará cada vez que realice una solicitud.

Ahora mi pregunta es si debo almacenar el token de acceso que recibí del proveedor de OAuth2, dentro del JWT como reclamos.
¿O debería almacenarlo en una base de datos y conectarlo con el ID de los usuarios, que almacenaré en las reclamaciones de JWT?

¿Quizás se recomienda que cifre el JWT, con JWE? Si ese es el caso, ¿disminuirá el rendimiento más si descifro para cada solicitud, en lugar de hacer una búsqueda en la base de datos (usaré MongoDB o Redis) o el impacto en el rendimiento será el mismo?

La conexión a mi API REST, será a través de HTTPS.

    
pregunta Daniel 10.02.2016 - 13:15
fuente

2 respuestas

8

Si la solicitud a la API de terceros es a través de su servidor, entonces almacene el token de acceso en la base de datos vinculada al usuario, cifrada con una clave que se almacena como una variable de entorno. Si la base de datos está comprometida, los tokens están a salvo. (Bonificación, cifre los tokens con una clave que se genera y almacena en la aplicación móvil).

Si la solicitud a la API de terceros es directamente desde la aplicación móvil, almacene el token de acceso en el teléfono, cifrado con una clave única para cada usuario almacenado en la base de datos de su servidor. El almacenamiento descentralizado de información sensible es más seguro que el almacenamiento centralizado (compartimentación). Si el teléfono es robado, requiere autenticación en su servidor antes de poder obtener la clave de descifrado. Si su servidor está comprometido, los tokens no están allí.

No he usado JWT.

    
respondido por el Chloe 10.02.2016 - 21:09
fuente
1
Los

Tokens de acceso son de acuerdo con el RFC que se supone son de acceso limitado. En lugar de preocuparse por dónde almacenar algo de alto valor donde el servidor pueda verse comprometido, es mejor limitar la duración del acceso al token.

Esto se explica específicamente en el RFC para los tokens del portador:

  

Emita tokens de portador de corta duración: los servidores de tokens DEBEN emitir         fichas de portador de corta duración (una hora o menos), especialmente cuando         emitir tokens a clientes que se ejecutan dentro de un navegador web u otro         Entornos donde puede producirse una fuga de información. Utilizando         Las fichas de portador de corta duración pueden reducir el impacto de ser         filtrado.

    
respondido por el Steve Sether 11.02.2016 - 21:01
fuente

Lea otras preguntas en las etiquetas