【问题标题】:How do I get credentials on AWS? Must I use AWS Cognito SDK or AWS SDK?如何在 AWS 上获取凭证?我必须使用 AWS Cognito 开发工具包或 AWS 开发工具包吗?
【发布时间】:2017-05-14 04:25:20
【问题描述】:

我正在使用 AWS 开发工具包为 AWS S3 构建一个丰富的前端客户端。将 IAM 凭证硬编码到 AWS 开发工具包配置中效果很好,但我想通过 AWS Cognito 为最终用户提供访问权限。

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

AWS 文档非常不清楚。我见过一些使用 AWS 开发工具包的示例,还有一些我见过的示例说您需要使用不同的 AWS Cognito 开发工具包。哪个文档文章是正确的?

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


更新 2:

AWS Cognito 开发工具包已合并到一个名为 AWS Amplify 的新库中。 https://github.com/aws/aws-amplify

更新 1:

问题有两个方面。了解术语并正确设置 Cognito 是第一部分。感谢 Bruce0 让我在那里运行起来。第二部分是javascript部分。事实证明,您需要两个单独的库来纯粹通过 javascript 对 Cognito 用户进行身份验证。

这是我想出的解决方案。如果它对你来说很陌生,请确保你已经使用 promises/async/await 研究了你的 es6。要在 node 中运行它,您只需要使用 babel、preset es2015、preset stage-2 和 babel-transform-runtime 插件对其进行预处理。如果你想在浏览器中运行它,你可能需要将 babel-loader 与 webpack 一起使用(众所周知,设置起来很复杂,只是一个警告)。

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

【问题讨论】:

  • 我不会对客户端上的 aws sdk 做太多事情,因为它需要让 AWS 密钥在客户端上可用。我要么使用 cognito,要么在后端使用 aws sdk,并在客户端使用预签名请求
  • 在 Cognito 中获取凭据的唯一方法是创建一个联合身份池。 cognitoIdentity 和 credentialsProvider 方法是您获取凭据的方式。您不必联合身份来使用联合身份池,但您需要有一个 identityId(并且那些仅存在于池中)。因此,您将拥有一个 cognitoUserPool 作为联合身份池中唯一的身份验证提供程序(不会联合任何内容),并且该身份池提供 IAM 角色(通常是经过身份验证和未经身份验证的)(但您可以拥有更多角色)
  • @Bruce0 确实!这就是我到目前为止所经历的。 Cognito 似乎真正具有革命性。非常感谢您的帮助,无疑将在未来几个月内对数百万人产生积极影响,不包括空格;)

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


【解决方案1】:

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

您不必联合身份来使用联合身份池,但您需要有一个 identityId(并且那些仅存在于池中)才能获取凭据。

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

这是一个PowerPoint链接,它解释了Cognito的一些基本令人困惑的方面,希望对您有所帮助。 Cognito outline

最后,我建议您使用 AWS Mobile Hub(至少作为示例)开始实施,而不是使用 IOS 开发工具包。 Mobile Hub 是一个轻薄的包装器,但可以完成很多繁重的工作,并且架构精美。

【讨论】:

  • 所以看起来非常棒。看起来移动集线器有一些很好的设置功能。虽然它没有任何浏览器/javascript。您的回答对我仍然非常有帮助,所以当我连接它时,我可能会将其标记为正确,也许通过编辑来添加特定于浏览器的部分。非常感谢您的帮助!
  • 你是对的,移动集线器不做Javascript。但它会正确设置您的 IAM 角色,并帮助您设置身份池和用户池,并为您想要访问的内容执行 IAM 策略,除非您习惯了所有这些内容,否则它会有点精心制作的。祝你好运,谢谢
【解决方案2】:

这在下面对我有用,我设置了 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 未缩小的。对用户来说,这太多了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-24
    • 2015-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    相关资源
    最近更新 更多