oauth-2.0

oauth 2.0 - Diferencia entre el "Flujo de contraseña del propietario del recurso" y el "Flujo de credenciales del cliente"



oauth-2.0 (4)

La diferencia entre el "Flujo de contraseña del propietario del recurso" y el "Flujo de credenciales del cliente" no me parece clara. El primero parece enviar las credenciales de contraseña al servidor para su verificación, mientras que el segundo también se autentica con el servidor de alguna manera, pero la especificación no especifica qué método se usa aquí. ¿Este flujo está diseñado para sesiones de cookies? La especificación realmente no proporciona un caso de uso claro.

De la especificación OAuth 2.0:

+---------+ +---------------+ | | | | | |>--(A)- Client Authentication --->| Authorization | | Client | | Server | | |<--(B)---- Access Token ---------<| | | | | | +---------+ +---------------+ Figure 6: Client Credentials Flow

y

+----------+ | Resource | | Owner | | | +----------+ v | Resource Owner (A) Password Credentials | v +---------+ +---------------+ | |>--(B)---- Resource Owner ------->| | | | Password Credentials | Authorization | | Client | | Server | | |<--(C)---- Access Token ---------<| | | | (w/ Optional Refresh Token) | | +---------+ +---------------+ Figure 5: Resource Owner Password Credentials Flow


Además de la respuesta del usuario 3287829. Quiero añadir lo siguiente.

Como dijo el RFC sobre la concesión de credenciales del cliente.

El cliente realiza una solicitud al punto final de token agregando el
siguiendo los parámetros usando "application / x-www-form-urlencoded"
Formato según el Apéndice B con una codificación de caracteres de UTF-8 en el HTTP
petición entidad-cuerpo:

grant_type REQUIRED. El valor DEBE establecerse en "client_credentials".

alcance OPCIONAL. El alcance de la solicitud de acceso como se describe en la Sección 3.3.

El cliente DEBE autenticar con el servidor de autorización como
descrito en la Sección 3.2.1.

Por ejemplo , el cliente realiza la siguiente solicitud HTTP usando
Seguridad de la capa de transporte (con saltos de línea adicionales solo para fines de visualización):

POST /token HTTP/1.1 Host: server.example.com Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW Content-Type: application/x-www-form-urlencoded grant_type=client_credentials

El servidor de autorización DEBE autenticar al cliente.

El cliente debe estar previamente registrado en el servidor de autorizaciones. y la Authorization incluye la credencial del cliente que será autenticada por el servidor.


Además, en términos de auditoría, el propietario del recurso es una mejor manera, ya que puede identificar por access_token a qué usuario específico está llamando a su api a través de la aplicación cliente, mientras que client_credential identifica solo al cliente de la aplicación


El flujo de credenciales del cliente solo requiere client_id y client_secret. El flujo del propietario del recurso requiere la contraseña del usuario.

El flujo de credenciales del cliente permite que una aplicación obtenga un token sin el contexto del usuario.


Un buen ejemplo de esto sería el siguiente:

Supongamos que eres una empresa de estadísticas llamada AllStats que tiene su propia base de usuarios donde cada usuario tiene su propio nombre de usuario y contraseña. AllStats tiene su propio sitio web existente que dogfoods tiene su propia API. Sin embargo, AllStats ahora quiere lanzar una aplicación móvil.

Dado que la aplicación móvil será una aplicación de primera parte (ver: desarrollada por AllStats), el flujo de contraseña del propietario del recurso tiene mucho sentido. Querrá que el usuario obtenga una pantalla (nombre de usuario, contraseña) que fluye con la aplicación en lugar de transferirla a un servidor de autenticación (y luego volver a la aplicación). Los usuarios confiarán en la aplicación cuando ingresen su nombre de usuario / contraseña porque es una aplicación de primera parte.

Me gusta ver el flujo de contraseñas del propietario del recurso como un flujo que los desarrolladores de aplicaciones de terceros utilizarían, mientras que el flujo de credenciales del cliente es un flujo que los desarrolladores de aplicaciones de terceros usarían.

Imagínese si la aplicación de Facebook requiera que use el Flujo de credenciales del cliente en lugar de presentarle un formulario de nombre de usuario / contraseña. Parecería un poco extraño, ¿sí?

Ahora, si se imagina que descarga una aplicación de terceros que tenía integración con Facebook. Me imagino que usted (y la mayoría de la gente) estaría muy preocupado si la aplicación le solicitara un nombre de usuario / contraseña en lugar de usar la interfaz de usuario del flujo de credenciales del cliente.

FWIW, esto no quiere decir que las aplicaciones de terceros no utilizan el flujo de credenciales del cliente. Pero más bien tratar de pintar un escenario del mundo real (y generalización general) de cuándo se utilizará el flujo de contraseña del propietario del recurso.