我知道如何通过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“用户池”中设置重复的用户并使用Cognito,但我正在尝试为公司的员工提供“单一的事实来源”。减轻行政负担。
答案 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客户端访问权限
现在,只有
所以现在我们有一个静态托管的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
希望它有所帮助!