que funciona como cognito typescript amazon-s3

typescript - funciona - ¿Cómo hacer que el acceso no autenticado funcione con Amazon Cognito?



como funciona cognito (1)

  1. Creé Identidad Federada
  2. Habilitado el acceso no autenticado con la casilla de verificación
  3. Se creó el rol asociado con esta identidad y se le otorgó acceso de administrador , por lo que debe tener todos los permisos.
  4. 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!