amazon web services - home - Cómo obtener el ID de identidad de Cognito en AWS Lambda
https console aws amazon com lambda home region us east 1 (6)
¿Cómo puedo obtener el ID de identidad del usuario (registrado por AWS Cognito) que invocó una función de AWS Lambda? ¿Tengo que usar el SDK en la función Lambda para obtener el ID de identidad?
En AWS javascript SDK dentro de la función lambda solo use context.identity.cognitoIdentityId Está funcionando para mí
Mi observación es la siguiente.
Si llama a la puerta de enlace de la API con una solicitud firmada donde realmente proporciona la clave de acceso, el secreto y la sesiónToken que puede extraer a través de (JS SDK):
AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
AWS.config.credentials.get(..)
Y asumió que su lambda se llama desde API-Gateway a través de LAMBDA_PROXY y el Autorizador AWS_IAM. Solo puedes acceder a las cosas de usuario en lambda con:
exports.create = function (event, context) {
secdata = event.requestContext.identity.cognitoAuthenticationProvider;
}
Luego obtendrá, aparte de otras cosas, la "sub" del usuario UserPool cognito. Por lo tanto, si realmente desea saber más sobre el usuario, parece que debe volver a preguntar a AWS a través de una llamada SDK.
Para un Python Lambda, invocado a través de Javascript AWS SDK / Cognito / Amplify ...
https://docs.aws.amazon.com/lambda/latest/dg/python-context-object.html
context.identity.cognito_identity_id
Debería verse algo como esto:
{aws region}:{ GUID }
Suponiendo que está utilizando un Grupo de Identidades, esto devolverá la Identidad Federada de Cognito, que se puede usar para el control de acceso detallado. Esto es más seguro que confiar en la carga útil de Javascript que contiene el ID de identidad.
El Rol de Autenticación del Grupo de Identidad de Cognito deberá tener la política Lambda: InvokeFunction, de lo contrario, el usuario no podrá invocar la función en primer lugar.
Edición: esto funciona cuando se llama DIRECTAMENTE a la función Lambda, no a través de la puerta de enlace API.
Edit2: el usuario de Cognito puede llamar a la lambda porque está establecido explícitamente en el rol IAM Cognito Auth.
Según los documentos , parece que la información sobre el proveedor de identidad solo estaría disponible para una invocación a través del Mobile SDK.
Para solucionar esto, una opción es pasar el ID de identidad a la función manualmente como parte del evento. Suponiendo que está haciendo algo como AWS.config.credentials = new AWS.CognitoIdentityCredentials(...)
entonces debería poder obtener el ID a través de AWS.config.credentials.identityId
(una vez que se hayan actualizado las credenciales).
EDITAR : Una mejor opción para la validación de identidad es dejar que Cognito / IAM lo maneje, y asumir que si un usuario puede invocar con éxito una función Lambda, eso significa que se les permite hacerlo. En este caso, para administrar la validación por usuario, eche un vistazo a la whitelisting .
Si alguien más se encuentra con esto, creo que esto te ayudará mucho.
Tenga en cuenta que esto solo se aplica si está utilizando el Cognito User Pool Authorizer. Si desea utilizar AWS_IAM con Cognito Identitys, consulte mi ejemplo de github https://github.com/VictorioBerra/js-cognito-auth-example (lea el área EDITAR a continuación)
Si tiene marcada la opción "Usar integración de Proxy Lambda", no tendrá acceso a los Mapeos de plantilla de solicitud. Pero puede acceder a las reclamaciones dentro del token en su función lambda:
exports.handler = (event, context, callback) => {
//create a response
const response = {
statusCode: 200,
body: JSON.stringify({
"user email": event.requestContext.authorizer.claims.email,
}),
};
callback(null, response);
};
EDITAR - Más información para usar AWS_IAM como autorizador APIG
Básicamente, necesita tener su APIG asegurado con AWS_IAM Y debe autenticarse a través de una Identidad Cognita Federada que devolverá un ejemplo de sessionToken utilizando grupos de usuarios . Esto es lo que hace que las credenciales de AWS IAM sean temporales. Ahora tiene todo lo que necesita para autenticarse en su APIG.
Para probar esto, descargue la versión de escritorio del postman , agregue su API URI (obtenga esto del área de etapas) y luego, bajo Autorización, complete los 5 campos que necesita para la firma Sig4. Verá que el objeto ''evento.identidad'' en su función lambda está cargado con propiedades como el objeto de user
.
Si desea utilizar el SDK generado automáticamente por APIG, éste viene integrado con una fábrica que toma la accessKey
, el secret
y el token
y firma todo por usted. Lo mismo con el aws-sdk. Puede iniciar las credenciales con esos tres elementos y firmará automáticamente todas las solicitudes para usted con esos credenciales temporales. Si desea utilizar directamente su API con window.fetch, request, curl, (inserte el cliente http aquí) puede calcular su propio Sig4 (tenga cuidado, puede ser un poco complicado o use una biblioteca moderna para que lo haga por usted) .
También para el registro, al hacer mi investigación, noté que si no desea utilizar AWS_IAM como autorizador de APIG, y desea usar "Cognito Identity Pool Authorizer", que es una opción nueva y elegante en el menú desplegable en APIG, aún puede obtener una tonelada de información sobre el usuario en el evento lambda si acaba de pasar el JWT obtenido de una autenticación exitosa de Cognito al APIG como el encabezado de Autorización. Dentro de ese JWT hay una gran cantidad de atributos que puede personalizar en la configuración de su grupo.
Opinión profesional de IMO Creo que es preferible utilizar el autorizador de credenciales temporales de AWS_IAM. De esta manera, puede utilizar tantos IdP diferentes como desee en Cognito Identities (Facebook, Twitter, pools, etc.)
Si pasa por la puerta de enlace API, puede pasar el ID de cognito (así como el usuario arn y otra información útil) a Lambda. Esto solucionó el problema para mí.