Javascript 如何在没有客户端库但仅使用HTTP Post的情况下验证为Google服务帐户?

Javascript 如何在没有客户端库但仅使用HTTP Post的情况下验证为Google服务帐户?,javascript,google-cloud-functions,google-authentication,google-cloud-iam,Javascript,Google Cloud Functions,Google Authentication,Google Cloud Iam,我想通过HTTP触发我的云功能,但也要通过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钩子代码中,我知道需要首先获取凭

我想通过HTTP触发我的云功能,但也要通过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钩子代码中,我知道需要首先获取凭据,并将获取的令牌与POST请求一起发送到云函数端点

我这里的问题是,我不能使用任何Google Auth客户端库(在本例中为Node.js),因为Auth0钩子不能像看上去那样导入任何奇特的库

在此,我只能使用
var request=require('request@2.56.0');以使这一切正常工作。
我想问一下,我怎样才能做到这一点?我可以打电话给认证服务,对吗?但是这个API是什么呢?在文档中,我找不到手动方式,只有客户端库文档

在此,我只能使用var请求= 要求('request@2.56.0'); 让这一切顺利。我想问你怎么做 我能应付吗?我可以调用一些身份验证服务 对吧?

谷歌没有提供一个简单的HTTP端点,您可以调用它。如果您在整个流程中进行思考,则需要授权来调用生成授权凭据的端点。鸡和蛋的情况

Google尚未在端点接受Auth0凭据以交换Google凭据。但是,请继续阅读,以了解有关工作负载标识联合的更多信息,它最终可以/可能提供这种能力

对于创建一个可以生成Google访问或身份令牌的Auth0钩子的目标,没有简单的答案。以下是有助于理解可能发生的情况的详细信息

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

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

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

您可能希望更改策略,而是禁用云功能授权,验证代码中的Auth0身份令牌,并跳过基于Google的授权

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

注意:您的问题是“我想通过HTTP触发我的云函数”。我不知道你打算用什么方法。如果您使用的是云功能授权,则需要OAuth标识令牌。这为流程增加了更多步骤。我还没有弄清楚如何使用Workload Identity Federation实现这一点,但是函数/运行代码可以轻松地为您处理这一点


综上所述,云函数是用于无服务器框架中的小型、轻量级代码的。一旦添加了授权,复杂性就会增加。只要你坚持谷歌云授权,一切都很简单。一旦你尝试从一个身份系统(Auth0)转到另一个身份系统(Google Cloud IAM),复杂性就会急剧增加。

为了澄清鸡蛋问题:我正在从Auth0钩子发送服务帐户私钥。因此,我喜欢你的想法,让云函数充当身份验证服务器。我可以读取来自auth0的私钥,并返回由googleauth库(用于云函数)创建的令牌。然后,我可以使用该令牌调用我最初想要访问的云函数(由IAM保护)。这种方法有什么问题吗?@xetra11如果您将服务帐户JSON密钥作为HTTP请求的一部分传递给函数,则可以解决安全问题。然后您就有了一台“令牌自动售货机”,它可以接收服务帐户JSON密钥并返回OAuth令牌。