Search code examples
javascriptamazon-cognitoaws-sdk-js

How to turn an CognitoAuth auth object into AWS-SDK credentials


I have a cognito userpool and i can successfully log into my app with the following code:

const authData = {
        ClientId : '2222222222222', // Your client id here
        AppWebDomain : '1111111111.auth.us-east-1.amazoncognito.com',
        TokenScopesArray : ['openid'],
        RedirectUriSignIn : 'https://app.domain.com',
        RedirectUriSignOut : 'https://app.domain.com'
    };
    const CognitoAuth = AmazonCognitoIdentity.CognitoAuth;

    const auth = new CognitoAuth(authData);



    auth.userhandler = {
        /**onSuccess: <TODO: your onSuccess callback here>,
         onFailure: <TODO: your onFailure callback here>*/

        onSuccess: function(result: any) {
            console.log("COGNITO SUCCESS!");
            console.log(result);
        },
        onFailure: function(err: any) {
            console.log("COGNITO FAIL!");
            console.log(err);
        }
    };

    auth.getSession();

    const curUrl = window.location.href;
    auth.parseCognitoWebResponse(curUrl);

I now have an auth object that I would like to parlay into some sort of credentials for the aws-sdk that i have so that i can list items into an S3 bucket, assuming the correct policies in my attached roles.

something like this, but realize this doesn't work:

AWS.config.credentials = auth.toCredentials();  //<== hoping for magic
const s3 = new AWS.S3();
s3.listObjectsV2(listObjectsV2Params, function(err: any, data: any) {
        if (err) console.log(err, err.stack); // an error occurred
        else     console.log(data.Contents[0]);           // successful response
    });

Is this possible, and if so how do i do that?

UDPATE

Accepted answer worked and was a big help, adding some additions for clarity along the lines of trouble I ran into.

const creds = new AWS.CognitoIdentityCredentials({
                IdentityPoolId: 'us-east-1:b111111-1111-1111-1111-1111111',  // <-- This is in your Federated Identity if you have that set up, you have to "edit" the identity pool to get it, logging into cognito its a different screen.
                Logins: {
                    "cognito-idp.us-east-1.amazonaws.com/us-east-1_BBBB1BBBBV2B": result.idToken.jwtToken  // <- this login [POOL ID] is not the pool ARN, you need it in this format.
                }
            });

this link helped me.


Solution

  • This is possible and following are the steps.

    • To allow AWS resources access for AWS Userpool Users, it also requires to configure AWS Identity Pools registering the UserPool as a provider.
    • The IAM Role assigned for the authenticated user needs to have access to S3.
    • Using the AWS SDK for Identity Pools, UserPools JWT token can be exchanged for temporal AccessKey and SecretKey to use AWS SDK for S3.

          AWS.config.credentials = new AWS.CognitoIdentityCredentials({
            IdentityPoolId: IDENTITY_POOL_ID,
            Logins: {
              [USER_POOL_TOKEN]: result.idToken.jwtToken
            }
          });
      
          AWS.config.credentials.refresh((error) => {
            if (error) {
              console.error(error);
            } else {
              console.log('Successfully logged!');
            }
          });
      
    • Inside the AWS.config.credentials.refresh callback you can call S3 since, the method internally will handle getting temporal credentials.