0

设置 我正在完成“使用 Amazon Cognito 的 Saas 身份和隔离”部署指南和随附的源代码

在部署、测试和阅读所有内容之后,我能够弄清楚

  • 如何使用每个租户的 Cognito 用户/用户池
  • 如何为每个租户创建角色
  • 如何创建基于租户的策略
  • 如何为每个租户创建身份池

主要问题 这一切是如何联系在一起的?具体来说,租户用户池中的用户如何与身份池中的策略相关联?似乎有人在“获取访问令牌(使用 IAM 策略)”周围挥舞着。这是如何运作的?自定义授权人如何适应?

更多信息 我认为它与token-manager.js:346有关

var cognitoidentity = new AWS.CognitoIdentity({apiVersion: '2014-06-30',region: configuration.aws_region});
var params = {
    IdentityId: event.IdentityId, /* required */
    //CustomRoleArn: 'STRING_VALUE',
    Logins: {
        [event.provider]: event.token,
        /* '<IdentityProviderName>': ... */
    }
};
cognitoidentity.getCredentialsForIdentity(params, function (err, data) {

我看到getCredentialsForIdentity被记录为采用 CustomRoleArn,如下所示。上面的代码已将其注释掉,但代码仍然有效。

var params = {
  IdentityId: 'STRING_VALUE', /* required */
  CustomRoleArn: 'STRING_VALUE',
  Logins: {
    '<IdentityProviderName>': 'STRING_VALUE',
    /* '<IdentityProviderName>': ... */
  }
};

自定义授权器 custom-authorizer/index.js中我能找到的与权限/策略相关 的唯一代码是:

var policy = new AuthPolicy(principalId, awsAccountId, apiOptions);
policy.allowAllMethods();
const authResponse = policy.build();

< Gasp > 这段代码看起来我们正在绕过所有策略。这个应用程序是否有可能伪造它并且只在 Angular 中处理路由?可能不是。

附加问题 我已经能够通过AWS PowerShell提取我需要知道的几乎所有内容。我不知道如何检索的一件事是用户池身份提供程序。Get-CGIPIdentityProvider cmdlet 需要“ProviderName” 。这是什么?“认知”?“www.amazon.com”?一些标识符?

如果您只是滚动到底部,请重复主要问题。这一切是如何联系在一起的?具体来说,租户用户池中的用户如何与身份池中的策略相关联?似乎有人在“获取访问令牌(使用 IAM 策略)”周围挥舞着。这是如何运作的?自定义授权人如何适应?

4

1 回答 1

0

这些角色通过认知身份池在内部关联。下面的代码显示我们通过配置来映射它。

cognito-user.js:911 - addRoleToIdentity

var cognitoidentity = new AWS.CognitoIdentity(...);

# [ ... ]

RulesConfiguration: {
    Rules: [/* required */
        {
        Claim: 'custom:role', /* required */
        MatchType: 'Equals', /* required */
        RoleARN: identityPoolRoleParams.rolesystem, /* required */
        Value: identityPoolRoleParams.adminRoleName /* required */
        },
        {
        Claim: 'custom:role', /* required */
        MatchType: 'Equals', /* required */
        RoleARN: identityPoolRoleParams.rolesupportOnly, /* required */
        Value: identityPoolRoleParams.userRoleName /* required */
        },
    ]
cognitoidentity.setIdentityPoolRoles(params, function (err, data) {

# [ ... ]

此配置可以由以下伪代码表示,其中 user.'custom:role' 是一个字符串。

const user = userpool.getuser(...)
if (user.'custom:role' == identityPoolRoleParams.adminRoleName)
    role = identityPoolRoleParams.roleSystem
else if (user.'custom:role' == identityPoolRoleParams.userRoleName) 
    role = identityPoolRoleParams.rolessupportOnly
于 2018-08-31T18:32:51.970 回答