是否可以使用IAM在gcloud托管的应用内以Google用户身份进行身份验证?

时间:2019-01-24 14:59:09

标签: node.js google-cloud-platform google-authentication google-cloud-iam

假设我在Google云端托管了一个应用程序:前端和后端。要求是该应用程序只能由特定google组织(包含该应用程序的项目所属)中的特定组或具有特定角色等的用户使用。

我想这样实现:

1)前端将要求用户使用Google作为第三方身份验证者来登录自己的Google帐户(我希望该帐户与Google Cloud组织相关联)。由于该应用程序是使用节点/ JavaScript构建的,因此可以轻松地使用某些npm软件包(例如passport)来完成。用户从浏览器登录并发生特定的重定向后,Google应向后端提供有关用户的信息,包括唯一标识符。

2)后端(在应用程序引擎,计算引擎等上运行无关紧要)应该访问Google Cloud特定的API,该API可以识别用户以及用户是否属于组或组织,基本上任何有帮助的东西。假定该计算机将具有一个服务帐户,该帐户具有访问上述API并确定用户是否正常的所有必要角色。

3)如果用户正常,则将在该后端上为该用户创建一个会话,只要该会话存在,后端将知道请求的身份,因此一切正常。

我遇到的问题在于步骤2:浏览整个Google IAM,API,文档视频等。我找不到任何方法来a)基于唯一ID标识用户,b)验证该用户是该组的一部分(通过单独的成员资格资源或其他方式),或者该用户具有关联的特定角色,这等效于我的用例。

任何想法,如果:

1)我的方法很有道理,甚至有可能吗?

2)如果是这样,那我应该使用什么资源或方法来实现它?

3)如果不是,那么哪种方法适合我的用例?

1 个答案:

答案 0 :(得分:1)

关键问题是谁将成为您的身份提供者?

下一个关键问题是如何将用户的身份从身份提供者映射到自己的用户/特权数据库。

您要决定的下一个关键问题是要使用哪种OAuth 2.0类型。隐式OAuth或三足式OAuth。隐式OAuth在浏览器中完成,仅涉及客户端ID。三足式OAuth涉及用于接收令牌的Web服务器,并且被认为更安全。

  

1)前端将要求用户使用其Google登录   帐户(我希望该帐户与Google Cloud组织相关)   使用Google作为第三方身份验证者。由于该应用程序是使用   使用某些npm包(例如,   护照。用户从浏览器登录后,具体   发生重定向,Google应该向后端提供信息   关于用户的信息,包括唯一标识符。

您可以使用任何身份提供程序(Google,Facebook,Auth0,Okta等)。 (请注意:有关Google IAM的更多评论,请参见下文)。在浏览器中实现OAuth非常简单,因此您实际上不需要库。但是,如果要使用库,则有很多选择。但是,请选择一个本机JavaScript而不是节点包的库。节点程序包往往会创建用户必须下载的巨大文件。

OAuth流程完成后,您将有两个令牌。访问令牌和ID令牌。 ID令牌是您的JavaScript前端将在请求中包括的内容。在此答案中,我将忽略访问令牌,但如果在身份验证阶段正确设置,则可用于直接访问GCP服务(例如Google Storage)。对于这个答案,我假设您想要用户的身份。

  

2)后端(在应用程序引擎,计算引擎等上运行)   没关系)应该访问Google Cloud特定的API   应该标识用户以及该用户是否属于组,或者   对组织而言,基本上任何有帮助的事情。假设   该机器将具有一个具有所有必要角色的服务帐户   访问所述API并确定用户是否正常。

与服务进行通信时,客户端浏览器将在HTTP标头,隐藏的表单字段,会话状态等中包含ID令牌。要验证ID令牌,请调用特定于身份提供者的端点。对于Google,端点是:https://www.googleapis.com/oauth2/v3/tokeninfo,对于Auth0,端点是:https://<replace_with_your_account_name>.auth0.com/userinfo。这些端点都验证ID令牌的完整性。 ID令牌包含有关用户授权您查看的用户的详细信息。为Google解码的ID令牌(即JWT)如下所示:

iss: https://accounts.google.com
azp: <removed_for_security>.apps.googleusercontent.com
aud: <removed_for_security>.apps.googleusercontent.com
sub: <removed_for_security>
hd: example.com
email: username@example.com.com
email_verified: true
at_hash: 63I_abcdefabcdefbi5NSw
nonce: e8TP-uLoEoeXpbk5
name: User Name
picture: https://lh3.googleusercontent.com/-9PtQwhKbOPc/AAAAAAAAAAI/AAAAAAAAAAA/<removed_for_security>/s96-c/photo.jpg
given_name: User
family_name: Name
locale: en
iat: 1548357229
exp: 1548360829
jti: <removed_for_security>

将用户的身份映射到您想要的任何特权是后端的责任。您可以使用数据库等来存储此信息。如果该用户也是Google IAM用户,则可以基于存储在Google IAM中的IAM特权来生成短期凭证。但是,我仅在只有几个用户的情况下才建议这样做。对于成百上千的用户,请勿使用Google IAM,而应通过自定义声明或在您自己的自定义数据库中通过身份提供者进行管理。

  

3)如果用户确定,则将在后端创建一个会话   用户,并且只要该会话存在,后端就会知道   请求的身份,因此一切都应该没问题。

我不确定您要在这里说什么。对于Google Cloud,您的后端将使用其服务帐户代表客户端发出请求,或者后端将创建一个短暂的访问令牌来授予访问权限。

  

1)我的方法很有道理,甚至有可能吗?

您的方法非常接近应如何完成。有一些您还不了解的细节,希望我的回答为您指出正确的方向进行更多研究。

  

2)如果是,那么我应该使用哪些资源或方法   发生了吗?

  • 确定要实现的OAuth的类型(隐式或三足式)。
  • 确定身份提供者。 Google,Facebook,Auth0等
  • 确定要嵌入浏览器的代码类型(简单的JavaScript或库)
  • 确定如何通过HTTP标头,隐藏的表单字段等传递令牌。
  • 确定如何授权请求。您自己的服务帐户或为每个用户创建的短期访问令牌。
  • 确定如何将ID令牌身份转换为您的权限集。
  

3)如果不是,那么哪种方法适合我的用例?

您的方法很好,并且是我们在现实世界中的典型做法。