implementar ejemplo como oauth user-agent oauth-2.0

ejemplo - ¿Cuál es el propósito del tipo de autorización de concesión implícita en OAuth 2?



java oauth2 ejemplo (11)

Aquí están mis pensamientos:

El propósito del código de autenticación + token en el flujo de código de autorización es que el token y el secreto del cliente nunca serán expuestos al propietario del recurso porque viajan de servidor a servidor.

Por otro lado, el flujo de concesión implícita es para clientes que se implementan completamente usando javascript y se ejecutan en el navegador del propietario del recurso. No necesita ningún código del lado del servidor para utilizar este flujo. Entonces, si todo sucede en el navegador del propietario del recurso, ya no tiene sentido emitir el código de autenticación y el secreto del cliente, ya que el token y el secreto del cliente todavía se compartirán con el propietario del recurso. Incluir el código de autenticación y el secreto del cliente solo hace que el flujo sea más complejo sin agregar más seguridad real.

Así que la respuesta a "lo que se ha ganado?" es "simplicidad".

No sé si simplemente tengo algún tipo de punto ciego o algo así, pero he leído muchas veces la especificación OAuth 2 y he examinado detenidamente los archivos de la lista de correo, y aún tengo que encontrar una buena explicación de por qué la Subvención Implícita Se ha desarrollado un flujo para obtener tokens de acceso. En comparación con la concesión de código de autorización, parece que simplemente se da por vencido con la autenticación del cliente sin ninguna razón muy convincente. ¿Cómo se "optimiza esto para los clientes implementados en un navegador usando un lenguaje de scripting" (para citar la especificación)?

Ambos flujos comienzan de la misma manera (fuente: http://tools.ietf.org/html/draft-ietf-oauth-v2-22 ):

  1. El cliente inicia el flujo dirigiendo el agente de usuario del propietario del recurso al punto final de autorización.
  2. El servidor de autorización autentica al propietario del recurso (a través del agente de usuario) y establece si el propietario del recurso otorga o niega la solicitud de acceso del cliente.
  3. Suponiendo que el propietario del recurso otorga el acceso, el servidor de autorización redirige el agente de usuario al cliente utilizando el URI de redirección proporcionado anteriormente (en la solicitud o durante el registro del cliente).
    • El URI de redirección incluye un código de autorización (flujo de código de autorización)
    • El URI de redirección incluye el token de acceso en el fragmento de URI (flujo implícito)

Aquí es donde los flujos se dividen. En ambos casos, el URI de redirección en este punto es a algún punto final alojado por el cliente:

  • En el flujo de código de autorización, cuando el agente de usuario llega a ese punto final con el código de autorización en el URI, el código de ese punto final intercambia el código de autorización junto con sus credenciales de cliente para un token de acceso que luego puede usar según sea necesario. Podría, por ejemplo, escribirlo en una página web a la que podría acceder un script en la página.
  • El flujo implícito omite este paso de autenticación del cliente y simplemente carga una página web con el script del cliente. Hay un lindo truco aquí con el fragmento de URL que evita que el token de acceso se transmita demasiado, pero el resultado final es esencialmente el mismo: el sitio alojado por el cliente ofrece una página con un script que puede capturar el token de acceso. .

Por lo tanto, mi pregunta: ¿qué se ha ganado aquí al saltear el paso de autenticación del cliente?


Creo que Will Cain respondió a esto cuando dijo: "No hay beneficio para las credenciales del cliente por la misma razón. (Cualquier cliente puede intentar usar este flujo). se realiza desde el Servidor de Autorización para el flujo implícito. Como no hay manera de pre-confiar en el cliente, el usuario tendría que aprobar la liberación de las reclamaciones de los usuarios.


En el flujo implícito si el navegador del usuario está dañado (extensión / virus malvado), la corrupción tiene acceso a los recursos del usuario y puede hacer las cosas malas.

En el flujo de autenticación, la corrupción no puede porque no conoce el secreto del cliente.


La concesión implícita permite obtener tokens desde el punto final de autorización con un GET . Esto significa que el servidor de autorización no tiene que soportar CORS.

Si eso no es una preocupación y no hay otros problemas relacionados con el servidor de autorizaciones inflexibles (por ejemplo, los tokens de actualización no son opcionales, por alguna razón) el flujo de códigos de autorización es el preferido, incluso para clientes públicos, según las tendencias recientes de la industria. y al menos a esta (actual) instancia de un borrador oficial .

Históricamente, hubo otras razones para implementar el flujo implícito, pero parece que actualmente están superadas por las ventajas de seguridad que proporciona el código de autorización, que incluyen:

  • Opción de entregar y usar los tokens sobre un canal de respaldo para clientes confidenciales
  • no exponer tokens en el historial del navegador para clientes públicos
  • Interrupción de un flujo no autorizado antes de la emisión de tokens, con PKCE , para "todo tipo de clientes OAuth"

La explicación habitual es que la concesión implícita es más fácil de implementar cuando se utiliza un cliente de JavaScript. Pero creo que esta es la forma incorrecta de verlo. Si está utilizando un cliente de JavaScript que solicita recursos protegidos directamente a través de XMLHttpRequest, la concesión implícita es su única opción, aunque es menos segura.

La concesión del Código de Autorización proporciona seguridad adicional, pero solo funciona cuando tiene un servidor web que solicita los recursos protegidos. Dado que el servidor web puede almacenar el token de acceso, corre menos riesgo de que el token de acceso esté expuesto a Internet y puede emitir un token que dure mucho tiempo. Y como el servidor web es de confianza, se le puede dar un "token de actualización", para que pueda obtener un nuevo token de acceso cuando el anterior caduque.

Pero, y este es un punto que es fácil pasar por alto, la seguridad del flujo del código de Autorización solo funciona si el servidor web está protegido con una sesión, que se establece con la autenticación del usuario (inicio de sesión). Sin una sesión, un usuario que no sea de confianza podría realizar solicitudes al servidor web, utilizando el ID de cliente, y sería lo mismo que si el usuario tuviera el token de acceso. Agregar una sesión significa que solo un usuario autenticado puede acceder a los recursos protegidos. El client_id es solo la "identidad" de la aplicación web JS, no la autenticación de dicha aplicación web.

También significa que puede finalizar la sesión antes de que caduque el token de OAuth. No hay una manera estándar de invalidar un token de acceso. Pero si su sesión expira, el token de acceso es inútil, ya que nadie lo sabe, excepto el servidor web. Si un usuario que no es de confianza obtuvo acceso a su clave de sesión, solo podrá acceder a los recursos protegidos mientras la sesión sea válida.

Si no hay un servidor web, debe utilizar la concesión implícita. Pero esto significa que el token de acceso está expuesto a Internet. Si un usuario que no es de confianza obtiene acceso a él, puede usarlo hasta que caduque. Esto significa que tendrán acceso a él por más tiempo que con una concesión del Código de Autorización. Por lo tanto, es posible que desee considerar hacer que el token caduque antes y evitar dar acceso a recursos más confidenciales.


No estoy seguro de entender correctamente la respuesta y el comentario de Dan. Me parece que la respuesta ha declarado algunos hechos correctos, pero señala exactamente lo que pidió OP. Si entiendo correctamente, la principal ventaja del flujo de concesión implícita es que un cliente como la aplicación JS (por ejemplo, la extensión Chrome) no tiene que exponer el secreto del cliente.

Dan Taflin dijo:

... en el flujo de código de autorización, el propietario del recurso nunca necesita ver el token de acceso, mientras que en los clientes de javascript es inevitable. Sin embargo, el secreto del cliente aún se puede guardar de los clientes de javascript utilizando el flujo de código de autorización.

Tal vez no te entendí bien, pero el cliente (la aplicación JS en este caso) debe pasar la credencial del cliente (clave de cliente y secreto) al servidor de recursos en el flujo del código de autorización, ¿verdad? El secreto del cliente no puede ser "guardado de JS".


Se reduce a: Si un usuario ejecuta una aplicación web (JavaScript) basada en navegador o "pública", sin componente del lado del servidor, el usuario confía implícitamente en la aplicación (y en el navegador donde se ejecuta, posiblemente con otro navegador aplicaciones basadas en ...

No hay un servidor remoto de terceros, solo el servidor de recursos. No hay beneficio para un código de autorización, porque no hay otro agente además del navegador que actúe en nombre del usuario. No hay beneficio para las credenciales del cliente por la misma razón. ( Cualquier cliente puede intentar usar este flujo.)

Las implicaciones de seguridad, sin embargo, son significativas. De http://tools.ietf.org/html/rfc6749#section-10.3 :

Cuando se usa el tipo de concesión implícita, el token de acceso se transmite en el fragmento URI, que puede exponerlo a partes no autorizadas.

De http://tools.ietf.org/html/rfc6749#section-10.16 :

El propietario de un recurso puede delegar voluntariamente el acceso a un recurso al otorgar un token de acceso al cliente malintencionado de un atacante. Esto puede ser debido a phishing o algún otro pretexto ...


Si bien la Subvención Implícita fue diseñada para admitir aplicaciones que no podían proteger un secreto del cliente, incluidas las aplicaciones de JavaScript del lado del cliente, las mejores prácticas actuales son usar el Código de Autorización sin un Secreto del Cliente. El OAuth 2.0 IETF RFC-6749 se publicó en 2012 y las recomendaciones actuales son de 2017.

La discusión de 2017 sobre la lista de correo de IETF OAuth está disponible a través de estos implementadores:

Leer más aquí:

Anteriormente se recomendó implícito para los clientes sin un secreto, pero se ha reemplazado mediante el uso de la concesión del Código de Autorización sin secreto.

...

Anteriormente, se recomendaba que las aplicaciones basadas en el navegador usen el flujo "Implícito", que devuelve un token de acceso inmediatamente y no tiene un paso de intercambio de token. Desde el momento en que se escribió originalmente la especificación, las mejores prácticas de la industria han cambiado para recomendar que el flujo del código de autorización se use sin el secreto del cliente. Esto brinda más oportunidades para crear un flujo seguro, como el uso del parámetro de estado. Referencias: https://www.ietf.org/.../oauth/current/msg16966.html , https://www.ietf.org/.../oauth/current/msg16968.html , https://www.ietf.org/.../oauth/current/msg16967.html .

El cambio al Código de Autenticación sin Secreto de Cliente desde la Subvención Implícita también se menciona para aplicaciones móviles aquí:


además de las otras respuestas, también es importante darse cuenta de que el perfil Implícito permite un flujo único de canal frontal en oposición al flujo del Código de Autorización que requiere una llamada al Servidor de Autorización; esto se hace evidente en OpenID Connect, que es un protocolo SSO construido sobre Auth 2.0 donde el flujo Implícito se parece al enlace SAMT POST bastante popular y el flujo del Código de Autorización se parece al enlace SAML Artifact menos implementado


https://tools.ietf.org/html/rfc6749#page-8

Implícito

La concesión implícita es un flujo de código de autorización simplificado optimizado para clientes implementados en un navegador utilizando un lenguaje de scripting como JavaScript. En el flujo implícito, en lugar de emitir al cliente un código de autorización, el cliente recibe un token de acceso directamente (como resultado de la autorización del propietario del recurso). El tipo de concesión es implícito, ya que no se emiten credenciales intermedias (como un código de autorización) (y luego se usan para obtener un token de acceso).

Al emitir un token de acceso durante el flujo de concesión implícito, el
El servidor de autorizaciones no autentica al cliente. En algunos
En los casos, la identidad del cliente puede verificarse a través del URI de redirección
Se utiliza para entregar el token de acceso al cliente. El token de acceso puede estar expuesto al propietario del recurso u otras aplicaciones con acceso al agente de usuario del propietario del recurso.

Las subvenciones implícitas mejoran la capacidad de respuesta y la eficiencia de algunos
clientes (como un cliente implementado como una aplicación en el navegador),
ya que reduce el número de viajes de ida y vuelta requeridos para obtener una
token de acceso.


Está ahí por razones de seguridad, no por simplicidad.

Debe considerar la diferencia entre el agente de usuario y el cliente :

El agente de usuario es el software mediante el cual el usuario ("propietario del recurso") se comunica con otras partes del sistema (servidor de autenticación y servidor de recursos).

El cliente es el software que desea acceder a los recursos del usuario en el servidor de recursos.

En el caso de usuario-agente y cliente desacoplados, la concesión de código de autorización tiene sentido. Por ejemplo, el usuario utiliza un navegador web (usuario-agente) para iniciar sesión con su cuenta de Facebook en Kickstarter. En este caso, el cliente es uno de los servidores de Kickstarter, que maneja los inicios de sesión del usuario. Este servidor obtiene el token de acceso y el token de actualización de Facebook. Por lo tanto, este tipo de cliente se considera "seguro", debido al acceso restringido, los tokens se pueden guardar y Kickstarter puede acceder a los recursos de los usuarios e incluso actualizar los tokens de acceso sin la interacción del usuario.

Si el agente de usuario y el cliente están acoplados (por ejemplo, aplicación móvil nativa, aplicación javascript), se puede aplicar el flujo de trabajo de autorización implícita . Se basa en la presencia del propietario del recurso (para ingresar las credenciales) y no admite tokens de actualización. Si este cliente almacena el token de acceso para su uso posterior, será un problema de seguridad, ya que otras aplicaciones o usuarios del cliente pueden extraer el token fácilmente. La ausencia del token de actualización es una sugerencia adicional, que este método no está diseñado para acceder a los recursos del usuario en ausencia del usuario.