Flujo de autenticación de grupos de identidades
Amazon Cognito sirve de ayuda a fin de crear identificadores únicos para los usuarios finales, que se mantienen homogéneos en todos los dispositivos y plataformas. También ofrece credenciales temporales con privilegios limitados a su aplicación para obtener acceso a los recursos de AWS. En esta página, se describen los aspectos básicos de cómo funciona la autenticación en Amazon Cognito y se explica el ciclo de vida de una identidad dentro del grupo de identidades.
Flujo de autenticación con proveedores externos
Un usuario que se autentique con Amazon Cognito pasa por varias etapas para iniciar el proceso de arranque de las credenciales. Amazon Cognito tiene dos flujos diferentes para la autenticación con proveedores públicos: el flujo básico y el mejorado.
Una vez que haya completado uno de estos flujos, podrá acceder a otros Servicios de AWS, tal como se define en las políticas de acceso de sus roles. De forma predeterminada, la consola de Amazon Cognito
Los grupos de identidades aceptan los siguientes artefactos de los proveedores:
Proveedor | Artefacto de autenticación |
---|---|
Grupo de usuarios de Amazon Cognito | Token de ID |
OpenID Connect (OIDC) | Token de ID |
SAML 2.0 | Aserción de SAML |
Proveedor de redes sociales | Token de acceso |
Flujo de autenticación mejorado (simplificado)
Si utiliza el flujo de autenticación mejorado, la aplicación presentará primero una prueba de autenticación de un grupo de usuarios de Amazon Cognito autorizado o de un proveedor de identidades de terceros en una solicitud GetId.
-
La aplicación presenta una prueba de autenticación (un token web JSON o una aserción de SAML) de un grupo de usuarios de Amazon Cognito autorizado o de un proveedor de identidades de terceros en una solicitud GetID.
-
El grupo de identidades devuelve un ID de identidad.
-
La aplicación combina el ID de identidad con la misma prueba de autenticación en una solicitud GetCredentialsForIdentity.
-
El grupo de identidades devuelve las credenciales de AWS.
-
La aplicación firma las solicitudes de API de AWS con las credenciales temporales.
La autenticación mejorada administra la lógica de selección de los roles de IAM y la recuperación de credenciales en la configuración del grupo de identidades. Puede configurar el grupo de identidades para que seleccione un rol predeterminado y para que aplique a la selección de roles los principios de control de acceso basado en atributos (ABAC) o de control de acceso basado en roles (RBAC). Las credenciales de AWS de la autenticación mejorada son válidas durante una hora.
Orden de las operaciones en la autenticación mejorada
-
GetId
-
GetCredentialsForIdentity
![Diagrama que muestra el flujo de la autenticación mejorada](images/amazon-cognito-ext-auth-enhanced-flow.png)
Flujo de autenticación básico (clásico)
Al utilizar el flujo de autenticación básico:
-
La aplicación presenta una prueba de autenticación (un token web JSON o una aserción de SAML) de un grupo de usuarios de Amazon Cognito autorizado o de un proveedor de identidades de terceros en una solicitud GetID.
-
El grupo de identidades devuelve un ID de identidad.
-
La aplicación combina el ID de identidad con la misma prueba de autenticación en una solicitud GetOpenIdToken.
-
GetOpenIdToken
devuelve un nuevo token de OAuth 2.0 emitido por el grupo de identidades. -
La aplicación presenta el nuevo token en una solicitud AssumeRoleWithWebIdentity.
-
AWS Security Token Service (AWS STS) devuelve las credenciales de AWS.
-
La aplicación firma las solicitudes de API de AWS con las credenciales temporales.
El flujo de trabajo básico le proporciona un control más pormenorizado sobre las credenciales que distribuye a los usuarios. La solicitud GetCredentialsForIdentity
del flujo de autenticación mejorado solicita un rol basado en el contenido de un token de acceso. La solicitud AssumeRoleWithWebIdentity
del flujo de trabajo clásico otorga a la aplicación una mayor capacidad para solicitar credenciales de cualquier rol de AWS Identity and Access Management que haya configurado con una política de confianza suficiente. También puede solicitar una duración de sesión de rol personalizada.
Puede iniciar sesión con el flujo de autenticación básico en los grupos de usuarios que no tengan asignaciones de roles. Este tipo de grupo de identidades no tiene un rol autenticado o no autenticado predeterminado, y no tiene configurado el control de acceso basado en roles o atributos. Si intenta utilizar GetOpenIdToken
en un grupo de identidades con asignaciones de roles, recibirá el siguiente error.
Basic (classic) flow is not supported with RoleMappings, please use enhanced flow.
Orden de las operaciones en la autenticación básica
-
GetId
-
GetOpenIdToken
-
AssumeRoleWithWebIdentity
![Diagrama que muestra el flujo de la autenticación básica.](images/amazon-cognito-ext-auth-basic-flow.png)
Flujo de autenticación de identidades autenticadas por el desarrollador
Cuando se utiliza Identidades autenticadas por el desarrollador, el cliente emplea otro flujo de autenticación, que incluye código fuera de Amazon Cognito para validar al usuario en el propio sistema de autenticación del desarrollador. El código por fuera de Amazon Cognito se indica como tal.
Flujo de autenticación mejorado
Orden de las operaciones en la autenticación mejorada con un proveedor de desarrollador
-
Inicio de sesión a mediante un proveedor de desarrollador (código por fuera de Amazon Cognito)
-
Validación del inicio de sesión de usuario (código por fuera de Amazon Cognito)
![Diagrama que muestra el flujo de la autenticación mejorada autenticada por el desarrollador.](images/amazon-cognito-dev-auth-enhanced-flow.png)
Orden de las operaciones en la autenticación básica con un proveedor de desarrollador
-
Implemente una lógica fuera del grupo de identidades para iniciar sesión y generar un identificador entre el desarrollador y el proveedor.
-
Recupere las credenciales de AWS del servidor almacenadas.
-
Envíe el identificador del proveedor de desarrollador en una solicitud de API GetOpenIdTokenForDeveloperIdentity firmada con credenciales autorizadas de AWS.
-
Solicite las credenciales de la aplicación con AssumeRoleWithWebIdentity.
![Diagrama que muestra el flujo de la autenticación básica autenticada por el desarrollador.](images/amazon-cognito-dev-auth-basic-flow.png)
¿Qué flujo de autenticación debo usar?
El flujo mejorado es la opción más segura y que exige menos esfuerzo al desarrollador:
-
El flujo mejorado reduce la complejidad, el volumen y la velocidad de las solicitudes de API.
-
No es necesario que la aplicación realice solicitudes de API adicionales a AWS STS.
-
El grupo de identidades evalúa a los usuarios para determinar las credenciales de rol de IAM que deben recibir. No es necesario incorporar en el cliente la lógica de selección de roles.
importante
Como práctica recomendada, cuando cree un grupo de identidades nuevo, no active la autenticación básica (clásica) de forma predeterminada. Para implementar una autenticación básica, primero debe evaluar las relaciones de confianza de los roles de IAM para las identidades web. A continuación, incorpore la lógica de selección de roles al cliente y proteja a este contra cualquier modificación que intenten los usuarios.
El flujo de autenticación básico delega la lógica de selección del rol de IAM a la aplicación. En este flujo, Amazon Cognito valida la sesión autenticada o no autenticada del usuario y emite un token con el que puede intercambiar credenciales con AWS STS. Los usuarios pueden intercambiar los tokens de la autenticación básica por cualquier rol de IAM que confíe en su grupo de identidades y amr
o el estado autenticado o no autenticado.
Tenga también en cuenta que la autenticación del desarrollador es un método abreviado para validar la autenticación del proveedor de identidades. Amazon Cognito confía en las credenciales de AWS que autorizan una solicitud GetOpenIdTokenForDeveloperIdentity sin necesidad de validar adicionalmente el contenido de la solicitud. Proteja los secretos que autorizan la autenticación del desarrollador para que los usuarios no puedan acceder a ellos.
Resumen de las API
- GetId
-
La llamada a la API GetId es la primera llamada requerida para establecer una nueva identidad en Amazon Cognito.
- Acceso sin autenticar
-
Amazon Cognito permite acceder a sus aplicaciones como invitado no autenticado. Si esta característica está habilitada en el grupo de identidades, los usuarios pueden solicitar un ID de identidad nuevo en cualquier momento mediante la API
GetId
. Se espera que la aplicación almacene en caché este ID de identidad para realizar llamadas posteriores a Amazon Cognito. Los SDK para móviles de AWS y el AWS SDK para JavaScript del navegador tienen proveedores de credenciales que gestionan el almacenamiento en caché en su nombre. - Acceso autenticado
-
Si configura su aplicación para que sea compatible con un proveedor de inicio de sesión público (Facebook, Google+, Login with Amazon o Sign in with Apple), los usuarios también pueden suministrar tokens (OAuth u OpenID Connect) que los identifiquen en dichos proveedores. Cuando se utiliza en una llamada a
GetId
, Amazon Cognito crea una identidad autenticada nueva o devuelve la identidad ya asociada a ese inicio de sesión en particular. Para ello, Amazon Cognito valida el token con el proveedor y se asegura de que se cumpla lo siguiente:-
El token es válido y del proveedor configurado.
-
El token no está caducado.
-
El token coincide con el identificador de aplicaciones creado en dicho proveedor (por ejemplo, el ID de aplicación de Facebook).
-
El token coincide con el identificador de usuario.
-
- GetCredentialsForIdentity
-
Se puede llamar a la API GetCredentialsForIdentity después de establecer un ID de identidad. La función de esta operación equivale a hacer una llamada a GetOpenIdToken y luego a AssumeRoleWithWebIdentity.
Para que Amazon Cognito llame a
AssumeRoleWithWebIdentity
en su nombre, el grupo de identidades debe tener roles de IAM asociados. Puede hacerlo a través de la consola de Amazon Cognito o manualmente mediante la operación SetIdentityPoolRoles. - GetOpenIdToken
-
Realice una solicitud de API GetOpenIdToken después de establecer un ID de identidad. Guarde en caché los ID de identidad después de la primera solicitud e inicie las sesiones básicas (clásicas) posteriores para esa identidad con
GetOpenIdToken
.La respuesta a una solicitud de la API
GetOpenIdToken
es un token que genera Amazon Cognito. Puede enviar este token como parámetroWebIdentityToken
en una solicitud AssumeRoleWithWebIdentity.Antes de enviar el token de OpenID, verifíquelo en su aplicación. Puede utilizar las bibliotecas OIDC del SDK o una biblioteca como aws-jwt-verify
para confirmar que Amazon Cognito ha emitido el token. El ID de clave de firma, o kid
, del token de OpenID es uno de los que figuran en el documento jwks_uri† de Amazon Cognito Identity. Estas claves están sujetas a cambios. La función que verifica los tokens de Amazon Cognito Identity debe actualizar periódicamente su lista de claves desde el documento jwks_uri. Amazon Cognito establece la duración de la actualización en el encabezado de respuesta de cache-control jwks_uri, que actualmente está establecido max-age
en 30 días.- Acceso sin autenticar
-
Para obtener un token para una identidad sin autenticar, solo necesita el ID de identidad. No es posible obtener un token sin autenticar para identidades autenticadas o que se han desactivado.
- Acceso autenticado
-
Si tiene una identidad autenticada, debe transmitir al menos un token válido para un inicio de sesión que ya esté asociado a dicha identidad. Todos los tokens que se transmitan durante la llamada
GetOpenIdToken
deben pasar la misma validación mencionada anteriormente; si alguno de los tokens falla, toda la llamada fallará. La respuesta de la llamadaGetOpenIdToken
también incluye el ID de identidad. Esto se debe a que el ID de identidad que pasa puede que no sea el que se devuelve. - Vinculación de inicios de sesión
-
Si envía un token para un inicio de sesión que todavía no tiene ninguna identidad asociada, se considerará que el inicio de sesión está “vinculado" a la identidad asociada. Solo puede vincular un inicio de sesión por proveedor público. Los intentos de vincular más de un inicio de sesión a un proveedor público generan una respuesta de error
ResourceConflictException
. Si un inicio de sesión solo está vinculado a una identidad existente, el ID de identidad queGetOpenIdToken
devuelva será el mismo que el que se pasó. - Combinación de identidades
-
Si pasa un token para un inicio de sesión que no está vinculado a la identidad determinada, pero está vinculado a otra identidad, las dos identidades se combinan. Una vez combinadas, una identidad se convertirá en la identidad principal/propietaria de todos los inicios de sesión asociados mientras que la otra se deshabilitará. En este caso, se devuelve el ID de identidad principal/propietario. Debe actualizar la caché local si este valor difiere. Los proveedores de los AWS SDK para móviles o el AWS SDK para JavaScript en el navegador realizan esta operación en su lugar.
- GetOpenIdTokenForDeveloperIdentity
-
La operación GetOpenIdTokenForDeveloperIdentity sustituye el uso de GetId y GetOpenIdToken desde el dispositivo cuando se utilizan identidades autenticadas por el desarrollador. Dado que la aplicación firma las solicitudes a esta operación de API con credenciales de AWS, Amazon Cognito confía en que el identificador de usuario suministrado en la solicitud sea válido. La autenticación de desarrollador sustituye la validación de token que Amazon Cognito realiza con los proveedores externos.
La carga útil de esta API incluye una asignación
logins
. Esta asignación debe contener la clave del proveedor de desarrollador y un valor para el identificador del usuario en su sistema. Si el identificador de usuario todavía no está vinculado a una identidad existente, Amazon Cognito crea una identidad nueva y devuelve el ID de la identidad nueva y un token de OpenID Connect para dicha entidad. Si el identificador del usuario ya está vinculado, Amazon Cognito devuelve el ID de identidad preexistente y un token de OpenID Connect. Guarde en caché los ID de identidad del desarrollador después de la primera solicitud e inicie las sesiones básicas (clásicas) posteriores para esa identidad conGetOpenIdTokenForDeveloperIdentity
.La respuesta a una solicitud de la API
GetOpenIdTokenForDeveloperIdentity
es un token que genera Amazon Cognito. Puede enviar este token como parámetroWebIdentityToken
en una solicitudAssumeRoleWithWebIdentity
.Antes de enviar el token de OpenID Connect, verifíquelo en su aplicación. Puede utilizar las bibliotecas OIDC del SDK o una biblioteca como aws-jwt-verify
para confirmar que Amazon Cognito ha emitido el token. El ID de clave de firma, o kid
, del token de OpenID Connect es uno de los que figuran en el documento jwks_uride Amazon Cognito Identity†. Estas claves están sujetas a cambios. La función que verifica los tokens de Amazon Cognito Identity debe actualizar periódicamente su lista de claves desde el documento jwks_uri. Amazon Cognito establece la duración de la actualización en el encabezado de respuesta de cache-control
jwks_uri, que actualmente tiene establecidomax-age
en 30 días.- Vinculación de inicios de sesión
-
De igual modo que ocurre con los proveedores externos, si se suministran inicios de sesión adicionales que todavía no están asociados a una identidad, los inicios de sesión se vincularán implícitamente a dicha identidad. Si enlaza un inicio de sesión de proveedor externo a una identidad, el usuario puede utilizar el flujo de autenticación del proveedor externo con ese proveedor. Sin embargo, no pueden usar el nombre del proveedor de desarrolladores en el mapa de inicios de sesión al ejecutar
GetId
oGetOpenIdToken
. - Combinación de identidades
-
En cuanto a las identidades que autentica el desarrollador, Amazon Cognito es compatible con la combinación implícita y explícita mediante la API MergeDeveloperIdentities. La combinación explícita le permite marcar dos identidades con los identificadores de usuario de su sistema como una identidad única. Tan solo debe proporcionar los identificadores de usuario de origen y de destino, y Amazon Cognito los combinará. La siguiente vez que solicite un token de OpenID Connect para cada una de las identidades de usuario, se devolverá el mismo ID de identidad.
- AssumeRoleWithWebIdentity
-
Una vez que tenga un token de OpenID Connect, lo puede intercambiar por las credenciales temporales de AWS a través de la solicitud de API AssumeRoleWithWebIdentity en AWS Security Token Service (AWS STS).
Dado que no hay restricciones en cuanto al número de identidades que se pueden crear, es importante comprender los permisos que va a conceder a los usuarios. Debe configurar roles de IAM diferentes para la aplicación: uno para los usuarios sin autenticar y otro para los usuarios autenticados. La consola de Amazon Cognito puede crear roles predeterminados la primera vez que configure el grupo de identidades. Estos roles no tienen en la práctica permisos concedidos. Modifíquelos para adaptarlos a sus necesidades.
Obtener más información sobre Confianza y permisos de rol.
† El documento jwks_uri
Región de AWS | Ruta al documento jwks_uri |
---|---|
AWS GovCloud (US-West) | https://cognito-identity.us-gov-west-1.amazonaws.com/.well-known/jwks_uri |
China (Beijing) | https://cognito-identity.cn-north-1.amazonaws.com.cn/.well-known/jwks_uri |
Opt-in Regions like Europe (Milan) and Africa (Cape Town) | https://cognito-identity. |
También puede extrapolar el jwks_uri del emisor o el iss
que recibe en el token de OpenID desde Amazon Cognito. El punto de conexión de detección estándar de OIDC <issuer>/.well-known/openid-configuration
muestra una ruta al jwks_uri para su token.