如何在AWS上获取凭据?我必须使用AWS Cognito SDK或AWS SDK吗?

时间:2016-12-29 20:14:39

标签: javascript amazon-web-services aws-sdk amazon-iam amazon-cognito

我正在使用AWS SDK为AWS S3构建一个丰富的前端客户端。它可以很好地将IAM凭证硬编码到AWS SDK配置中,但我想通过AWS Cognito配置对最终用户的访问。

如何获取我在Cognito用户池中创建的用户的凭据?

AWS文档非常不清楚。我见过使用AWS SDK的示例和我见过的示例,您需要拥有不同的AWS Cognito SDK。哪个文档文章是正确的?

对于这个特定的项目,我想要使用第三方联合身份。

更新2:

AWS Cognito SDK已合并到名为AWS Amplify的新库中。 https://github.com/aws/aws-amplify

更新1:

问题是双重的。理解术语和正确设置Cognito是第一部分。感谢Bruce0让我在那里跑步。第二部分是javascript部分。事实证明,您需要两个单独的库来完全从javascript验证Cognito用户。

这是我提出的解决方案。如果它看起来很陌生,请确保您已经使用promises / async / await研究了es6。要在节点中运行它,您只需要使用babel,预设es2015,预设stage-2和babel-transform-runtime插件对其进行预处理。如果你想在浏览器中运行它,你可能需要在webpack中使用babel-loader(设置起来非常复杂,只是预警)。

import AWS from 'aws-sdk/global';
import S3 from 'aws-sdk/clients/s3';
import {
  AuthenticationDetails,
  CognitoUser,
  CognitoUserPool,
} from 'amazon-cognito-identity-js';

const REGION = 'some-string-value';
const USER_POOL_ID = 'some-string-value';
const IDENTITY_POOL_ID = 'some-string-value';
const APP_CLIENT_ID = 'some-string-value';
const POOL_KEY = `cognito-idp.${REGION}.amazonaws.com/${USER_POOL_ID}`;

let Username = 'some-string-value';
let Password = 'some-string-value';

let authenticationDetails = new AuthenticationDetails({
  Username,
  Password
});

let userPool = new CognitoUserPool({
  UserPoolId: USER_POOL_ID,
  ClientId: APP_CLIENT_ID
});

let cognitoUser = new CognitoUser({
  Username,
  Pool: userPool
});

let skateboards = {
  mfaRequired(codeDeliveryDetails) {
    let mfaCode = prompt('MFA code is required!');

    cognitoUser.sendMFACode(mfaCode, mfaRequired);
  },
  newPasswordRequired(userAttributes, requiredAttributes) {
    delete userAttributes.email_verified; // it's returned but not valid to submit

    let newPassword = prompt('A new password is required!');

    cognitoUser.completeNewPasswordChallenge(newPassword, userAttributes, newPasswordRequired);
  }
};

let updateAWSCreds = (jwtToken) => {
  AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: IDENTITY_POOL_ID,
    Logins: {
      [POOL_KEY]: jwtToken
    }
  });
};

let authenticateCognitoUser = async ({mfaRequired, newPasswordRequired} = skateboards) => {
  return new Promise((resolve, reject) => {
    cognitoUser.authenticateUser(authenticationDetails, {
      onSuccess(result) {
        let jwtToken = result.getIdToken().getJwtToken();
        updateAWSCreds(jwtToken);
        resolve();
      },
      onFailure(err) {
        reject(err);
      },
      mfaRequired,
      newPasswordRequired
    });
  });
};

let doSomethingInS3ForExample = async () => {
  await authenticateCognitoUser();

  // now do your stuff
};

doSomethingInS3ForExample();

https://gist.github.com/sbussard/7344c6e1f56051da0758d1403a4343b1

2 个答案:

答案 0 :(得分:5)

在Cognito中获取凭据的唯一方法是创建联合身份池。 cognitoIdentity和credentialsProvider方法是您获取凭据的方式。

您不必使用联合身份池来使用联合身份池,但您需要拥有identityId(以及那些仅存在于池中)以获取凭据。

因此,您将使用cognitoUserPool作为联合身份池中的唯一身份验证提供程序(不会进行任何联合),并且该身份池提供IAM角色(通常是经过身份验证和未经身份验证)(但您可以拥有更多角色)。 / p>

这是一个关于powerpoint的链接,解释了Cognito的一些基本混淆方面,我希望有所帮助。 Cognito outline

最后,我建议您使用AWS Mobile Hub(至少作为示例)开始实施,而不是使用IOS SDK。移动中心是一个薄的包装,但做了大量的升降,并且很好地构建。

答案 1 :(得分:0)

下面这对我有用,我设置了cognito来创建一个身份池,并使用IAM将配置文件添加到用户(我完全遵循此链接:https://docs.aws.amazon.com/sdk-for-javascript/v2/developer-guide/s3-example-photo-album.html

import S3 from 'aws-sdk/clients/s3'
import AWS from 'aws-sdk/global'

AWS.config.update({
  region: process.env.AZ_REGION,
  credentials: new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'XXX'
  })
});

const s3 = new AWS.S3({
apiVersion: '2006-03-01',
params: {Bucket: process.env.AZ_BUCKETNAME},
      });

我只希望我们不需要导入aws-sdk / global,它本身是206k最小的。足以让用户失望。