Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 是否可以使用IAM在gcloud上托管的应用程序中作为google用户进行身份验证?_Node.js_Google Cloud Platform_Google Authentication_Google Cloud Iam - Fatal编程技术网

Node.js 是否可以使用IAM在gcloud上托管的应用程序中作为google用户进行身份验证?

Node.js 是否可以使用IAM在gcloud上托管的应用程序中作为google用户进行身份验证?,node.js,google-cloud-platform,google-authentication,google-cloud-iam,Node.js,Google Cloud Platform,Google Authentication,Google Cloud Iam,假设我有一个应用程序托管在谷歌云上:前端和后端。这一要求是,该应用程序只能由特定谷歌组织(包含该应用程序的项目所属)内的特定组或具有特定角色等的用户使用 我想这样实施: 1) 前端将要求用户使用谷歌作为第三方身份验证人,使用其谷歌账户(我希望与谷歌云组织绑定)登录。由于该应用程序是使用node/javascript构建的,使用一些npm包(如passport)可以轻松完成。在用户从浏览器登录并发生特定重定向后,Google应向后端提供有关用户的信息,包括唯一标识符 2) 后端(运行在app en

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

我想这样实施:

1) 前端将要求用户使用谷歌作为第三方身份验证人,使用其谷歌账户(我希望与谷歌云组织绑定)登录。由于该应用程序是使用node/javascript构建的,使用一些
npm
包(如
passport
)可以轻松完成。在用户从浏览器登录并发生特定重定向后,Google应向后端提供有关用户的信息,包括唯一标识符

2) 后端(运行在app engine、compute engine等上)应该访问特定于Google云的API,该API应该识别用户以及用户是否属于某个组或组织,基本上是任何有帮助的东西。假设机器将拥有一个服务帐户,该帐户具有访问所述API和确定用户是否正常的所有必要角色

3) 如果用户正常,那么将在后端为用户创建一个会话,只要该会话存在,后端就会知道请求的标识,因此一切都应该正常

我在第2步遇到的问题是:查看整个Google IAM、API、文档视频等。我找不到任何方法a)基于唯一ID识别用户,b)验证用户是否是组的一部分(通过单独的成员资源或其他方式),或者是否有特定的关联角色,这将相当于我的用例

如果:

1) 我的方法有道理,这甚至是可能的

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


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

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

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

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

1) 前端将要求用户使用他的google登录 账户(我希望与谷歌云组织绑定) 使用Google作为第三方身份验证程序。因为应用程序是用 node/javascript,使用一些npm包(如 护照。用户从浏览器和特定浏览器登录后 发生重定向时,谷歌应向后端提供信息 关于包含唯一标识符的用户

您可以使用任何身份提供商(谷歌、Facebook、Auth0、Okta等)。(注:请参阅我对谷歌IAM的进一步评论)。在浏览器中实现OAuth非常简单,实际上不需要库。然而,如果你想使用一个图书馆,有很多选择。但是,请选择一个本机JavaScript库,而不是节点包。节点包倾向于创建用户必须下载的巨大文件

一旦OAuth流完成,您将拥有两个令牌。访问令牌和ID令牌。ID标记是JavaScript前端将包含在请求中的内容。我将忽略此答案中的访问令牌,但如果在身份验证阶段设置正确,它可以用于直接访问GCP服务,如Google Storage。对于这个答案,我假设您需要用户的身份

2) 后端(在应用程序引擎、计算引擎等上运行)。 不要紧)应该访问特定于谷歌云的API 应识别用户以及该用户是否属于某个组,或 对组织来说,基本上是任何有帮助的事情。这是假定的 计算机将拥有一个具有所有必要角色的服务帐户 访问所述API并确定用户是否正常

当与您的服务通信时,客户端浏览器将在HTTP头、隐藏表单字段、会话状态等中包含ID令牌。要验证ID令牌,请调用特定于标识提供程序的端点。对于谷歌来说,端点是:
https://www.googleapis.com/oauth2/v3/tokeninfo
,对于Auth0来说是:
https://.auth0.com/userinfo
。这些端点都验证ID令牌的完整性。ID令牌包含用户授权您查看的用户的详细信息。ID令牌是一个JWT,在为Google解码时如下所示:

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>
iss:https://accounts.google.com
azp:.apps.googleusercontent.com
aud:.apps.googleusercontent.com
附属的:
高清:example.com
电邮:username@example.com.com
已验证的电子邮件:正确
at_hash:63I_abcdefabcdefbi5NSw
暂时代码:e8TP-ULEOEXPBK5
名称:用户名
图片:https://lh3.googleusercontent.com/-9PtQwhKbOPc/AAAAAAAAAAI/AAAAAAAAAAA//s96-c/photo.jpg
给定名称:用户
姓氏:姓名
地点:恩
国际航空运输协会:1548357229
出口:1548360829
jti:
后端负责将用户的身份映射到您想要的任何特权。您可以使用数据库等来存储此信息。如果用户也是Google IAM用户,则可以根据Google IAM中存储的IAM权限生成短期凭据。但是,我只建议在只有少数用户的情况下使用此选项。对于成百上千的用户,不要使用Google IAM,而是通过您的身份提供商通过自定义声明或在您自己的自定义数据库中进行管理

3) 如果用户没有问题,那么将在后端为其创建一个会话 这个