OAuth 2.0 tiene múltiples flujos de trabajo. Tengo algunas preguntas sobre los dos.
- Flujo de código de autorización : el usuario inicia sesión desde la aplicación cliente, el servidor de autorización devuelve un código de autorización a la aplicación. La aplicación luego intercambia el código de autorización por el token de acceso.
- Flujo de concesión implícito : el usuario inicia sesión desde la aplicación cliente, el servidor de autorización emite un token de acceso a la aplicación cliente directamente.
¿Cuál es la diferencia entre los dos enfoques en términos de seguridad? ¿Cuál es más seguro y por qué?
No veo una razón por la que se agrega un paso adicional (código de autorización de intercambio para token) en un flujo de trabajo cuando el servidor puede emitir directamente un token de acceso.
Diferentes sitios web dicen que el flujo de código de autorización se usa cuando la aplicación cliente puede mantener seguras las credenciales. ¿Por qué?
Respuestas:
Esto
access_token
es lo que necesita llamar un recurso protegido (una API). En el flujo del Código de autorización hay 2 pasos para obtenerlo:code
al consumidor API (llamado "Cliente").code
obtenido en el # 1 por unaccess_token
, autenticándose con unclient_id
yclient_secret
access_token
.Entonces, hay una doble verificación: el usuario que posee los recursos surgió a través de una API y el cliente que usa la API (por ejemplo, una aplicación web). Ambos están validados para que se otorgue acceso. Observe la naturaleza de "autorización" de OAuth aquí: el usuario concede acceso a su recurso (a través de la
code
devolución después de la autenticación) a una aplicación, la aplicación obtiene unaccess_token
y llama en nombre del usuario.En el flujo implícito, se omite el paso 2. Entonces, después de la autenticación del usuario,
access_token
se devuelve un directamente, que puede usar para acceder al recurso. La API no sabe quién llama a esa API. Cualquiera con elaccess_token
lata, mientras que en el ejemplo anterior solo la aplicación web lo haría (es interna normalmente no es accesible para nadie).El flujo implícito generalmente se usa en escenarios donde se almacena
client id
yclient secret
no se recomienda (un dispositivo, por ejemplo, aunque muchos lo hacen de todos modos). Eso es lo que significa el descargo de responsabilidad. Las personas tienen acceso al código del cliente y, por lo tanto, pueden obtener las credenciales y pretender convertirse en clientes de recursos. En el flujo implícito, todos los datos son volátiles y no hay nada almacenado en la aplicación.fuente
/authorize
solicitud. El navegador y el sitio web que intentan llamar a la API (también conocido como el cliente). Ese es elredirect_uri
+code
devuelto por el AS después de una autenticación exitosa. Finalmente, el cliente llama al AS detrás de escena, intercambiando elcode
por unaccess_token
. Este es eltoken endpoint
en la literatura. En general, el AS nunca llama a nadie. Siempre responde.Agregaré algo aquí que no creo que quede claro en las respuestas anteriores:
tl; dr no use el flujo implícito si no confía en la máquina de los usuarios para guardar tokens pero sí confía en sus propios servidores.
fuente
access_token
con la ayuda deauthorization code
.La diferencia entre ambos es que:
En el flujo implícito, el token se devuelve directamente a través de la URL de redireccionamiento con el signo "#" y esto se usa principalmente en clientes javascript o aplicaciones móviles que no tienen el lado del servidor, y el cliente no necesita proporcionar su secreto en algunas implementaciones .
En el flujo de código de autorización, el código se devuelve con "?" para ser legible por el lado del servidor, entonces el lado del servidor debe proporcionar el secreto del cliente esta vez a la URL del token para obtener el token como objeto json del servidor de autorización. Se usa en caso de que tenga un servidor de aplicaciones que pueda manejar esto y almacenar el token de usuario con su perfil en su propio sistema, y se usa principalmente para aplicaciones móviles comunes.
por lo tanto, depende de la naturaleza de su aplicación cliente, cuál es un "Código de autorización" más seguro, ya que se solicita el secreto en el cliente y el token se puede enviar entre el servidor de autorización y la aplicación cliente en una conexión muy segura, y el proveedor de autorización puede restringir a algunos clientes a usar solo "Código de autorización" y no permitir lo implícito
fuente
La concesión implícita es similar a la concesión del código de autorización con dos diferencias distintas.
Está destinado a ser utilizado por clientes basados en agentes de usuario (por ejemplo, aplicaciones web de una sola página) que no pueden mantener en secreto a un cliente porque todo el código de la aplicación y el almacenamiento son fácilmente accesibles.
En segundo lugar, en lugar de que el servidor de autorización devuelva un código de autorización que se intercambia por un token de acceso, el servidor de autorización devuelve un token de acceso.
Encuentre los detalles aquí http://oauth2.thephpleague.com/authorization-server/which-grant/
fuente
Flujo implícito
Ventajas
Desventajas
Flujo de código de autorización
Ventajas
Desventajas
Cita: https://developers.google.com/actions/develop/identity/oauth2-overview#supported_oauth_20_flows
fuente
Permítanme resumir los puntos que aprendí de las respuestas anteriores y agregar algunos de mis propios entendimientos.
Código de autorización de flujo !!!
Subvención implícita de flujo!
fuente
Ambos son seguros, depende del entorno que lo esté utilizando.
Es simple. Tu cliente no es seguro. Vamos a verlo en detalles.
Considere que está desarrollando una aplicación en contra
Instagram API
, por lo que registra su aplicaciónInstagram
y define cuálAPI's
necesita.Instagram
le proporcionaráclient_id
yclient_secrect
En su sitio web configura un enlace que dice. "Ven y usa mi aplicación". Al hacer clic en esto, su aplicación web debe realizar dos llamadas
Instagram API
.First
envíe una solicitud aInstagram Authentication Server
con los siguientes parámetros.No envía
client_secret
, no puede confiar en el cliente (el usuario y / o su navegador que intentan usar su aplicación). El cliente puede ver el script de url o java y encontrarloclient_secrect
fácilmente. Por eso necesitas otro paso.Recibe un
code
ystate
. Elcode
aquí estátemporary
y no se guarda en ningún lado.Luego haces una
second
llamada aInstagram API
(desde tu servidor)A medida que la llamada se realiza desde nuestro servidor, podemos usar de forma segura
client_secret
(que muestra cómo estamos) con locode
que muestra que el usuario ha concedidoclient_id
usar el recurso.En respuesta tendremos
access_token
fuente
Desde una perspectiva práctica (lo que entendí), la razón principal para tener flujo de código Authz es:
"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 rechaza la solicitud de acceso del cliente"
Además de eso, al usar tokens de actualización, las aplicaciones pueden obtener acceso a largo plazo a los datos del usuario.
fuente
Parece que hay dos puntos clave, no discutidos hasta ahora, que explican por qué el desvío en el Tipo de concesión del código de autorización agrega seguridad.
Breve historia : el tipo de concesión de código de autorización mantiene información confidencial del historial del navegador, y la transmisión del token depende solo de la protección HTTPS del servidor de autorización.
Versión más larga:
A continuación, seguiré con la terminología de OAuth 2 definida en el RFC (es una lectura rápida): servidor de recursos , cliente , servidor de autorización , propietario del recurso .
Imagine que desea que una aplicación de terceros (= cliente) acceda a ciertos datos de su cuenta de Google (= servidor de recursos). Supongamos que Google usa OAuth 2. Usted es el propietario de los recursos de la cuenta de Google, pero en este momento opera la aplicación de terceros.
Primero, el cliente abre un navegador para enviarlo a la URL segura del servidor de autorización de Google. Luego, aprueba la solicitud de acceso, y el servidor de autorización lo envía de regreso a la URL de redireccionamiento previamente proporcionada por el cliente, con el código de autorización en la cadena de consulta. Ahora para los dos puntos clave:
Con el Tipo de concesión de código de autorización, el token se obtiene finalmente mediante una llamada del cliente al servidor de autorización, donde la seguridad de la transmisión solo depende del servidor de autorización , no del cliente.
fuente