关于使用 Google Endpoints Identity-Aware Proxy 对托管在 GCP 上的 B2B 应用程序的 G Suite 用户进行身份验证的多个问题
Multiple questions re using Google Endpoints Identity-Aware Proxy to authenticate G Suite users for a B2B app hosted on GCP
-
google-cloud-endpoints
-
google-cloud-platform
-
google-identity-toolkit
-
firebase-authentication
-
google-workspace
我目前正在研究最合适的 authentication/authorization 新建项目方法,该项目将完全托管在 Google 云平台上。我写这篇总结是为了对我的首选方法进行完整性检查,并就是否有任何我不知道的注意事项或不准确之处寻求反馈。如果任何人在实施相关策略方面具有相关经验,我将不胜感激。
我主要的queries/concerns有:
- 如何在 OIDC 流程中管理或取消范围?不应由用户来授权适当的访问;这应该由创建用户的组织 IT 管理员设置
- G Suite IT 管理员能否将参数应用到自动分配预定义 "Google Identity/IAM" 策略 groups/roles 的用户(自定义和/或非自定义)?
- G Suite 用户签名的 JWT's/Google ID 是否会直接与 Endpoints + IAP 兼容(不需要任何 processing/re-encoding)?
- 这种方法将来是否会通过联合身份方法容纳外部用户,无需对现有流程进行重大重构(例如Firebase auth)?
要求:
- Angular SPA 将是应用程序的单个 GUI,托管在为组织在 GCP/G Suite
上注册的同一域中
- SPA 将使用 GCP 的 api 网关 (Endpoints) 向 GKE 微服务(可能都在一个 VPC 内)和其他 G Suite 服务(云端硬盘等)发出请求
- 组织 IT G Suite 管理员可以通过 G Suite UI 创建用户并分配各种(预定义的)IAM 策略 groups/scopes,以授予用户对组织资源(G Suite 服务和GCP 托管自定义 api's/apps)
- 用户只能 "sign in with Google" 使用他们的组织 G Suite 帐户
访问 SPA
- 如果用户已经登录到他们的组织 google 帐户,他们不需要再次登录 SPA
- 登录 SPA 后,应随每个请求发送用户凭据,微服务将使用这些凭据对自定义业务逻辑进行授权,并将这些凭据传递给 Google 等 G Suite 服务驱动器(如果自定义业务逻辑失败,则利用 api 范围授权作为额外的安全层)
- 在遥远的将来,有可能允许组织外部的 customers/users 利用各种联合身份提供商(Facebook、Twitter 等)访问组织托管的 SPA 和资源(这不是当前的要求,而是一个长期的战略目标)
我确定最适合目的的两种方法是:
1) 端点
Google Sign-In with IT Apps to obtain the users org Google ID &, as we are using OpenAPI, the GCP Endpoints with an Identity-Aware Proxy (IAP),管理 JWT 令牌的身份验证。
优点:
- 在 UI 门户的内部用户和未来潜在的外部用户之间建立明确的界限
- 没有供 IT 管理员管理用户的自定义代码
- 没有自定义代码来同步 Firebase 和 G Suite 用户、角色、权限等,或者访问镜像的 G Suite 用户以获取凭据
或 2) Firebase
Firebase authentication, & , restricting access to resources based on the .
Pros/Cons 与上面的端点相反,如果需要外部用户,则不需要 2 种单独的身份验证方法。
我倾向于端点方法...
How to manage or negate scopes in the OIDC process? It should not be
up to the user to authorize appropriate access; this should be set by
the org IT admins that created the user
IAM 成员(用户、组、服务帐户等)的权限在 Google Cloud IAM 中进行管理。范围与 OAuth 一起使用以限制 IAM 已分配的权限。最佳实践意味着分配所需的权限(仅此而已)而不是将 IAM 与范围结合使用。
Can G Suite IT admins apply params to users (custom &/or not) which
automatically allocate predefined "Google Identity/IAM" policy
groups/roles?
G Suite 和 Google Cloud 是独立的服务。 Google Cloud 支持 G Suite 作为身份提供商 (IDP)。权限在 Google Cloud IAM 中控制,而不在 G Suite 中。您可以将 G Suite 与 Google 组结合使用,将 IAM 成员放入组中,以便于 IAM 管理。
Will the G Suite users signed JWT's/Google ID be directly compatible
with Endpoints + IAP (not requiring any processing/re-encoding)?
Google 帐户 (G Suite) 不向其成员帐户提供私钥。因此,您不能使用已签名的 JWT。 Signed JWT 是一种较旧的授权机制,与服务帐户一起使用。用户凭据的正确方法是 OAuth 2.0 访问和身份令牌。对于管理员,可以使用具有域范围委派的服务帐户。
Will this approach accomodate external users via a federated identity
approach, in future, without major refactors to the existing process
(e.g. Firebase auth)?
这是一个很难回答的问题。 Google Cloud 确实支持外部身份提供者,但我发现这充其量是有问题的。您也可以使用身份同步,但这也没有很好地实现。如果您要走 Google Cloud 路线,请使用 G Suite 作为您的身份提供者,并使用 Google Cloud IAM 进行授权。
我认为您的问题缺少的重要一点是了解授权在 Google 云和 Google API 中的工作原理。这些服务主要使用 OAuth 2 访问令牌和身份令牌。这因服务和所需的访问类型而异。这意味着您的应用程序需要了解它正在访问的服务以及如何提供授权。我有一种感觉,你希望 Firebase/Endpoints 为你做这件事。
另一项是 Firebase 是 Google Cloud 的一部分,并且只是 Google Cloud 的一个子集。 Firebase 非常棒 product/service,但如果您打算在 Firebase 之外使用 Google 云功能,请继续使用 G Suite 和 Cloud IAM 进行身份验证和授权。
Angular SPA will be the single GUI for the application, hosted on the
same domain registered for the organisation on GCP/G Suite
我假设您所说的域是指 DNS 区域(网站 DNS 名称)。这将使 CORS 和 cookie 管理更容易,但这不是必需的。
SPA will use GCP's api gateway (Endpoints) to make requests to GKE
micro-services (likely all within the one VPC) & other G Suite
services (Drive, etc)
好的 - 我没有发现使用 Endpoints 有任何问题。然而,一个好的答案需要详细说明一切是如何实际实施的。另一项是您提到端点和 G Suite 服务。这些是非常不同的项目。端点保护您的 HTTP 端点,而不是其他 Google 服务,它只会妨碍它。
Org IT G Suite admin's can create users & assign various (predefined)
IAM policy groups/scopes via the G Suite UI, to give users least
privilege access to org resources (G Suite services & GCP hosted
custom api's/apps)
Google Cloud IAM 和 G Suite 授权是独立的授权系统。为了让 G Suite 成员管理 Google Cloud IAM,他们需要通过其成员 ID 或群组成员身份在 Google Cloud IAM 中分配角色。没有共享授权权限。
Users are ONLY able to "sign in with Google" to the SPA, using their
orgs G Suite account
除非您配置 SSO,否则 Google 帐户成员是唯一可以进行身份验证的人。授权由 Google Cloud IAM 管理。
If the User is already signed into their org google account, they
should not need to sign in again to the SPA
这取决于您的应用程序代码,以便在请求中提供正确的授权 header。
While logged into the SPA, the users credentials should be sent with
each request, which micro-services will use for authorization of
custom business logic, as well as passing those credentials to G Suite
services like Google Drive (leverage api scopes authorization as
additional layer of security if custom business logic fails)
我不确定 "User Credentials" 是什么意思。您永远不应访问用户的凭据 (username/password)。相反,您的应用程序应该管理 OAuth 访问和身份令牌并将它们发送到后端进行授权。
In the distant future, there is potential to allow customers/users,
external to the org, to utilize various federated identity providers
(Facebook, Twitter, etc) to access a SPA & resources hosted by the org
(this is not a current requirement, but it is a long term strategic
goal)
我之前在回答中对此进行了介绍。但是,让我建议清楚地考虑需要授权的内容。对您的应用程序的授权与对您的应用程序的授权不同,后者还授权 Google 云服务。例如,您可以使用 Twitter 进行身份验证,并使用单个服务帐户进行 Google 云授权。这仅取决于您需要完成什么以及您希望如何管理授权。
[更新]
您在问题中使用的一个术语是 SPA。在传统用例中,所有处理都由您的应用程序在浏览器中完成。这是一场安全噩梦。浏览器将有权访问用于授权和身份的 OAuth 令牌,这是不安全的。这也限制了您的应用程序生成刷新令牌的能力,这意味着一旦现有令牌过期(每 3,600 秒),用户将需要重新进行身份验证。对于这个问题的范围,我建议将您的应用重新考虑为更传统的 client/server 设计。身份验证由您的服务器处理,而不是直接由(内部)客户端应用程序处理。在我提到服务帐户的部分中,我假设后端系统已到位,以便客户端只有一个加密的 session cookie。
根据我的经验,
作为身份提供的 G-Suite + Cloud IAP 将用于 authn 和 authz,以在前端进行用户级别的访问检查。参考 this
但是对于后端应用程序到应用程序的通信,我会推荐 GCP 中的服务帐户,参考 this. You can also use Cloud IAP to do the same, refer this。但是,选择取决于您的用例和您公司的安全准则和政策。
google-cloud-endpoints
google-cloud-platform
google-identity-toolkit
firebase-authentication
google-workspace
我目前正在研究最合适的 authentication/authorization 新建项目方法,该项目将完全托管在 Google 云平台上。我写这篇总结是为了对我的首选方法进行完整性检查,并就是否有任何我不知道的注意事项或不准确之处寻求反馈。如果任何人在实施相关策略方面具有相关经验,我将不胜感激。
我主要的queries/concerns有:
- 如何在 OIDC 流程中管理或取消范围?不应由用户来授权适当的访问;这应该由创建用户的组织 IT 管理员设置
- G Suite IT 管理员能否将参数应用到自动分配预定义 "Google Identity/IAM" 策略 groups/roles 的用户(自定义和/或非自定义)?
- G Suite 用户签名的 JWT's/Google ID 是否会直接与 Endpoints + IAP 兼容(不需要任何 processing/re-encoding)?
- 这种方法将来是否会通过联合身份方法容纳外部用户,无需对现有流程进行重大重构(例如Firebase auth)?
要求:
- Angular SPA 将是应用程序的单个 GUI,托管在为组织在 GCP/G Suite 上注册的同一域中
- SPA 将使用 GCP 的 api 网关 (Endpoints) 向 GKE 微服务(可能都在一个 VPC 内)和其他 G Suite 服务(云端硬盘等)发出请求
- 组织 IT G Suite 管理员可以通过 G Suite UI 创建用户并分配各种(预定义的)IAM 策略 groups/scopes,以授予用户对组织资源(G Suite 服务和GCP 托管自定义 api's/apps)
- 用户只能 "sign in with Google" 使用他们的组织 G Suite 帐户 访问 SPA
- 如果用户已经登录到他们的组织 google 帐户,他们不需要再次登录 SPA
- 登录 SPA 后,应随每个请求发送用户凭据,微服务将使用这些凭据对自定义业务逻辑进行授权,并将这些凭据传递给 Google 等 G Suite 服务驱动器(如果自定义业务逻辑失败,则利用 api 范围授权作为额外的安全层)
- 在遥远的将来,有可能允许组织外部的 customers/users 利用各种联合身份提供商(Facebook、Twitter 等)访问组织托管的 SPA 和资源(这不是当前的要求,而是一个长期的战略目标)
我确定最适合目的的两种方法是:
1) 端点
Google Sign-In with IT Apps to obtain the users org Google ID &, as we are using OpenAPI, the GCP Endpoints with an Identity-Aware Proxy (IAP),管理 JWT 令牌的身份验证。
优点:
- 在 UI 门户的内部用户和未来潜在的外部用户之间建立明确的界限
- 没有供 IT 管理员管理用户的自定义代码
- 没有自定义代码来同步 Firebase 和 G Suite 用户、角色、权限等,或者访问镜像的 G Suite 用户以获取凭据
或 2) Firebase
Firebase authentication, &
Pros/Cons 与上面的端点相反,如果需要外部用户,则不需要 2 种单独的身份验证方法。
我倾向于端点方法...
How to manage or negate scopes in the OIDC process? It should not be up to the user to authorize appropriate access; this should be set by the org IT admins that created the user
IAM 成员(用户、组、服务帐户等)的权限在 Google Cloud IAM 中进行管理。范围与 OAuth 一起使用以限制 IAM 已分配的权限。最佳实践意味着分配所需的权限(仅此而已)而不是将 IAM 与范围结合使用。
Can G Suite IT admins apply params to users (custom &/or not) which automatically allocate predefined "Google Identity/IAM" policy groups/roles?
G Suite 和 Google Cloud 是独立的服务。 Google Cloud 支持 G Suite 作为身份提供商 (IDP)。权限在 Google Cloud IAM 中控制,而不在 G Suite 中。您可以将 G Suite 与 Google 组结合使用,将 IAM 成员放入组中,以便于 IAM 管理。
Will the G Suite users signed JWT's/Google ID be directly compatible with Endpoints + IAP (not requiring any processing/re-encoding)?
Google 帐户 (G Suite) 不向其成员帐户提供私钥。因此,您不能使用已签名的 JWT。 Signed JWT 是一种较旧的授权机制,与服务帐户一起使用。用户凭据的正确方法是 OAuth 2.0 访问和身份令牌。对于管理员,可以使用具有域范围委派的服务帐户。
Will this approach accomodate external users via a federated identity approach, in future, without major refactors to the existing process (e.g. Firebase auth)?
这是一个很难回答的问题。 Google Cloud 确实支持外部身份提供者,但我发现这充其量是有问题的。您也可以使用身份同步,但这也没有很好地实现。如果您要走 Google Cloud 路线,请使用 G Suite 作为您的身份提供者,并使用 Google Cloud IAM 进行授权。
我认为您的问题缺少的重要一点是了解授权在 Google 云和 Google API 中的工作原理。这些服务主要使用 OAuth 2 访问令牌和身份令牌。这因服务和所需的访问类型而异。这意味着您的应用程序需要了解它正在访问的服务以及如何提供授权。我有一种感觉,你希望 Firebase/Endpoints 为你做这件事。
另一项是 Firebase 是 Google Cloud 的一部分,并且只是 Google Cloud 的一个子集。 Firebase 非常棒 product/service,但如果您打算在 Firebase 之外使用 Google 云功能,请继续使用 G Suite 和 Cloud IAM 进行身份验证和授权。
Angular SPA will be the single GUI for the application, hosted on the same domain registered for the organisation on GCP/G Suite
我假设您所说的域是指 DNS 区域(网站 DNS 名称)。这将使 CORS 和 cookie 管理更容易,但这不是必需的。
SPA will use GCP's api gateway (Endpoints) to make requests to GKE micro-services (likely all within the one VPC) & other G Suite services (Drive, etc)
好的 - 我没有发现使用 Endpoints 有任何问题。然而,一个好的答案需要详细说明一切是如何实际实施的。另一项是您提到端点和 G Suite 服务。这些是非常不同的项目。端点保护您的 HTTP 端点,而不是其他 Google 服务,它只会妨碍它。
Org IT G Suite admin's can create users & assign various (predefined) IAM policy groups/scopes via the G Suite UI, to give users least privilege access to org resources (G Suite services & GCP hosted custom api's/apps)
Google Cloud IAM 和 G Suite 授权是独立的授权系统。为了让 G Suite 成员管理 Google Cloud IAM,他们需要通过其成员 ID 或群组成员身份在 Google Cloud IAM 中分配角色。没有共享授权权限。
Users are ONLY able to "sign in with Google" to the SPA, using their orgs G Suite account
除非您配置 SSO,否则 Google 帐户成员是唯一可以进行身份验证的人。授权由 Google Cloud IAM 管理。
If the User is already signed into their org google account, they should not need to sign in again to the SPA
这取决于您的应用程序代码,以便在请求中提供正确的授权 header。
While logged into the SPA, the users credentials should be sent with each request, which micro-services will use for authorization of custom business logic, as well as passing those credentials to G Suite services like Google Drive (leverage api scopes authorization as additional layer of security if custom business logic fails)
我不确定 "User Credentials" 是什么意思。您永远不应访问用户的凭据 (username/password)。相反,您的应用程序应该管理 OAuth 访问和身份令牌并将它们发送到后端进行授权。
In the distant future, there is potential to allow customers/users, external to the org, to utilize various federated identity providers (Facebook, Twitter, etc) to access a SPA & resources hosted by the org (this is not a current requirement, but it is a long term strategic goal)
我之前在回答中对此进行了介绍。但是,让我建议清楚地考虑需要授权的内容。对您的应用程序的授权与对您的应用程序的授权不同,后者还授权 Google 云服务。例如,您可以使用 Twitter 进行身份验证,并使用单个服务帐户进行 Google 云授权。这仅取决于您需要完成什么以及您希望如何管理授权。
[更新]
您在问题中使用的一个术语是 SPA。在传统用例中,所有处理都由您的应用程序在浏览器中完成。这是一场安全噩梦。浏览器将有权访问用于授权和身份的 OAuth 令牌,这是不安全的。这也限制了您的应用程序生成刷新令牌的能力,这意味着一旦现有令牌过期(每 3,600 秒),用户将需要重新进行身份验证。对于这个问题的范围,我建议将您的应用重新考虑为更传统的 client/server 设计。身份验证由您的服务器处理,而不是直接由(内部)客户端应用程序处理。在我提到服务帐户的部分中,我假设后端系统已到位,以便客户端只有一个加密的 session cookie。
根据我的经验,
作为身份提供的 G-Suite + Cloud IAP 将用于 authn 和 authz,以在前端进行用户级别的访问检查。参考 this
但是对于后端应用程序到应用程序的通信,我会推荐 GCP 中的服务帐户,参考 this. You can also use Cloud IAP to do the same, refer this。但是,选择取决于您的用例和您公司的安全准则和政策。