首页 > 解决方案 > JavaScript 中的 AWS 身份验证

问题描述

我正在开发一个带有 REST 后端的单页应用程序,该后端使用 AWS Cognito 进行用户管理和身份验证。

我的结构是这样的,当用户在没有令牌的情况下进入页面时,会发生以下一系列步骤:

  1. 重定向到 Cognito 的默认登录页面
  2. 用户登录并被重定向到主机/authenticate.html
  3. AJAX 调用被发送到 Cognito 的令牌端点,该端点返回用户的令牌。这些存储在sessionStorage
  4. 用户被重定向到 Web 应用程序,现在已通过身份验证

我想在我的应用程序中有两个用户角色:UsersAdmins。不应允许用户调用任何 AWS 服务,而应允许管理员代表其公司创建/邀请其他用户并将其提升为管理员。

目前我已经为用户池和 Web 应用程序设置了一个身份池,以启用管理员权限。我使用以下代码对身份池进行身份验证:

AWS.config.region = "eu-central-1";
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
    IdentityPoolId: 'eu-central-1:<my-indentitypool-id>',
    Logins: {
        'cognito-idp.eu-central-1.amazonaws.com/<my-userpool-id>':
            sessionStorage.getItem('id_token')
    }
});

AWS.config.credentials.get(function(err){
    if (err) {
        console.error(err);
    }
    console.log("Authenticated");
    cisp = new AWS.CognitoIdentityServiceProvider();

});

当管理员想要创建用户时:

cisp.adminCreateUser(params, function(err, data) {
    if (err) 
        console.log(err, err.stack);
    else
        console.log(data);
});

但是,根据我的理解,这将允许 Web 应用程序的所有用户拥有管理员权限,因为 IAM 角色与身份池相关联,而不是与用户本身相关联。

有什么简单的方法可以实现这一目标吗?

如果有任何不清楚的地方,请随时提出问题,并提前感谢您的帮助。

标签: amazon-web-servicesaws-sdkrole-base-authorization

解决方案


我最终设法找到了解决方案。如果有人遇到与我相同的问题,您可以转到您的 Cognito 身份池的仪表板并对其进行编辑。

有一个名为Authentication providers的部分,您可以在其中指定声明的条件并基于此指定角色。在同一页面上,您还可以编辑为未经过身份验证的用户提供的角色,以及为经过身份验证但不满足您指定的任何条件的用户提供的默认角色。

在我的例子中,我为所有经过身份验证的用户赋予了User角色并创建了如下图所示的条件,该条件授予所有在“custom:role”中具有“admin”值的用户Admin 角色。

身份池控制面板


推荐阅读