Estoy creando una aplicación sin servidor utilizando las siguientes tecnologías de AWS:
Todas las solicitudes del cliente (programadas en Angular2) pasan por la puerta de enlace API.
Creé un rol de IAM para usuarios registrados: Cognito_MyApp_Auth . Utilizo un Cognito User Pool Authorizer para asegurarme de que todas las llamadas a mi API provengan de usuarios registrados válidos.
Pregunta: ¿Cómo puedo otorgar a la función Lambda el mismo permiso que el usuario que inició sesión?
Caso de uso: un usuario que haya iniciado sesión solo puede crear, editar o eliminar en su propio depósito de S3, por lo que otorgar permiso completo de Lambda a S3 no es una opción.
Cognito_MyApp_Auth no establece diferentes permisos de usuario a usuario. Solo define los permisos para cualquier usuario firmado. Por lo tanto, debe permitir el acceso a todos los depósitos en la política de este rol. (Sin embargo, limitaría este acceso a depósitos que comiencen con un prefijo específico).
Afortunadamente, cuando Lambda se invoca a través de Cognito SDK, utilizando las credenciales proporcionadas por Cognito, el objeto de contexto que se pasa al controlador lleva la identidad de Cognito utilizada para invocar a Lambda.
Para Node.js puede ver cómo obtener esta información:
if (typeof context.identity !== 'undefined') { console.log('Cognito identity ID =', context.identity.cognitoIdentityId); }Una vez que tenga la identificación de identidad, puede configurar su propia lógica para limitar el acceso del usuario a su propio depósito.
Este fue el caso cuando llamó a Lambda directamente desde la aplicación utilizando Cognito SDK. Si usa API Gateway, hay una buena publicación de un empleado de AWS: https://forums.aws.amazon.com/thread.jspa?messageID=717379
No existe una forma directa de otorgar a la función Lambda los mismos permisos que el usuario que inició sesión; sin embargo, debería poder implementar su caso de uso utilizando grupos de identidades y políticas de Cognito utilizando la variable de contexto de identidad de cognito.
Para este enfoque, no utilizará grupos de usuarios de Cognito ni el autorizador de grupos de usuarios de Cognito. En su lugar, utiliza un grupo de identidades de Cognito para la identidad federada. Establezca la autorización en sus métodos API como AWS_IAM. No use Lambda como integración, sino use el proxy de AWS para integrarse directamente en S3. Configure la solicitud de integración para usar la identidad de la persona que llama.
Para llamar a la API, deberá usar Cognito para obtener credenciales temporales y luego firmar su solicitud de API con ellas.
Con este enfoque, la llamada de S3 se realiza con el contexto de identidad de Cognito, por lo que puede adjuntar una política que utilice variables de identidad de cognito al rol de IAM asociado con usuarios autenticados en su grupo de identidades de Cognito.
Por ejemplo:
{ "Effect": "Allow", "Action": [ "s3:PutObject" ] "Resource": [ "arn:aws:s3:::BUCKET_FOR_USER_${cognito-identity.amazonaws.com:sub}/*" ] }Vea esta publicación para un caso de uso similar.