【问题标题】:How to authenticate as Google service account without a client library but only with HTTP Post?如何在没有客户端库但仅使用 HTTP Post 的情况下验证为 Google 服务帐户?
【发布时间】:2021-03-21 23:28:51
【问题描述】:

我想通过 HTTP 触发我的 Cloud Function,但也通过 IAM 和我创建的服务帐户 auth0-hook 进行身份验证。

我生成了一个这样的私钥:

gcloud iam service-accounts keys create ~/.gcp-keys/auth0-hook-sa.key.json     --iam-account=auth0-hooks@my-platform.iam.gserviceaccount.com

并将此服务帐户应用到我的云功能。

在外部 - 在 Auth0 Hook 代码中 - 我知道需要先获取凭据并将获取的令牌与 POST 请求一起发送到 Cloud Function 端点。

我的问题是我可以使用任何 Google Auth 客户端库(在本例中为 Node.js),因为 Auth0 Hooks 无法导入任何看起来不错的库。

我特此坚持只使用var request = require('request@2.56.0'); 来完成这一切。 我想问我怎么能管理这个?我可以调用一些身份验证服务吗?但是那个 API 是什么?在文档中我找不到 manual 方式,只能找到客户端库文档。

【问题讨论】:

    标签: javascript google-cloud-functions google-authentication google-cloud-iam


    【解决方案1】:

    我特此坚持只使用 var request = 要求('request@2.56.0');使这一切正常工作。我想问怎么 我能管理这个吗?我可以调用一些身份验证服务 对吧?

    Google 不提供您可以调用的简单 HTTP 端点。如果您认为通过该过程,则需要授权来调用生成授权凭证的端点。鸡和蛋的情况。

    Google 尚不接受端点上的 Auth0 凭据来交换 Google 凭据。但是,请继续阅读有关 Workload Identity Federation 的更多信息,它最终可以/可能提供这种能力。

    对于您创建可以生成 Google 访问或身份令牌的 Auth0 挂钩的目标,没有简单的答案。以下详细信息可帮助您了解可能的情况。

    要从 Google Cloud 服务帐户 JSON 密钥文件转到访问令牌还需要库。该过程是创建 JWT,签署 JWT,将 JWT 交换为访问令牌。我写了一篇文章,展示了如何在 Python 中做到这一点。 Node.js 的过程类似。你的问题是这个过程对于 Auth0 钩子来说太复杂了。

    Google Cloud – Creating OAuth Access Tokens for REST API Calls

    Google 最近推出了 Google Workload Identity Federation,它支持通过联合和服务帐户模拟将 OIDC 令牌交换为 Google OAuth 访问令牌。该过程只是一系列 HTTP 方法调用。我正在撰写几篇关于如何做到这一点的文章,但目前还没有完成。

    Accessing resources from an OIDC identity provider

    一种可能性是创建另一个 Cloud Function 或 Cloud Run 服务,您可以在单个 HTTP GET 中调用它,从而为您创建令牌。这样您就可以使用 Google 客户端库。您的函数/运行代码将接收 HTTP GET 请求,与客户端库交互以创建访问令牌并将令牌作为 HTTP GET 响应返回。 然而,这就造成了先有鸡还是先有蛋的局面。您需要授权对 Function/Run 代码的请求以获取访问令牌。

    您可能希望更改策略并改为禁用 Cloud Functions 授权并在您的代码中验证 Auth0 身份令牌并跳过基于 Google 的授权。

    Auth0: Validate ID Tokens

    Auth0: Validate JSON Web Tokens

    注意您选择的任何过程,因为获得正确和安全的授权并不容易。

    注意:您的问题是“我想通过 HTTP 触发我的云功能”。我不确定您打算使用什么方法。如果您使用的是 Cloud Functions 授权,则需要 OAuth 身份令牌。这为该过程增加了更多步骤。我还没有弄清楚如何使用 Workload Identity Federation 做到这一点,但 Functions/Run 代码可以轻松为您处理。

    总而言之,Cloud Functions 旨在用于无服务器框架中的小型、轻量级代码。添加授权后,复杂性就会增加。只要你坚持使用谷歌云授权,一切都很容易。一旦您尝试从一个身份系统 (Auth0) 转到另一个身份系统 (Google Cloud IAM),复杂性就会急剧增加。

    【讨论】:

    • 澄清鸡蛋问题:我从 auth0 钩子发送服务帐户私钥。因此,我喜欢您的想法,即使用类似于身份验证服务器的云功能。我可以读取来自 auth0 的私钥并返回由 google auth 库创建的令牌(在云函数中使用)。然后我可以使用该令牌来调用我最初想要访问的云功能(由 IAM 保护)。对这种方法有任何顾虑吗?
    • @xetra11 如果您将服务帐户 JSON 密钥作为 HTTP 请求的一部分传递给函数,则可以解决安全问题。然后,您就有了一个“令牌自动售货机”,它可以接收服务帐户 JSON 密钥并返回 OAuth 令牌。
    猜你喜欢
    • 2018-03-19
    • 2017-02-11
    • 1970-01-01
    • 2019-01-10
    • 1970-01-01
    • 2012-06-07
    • 1970-01-01
    • 2013-05-27
    • 2017-05-20
    相关资源
    最近更新 更多