typescript - funciona - ¿Cómo hacer que el acceso no autenticado funcione con Amazon Cognito?
como funciona cognito (1)
- Creé Identidad Federada
- Habilitado el acceso no autenticado con la casilla de verificación
- Se creó el rol asociado con esta identidad y se le otorgó acceso de administrador , por lo que debe tener todos los permisos.
- Luego agrego este código para subir archivos a AWS S3, funciona con acceso / claves secretas, que no me gustaría exponer a la interfaz de usuario, pero no funciona con Cognito
Para ser claros, todo es JavaScript de cliente y quiero que todo no tenga servidor, por lo que no tengo mi propia API y no implementaré un proveedor de acceso personalizado en mi extremo. Solo quiero evitar la exposición de mi acceso y clave secreta en la interfaz de usuario.
/**
* Handle file upload with Amazon S3 bucket
* @param id - record ID in local DB
* @param doc - file to be uploaded, taken from event.target.files
* @param done - callback to call after upload
*/
public sendFileToAws(id: number, doc: File, done: Function) {
// @Todo : Move to config
let pointer = this;
aws.config.region = pointer.awsRegion;
aws.config.credentials = new aws.CognitoIdentityCredentials({
IdentityPoolId: ''us-east-1:e48af67b-c315-47ca-b816-000000000000'',
RoleArn: ''arn:aws:iam::000000000000:role/GognitoSuperUserRole'',
AccountId: ''000000000000''
});
//aws.config.update({
// region: pointer.awsRegion,
// accessKeyId: pointer.awsAccessKey,
// secretAccessKey: pointer.awsSecretKey
//});
let server = new aws.S3({ params: { Bucket: pointer.awsStorageName } });
let directory = pointer.getDocumentDirectory() + ''/'' + id + ''-'' + doc.name;
let params = {
Key: directory,
ContentType: doc.type,
Body: doc,
Bucket: pointer.awsStorageName,
ACL: pointer.awsPermission
};
server.upload(params, (e, data) => {
done(e, data);
});
}
Me devuelve el siguiente error:
<ErrorResponse xmlns="https://sts.amazonaws.com/doc/2011-06-15/">
<Error>
<Type>Sender</Type>
<Code>AccessDenied</Code>
<Message>Not authorized to perform sts:AssumeRoleWithWebIdentity</Message>
</Error>
<RequestId>28b768a5-8f30-11e7-a7bf-4b5038235cb8</RequestId>
</ErrorResponse>
También estoy trabajando en una aplicación de tipografía frontal que utiliza identidades autenticadas y no autenticadas de Cognito.
Para las identidades no autenticadas, mi flujo se ve así:
- Cree una nueva identidad en el grupo de identidades usando
CognitoIdentity.getId()
. - Cree un objeto de credenciales utilizando el ID del grupo de identidades y el nuevo ID de identidad únicamente.
Ese código se ve así:
var cognitoidentity = new AWS.CognitoIdentity();
var params = {
IdentityPoolId: ''us-east-1:bxxxxxx-cxxx-4xxx-8xxx-9xxxxxxxxxxx''
};
// tslint:disable-next-line:no-any
cognitoidentity.getId(params, function(err: any, data: any) {
if (err) {
console.log(err, err.stack); // an error occurred
} else {
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
IdentityPoolId: ''us-east-1:bxxxxxxx-cxxx-4xxx-8xxx-9xxxxxxxxxxx'',
IdentityId: data.IdentityId
});
// access AWS resources
}
});
Esto dará como resultado que su aplicación obtenga credenciales de IAM temporales (clave de acceso, clave secreta, token de sesión) que se utilizan para acceder a los recursos de back-end.
La función que se asume al usar estas claves será la función que configuró en la configuración del conjunto de identidades:
De esta forma, tampoco tiene que exponer el nombre de la función IAM en el navegador. AWS simplemente asumirá la función correcta en función de las claves de IAM.
Happy Hacking!