oauth-2.0 - implementar - oauth2 vs jwt español
Manejo de tokens de acceso caducados en la concesión implícita de OAuth2 (2)
Desde el sitio web de OAuth0 :
Si necesita autenticar a sus usuarios sin una página de inicio de sesión (por ejemplo, cuando el usuario ya ha iniciado sesión a través del escenario SSO) u obtener un nuevo access_token (simular así la actualización de un token caducado), puede usar la autenticación silenciosa.
En cuanto a la autenticación silenciosa :
Sin embargo, redirigir a los usuarios fuera de su aplicación generalmente se considera perjudicial y debe evitarse, desde una perspectiva de UX. La autenticación silenciosa le permite realizar un flujo de autenticación en el que Auth0 solo responderá con redirecciones, y nunca con una página de inicio de sesión.
Esto le permitirá volver a iniciar sesión con el usuario utilizando un token de SSO, sin tener que pedirle credenciales nuevamente.
La especificación de OAuth2 indica que un servidor de autorización no debe emitir un token de actualización cuando se usa una concesión implícita. En nuestro caso de uso, protegemos una API RESTful con OAuth2 y utilizamos una aplicación Javascript de una sola página como cliente para esta API. Como sería muy difícil redirigir al servidor de autorización después de que haya expirado un token de acceso, estamos buscando una mejor manera de obtener un token válido nuevo. Podría pensar en dos enfoques diferentes y preguntarme cuál podría ser mejor:
Utilice un iframe oculto para volver a solicitar un token de acceso válido. Para esto, es necesario incluir un parámetro como "prompt = none" que le indica al proveedor de OAuth que no debe cuestionar la autenticación ni mostrar una página de autorización. Si el usuario está autenticado y ha autorizado la aplicación, el servidor devolverá un token de acceso en los parámetros # de las URL. Si una de las condiciones anteriores no se cumple, se redireccionará con un error como # error = authentication% 20lost. Con este comportamiento podemos usar tokens de acceso de corta duración también con un flujo implícito.
Podríamos usar un alcance adicional (por ejemplo, fuera de línea) que le dice al servidor que entregue un token de actualización. Incluso si la especificación original dice que el flujo implícito no emite tokens de actualización (lo cual es correcto si el cliente solo usa OAuth para una primera autorización), es libre de definir sus propios ámbitos para su aplicación particular. Debería considerar permitir solo este alcance de clientes conocidos.
Ambos enfoques son muy similares a los de OpenID Connect. Desafortunadamente, no hay muchas implementaciones de OpenID Connect en este momento. Entonces, el primer paso sería extender el servidor OAuth2 hasta que la OIC sea más popular.
Entonces, ¿qué enfoque debería ser preferido?
EDITAR : el token endpoint necesita autenticación de cliente, que solo es posible para clientes confidenciales como las aplicaciones del lado del servidor. Con el segundo enfoque, solo sería posible permitir que la API RESTful en nuestro caso el proveedor de recursos actualice el token y lo envíe de vuelta al cliente. Creo que esto sería un riesgo de seguridad. Así que probablemente solo tenemos un enfoque válido.
Estoy tratando de lograr exactamente lo mismo en este momento.
De hecho, he implementado un enfoque de iframe oculto y luego me di cuenta de que hay que tener mucho cuidado con los iframes. Cualquier sitio web malicioso puede contener su iframe y obtener un token de acceso fácilmente si no especifica X-Frame-Options .
El mejor enfoque para actualizar el token debe ser la concesión de contraseña según lo especificado por la especificación. (Quería que mis usuarios iniciaran sesión con su cuenta de Facebook y el flujo implícito era más fácil de desarrollar. No he descubierto cómo hacer esto con la concesión de contraseña).
El segundo enfoque también llegó a mi mente y me parece mucho más seguro que el primero, ya que generalmente puedes confiar en el almacenamiento de https y navegador para mantener tus tokens en secreto.
Editar
Me di cuenta de que, incluso con X-Frame-Options
mayoría de los navegadores no pueden evitar las redirecciones, ya que este encabezado está adjunto al cuerpo de la respuesta y la URL redirigida estará expuesta, por lo tanto, los tokens de acceso estarán expuestos.
Actualización Parece que el fragmento de hash está protegido por el navegador cuando se accede desde la página principal dentro de un dominio diferente. Entonces asumo que #access_token
es seguro. Mi error. Del mismo modo que una página de devolución de llamada de recordatorio debe almacenar el token de acceso por derecho propio, en lugar de (mi intención original) delegarlo en la página principal, como window.parent.storeAccessToken(hash);
que obviamente es una cosa tonta que hacer.