关于使用 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

我目前正在研究最合适的 authentication/authorization 新建项目方法,该项目将完全托管在 Google 云平台上。我写这篇总结是为了对我的首选方法进行完整性检查,并就是否有任何我不知道的注意事项或不准确之处寻求反馈。如果任何人在实施相关策略方面具有相关经验,我将不胜感激。

我主要的queries/concerns有:


要求:


我确定最适合目的的两种方法是:

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 令牌的身份验证。

优点:


或 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。但是,选择取决于您的用例和您公司的安全准则和政策。