JavaScript中的AWS身份验证

时间:2018-06-28 15:16:19

标签: amazon-web-services aws-sdk role-base-authorization

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

我已经对它进行了结构设计,以使当用户进入没有令牌的页面时,将发生以下一系列步骤:

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

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

当前,我已经为用户池和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应用程序的所有用户拥有 Admin 特权,因为IAM角色与身份池相关联,而不与用户本身相关联。

有没有简单的方法可以实现这一目标?

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

1 个答案:

答案 0 :(得分:0)

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

有一个名为身份验证提供程序的部分,您可以在其中指定声明的条件并根据其指定角色。在同一页面上,您还可以编辑为未认证的用户分配哪个角色,并为已认证但不满足您指定的任何条件的用户提供默认角色。

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

的角色

Identity Pool control panel