适用于AWS驱动的基于浏览器的App的G Suite身份提供程序

时间:2016-10-18 02:25:30

标签: firebase google-api google-oauth google-login

我知道如何通过google-signin-client_id创建经过Google身份验证的应用3089273xx-xxxxxxxxxxxx.apps.googleusercontent.com&amp; <script src="https://apis.google.com/js/platform.js" async defer></script>,但问题在于,我无法仅限登录到我公司的G Suite实例

我拥有的应用程序是一个托管在S3上的“无服务器”JS软件包。登录的Google令牌与访问敏感资源的AWS角色相关联。

因此,检查googleUser.getBasicProfile()pass a hd parameter电子邮件的典型解决方案没有任何安全意义,因为可以使用浏览器开发工具IIUC对其进行操作。

我可以使用其他一些Google API或我可以应用的策略吗?我想这个解决方案将以我公司域名的特殊 google-signin-client_id 的形式出现,该域名由G Suite托管。这就是它与AWS角色的关联:

AWS IAM Google auth

我知道我可以在AWS“用户池”中设置重复的用户并使用Cognito,但我正在尝试为公司的员工提供“单一的事实来源”。减轻行政负担。

2 个答案:

答案 0 :(得分:3)

更新:此答案不安全,就像您只需删除 hosted_domain 一样,您可以通过任何Google登录进行身份验证。

在误导WP API&amp;直接使用GAPI我发现我可以做一个

    GAPI.auth2.init({
        client_id: CLIENT_ID,
        hosted_domain: 'example.com'
    })

然后在https://developers.google.com/identity/work/it-apps上设置管理API客户端访问权限

documentation advises

现在,只有可以访问这个JS应用程序!这需要花费数周才能弄明白。因此,最后,如何在AWS无服务器应用程序上使用Google进行身份验证:

  1. 通过 OAuth客户端ID 使用Authorized API clients
  2. 列入白名单的原始网址设置客户ID
  3. https://console.developers.google.com/apis/credentials中设置一个角色,将Google作为具有客户端ID
  4. 的(网络)身份提供商
  5. 按照此处记录的AWS IAM添加您的客户ID [{3}},以便将您的应用程序限制在公司的域名中。
  6. 所以现在我们有一个静态托管的App,仅限公司员工访问敏感的付费AWS API。

答案 1 :(得分:1)

我尝试了3种不同的选项,第一种适用于我的场景:

第一个选项 - 在lambda端的每次通话中验证Google Id令牌

我总是将id_token作为标题传递给客户端调用(Web和移动应用程序)。

&#34; acceptableHds&#34;是允许的域名列表。

const oauth = new Auth.OAuth2(CLIENT_ID_WEB, CLIENT_SECRET);
    oauth.verifyIdToken(token, null, (err, ticket) => {
      if (err) {
        return reject(err);
      }
      const payload = ticket.getPayload();

      const tokenIsOK = payload &&
        payload.aud === CLIENT_ID &&
        new Date(payload.exp * 1000) > new Date() &&
        acceptableISSs.has(payload.iss) &&
        acceptableHds.has(payload.hd)

      return tokenIsOK ? resolve(payload.hd) : reject();
    });

第二个选项 - 在lambda端验证一次Google Id令牌

我开始采用这种替代方式,但我还没有完成,因为第一个解决方案符合我的需求并且里程碑很接近(它需要一个缩进池):

1)将id_token发送到lambda函数并在Google API上验证(此处您可以使用上面的代码检查域名)

2)使用来自浏览器的id_token调用lambda端的cognitoidentity.getOpenIdTokenForDeveloperIdentity

3)在客户端上,使用getOpenIdToken返回的标记调用任何Cognito或STS函数,如assumeWebIdentity,AssumeRole。

function getCognitoToken(id_token) {
  var param = {
    IdentityPoolId: 'us-east-1:f7b3d55f-6b63-4097-be8f-3dc22ddec1a4',
    Logins: { 'accounts.google.com': id_token }
  }
  return check_company(id_token).then(function (valid) {
    return cognitoidentity.getOpenIdTokenForDeveloperIdentity(param).promise()
  })

我无法完成第三步。您需要使用第二步收到的令牌,而不会泄露“身份池ID”。如果您这样做并确保该角色无法列出身份池ID,它将按预期工作并且将是安全的。

第三个选项 - SAML提供商

您可以创建SAML提供程序并使用SAML断言来验证用户域。

http://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_create_saml_assertions.html

我惨遭失败,试图去做。

P.S。: Google管理员可让您创建私有应用,限制您的公司域名,但据我所知,它仅适用于移动设备

https://support.google.com/a/answer/2494992?hl=en

希望它有所帮助!