我使用的是一个自定义服务帐户(在deploy命令中使用--service-account
参数)。该服务帐户启用了域范围的委托,并安装在G Apps管理面板中。
我试了这个代码:
app.get('/test', async (req, res) => {
const auth = new google.auth.GoogleAuth()
const gmailClient = google.gmail({ version: 'v1' })
const { data } = await gmailClient.users.labels.list({ auth, userId: 'user@domain.com' })
return res.json(data).end()
})
如果我在我的机器上运行它(将GOOGLE_APPLICATION_CREDENTIALS
env var设置为分配给Cloud Run服务的同一服务帐户的路径),它就可以工作,但当它在Cloud Run中运行时,我得到以下响应:
{
"code" : 400,
"errors" : [ {
"domain" : "global",
"message" : "Bad Request",
"reason" : "failedPrecondition"
} ],
"message" : "Bad Request"
}
我看到this解决方案解决了这个问题,但它是针对Python的,我不知道如何用Node库复制这种行为。
3条答案
按热度按时间jecbmhm31#
经过几天的研究,我终于得到了一个工作解决方案(移植Python实现):
vecaoik12#
在这里,您可以将yaml文件中的ENV变量定义为described in this documentation,以将GOOGLE_APPLICATION_CREDENTIALS设置为JSON键的路径。
然后使用这里提到的代码。
或者遵循与这里提到的方法类似的方法。
inb24sb23#
这是维克托的答案的镜像,除了它使用IAMCredentialsClient而不是弃用的iam.projects.serviceAccounts.signBlob来签名令牌。此代码是一个完整的TS文件,因此您可以将其放入项目并使用它,如下所示:
请注意,只有当您需要通过域范围的委派访问Workspace API时,才需要电子邮件。换句话说,即使您没有提供电子邮件,该类也可以在您需要生成令牌以访问Google资源的任何地方工作。如果您通过Google库访问资源,则不需要该类,但如果您使用REST API并需要获取访问令牌,则很方便。