Google cloud platform GCP-使用应用程序默认凭据的云功能域范围的委派(否-jwt)

Google cloud platform GCP-使用应用程序默认凭据的云功能域范围的委派(否-jwt),google-cloud-platform,google-api,google-cloud-functions,google-auth-library,google-auth-library-nodejs,Google Cloud Platform,Google Api,Google Cloud Functions,Google Auth Library,Google Auth Library Nodejs,我正在尝试创建一个基于NodeJS的云函数,它使用域范围的委托访问来使用API方法gmail.users.settings.delegates.list 我正在寻找一个不使用服务帐户JSON密钥的解决方案,我想改用默认凭据 我使用launch.json文件配置本地env以模拟云函数env { “版本”:“0.2.0”, “配置”:[ { “类型”:“节点”, “请求”:“启动”, “名称”:“启动usersOnBehalfCheck”, “滑雪板”:[ "/**" ], “环境”:{ “GCP_

我正在尝试创建一个基于NodeJS的云函数,它使用域范围的委托访问来使用API方法gmail.users.settings.delegates.list

我正在寻找一个不使用服务帐户JSON密钥的解决方案,我想改用默认凭据

我使用launch.json文件配置本地env以模拟云函数env

{
“版本”:“0.2.0”,
“配置”:[
{
“类型”:“节点”,
“请求”:“启动”,
“名称”:“启动usersOnBehalfCheck”,
“滑雪板”:[
"/**"
],
“环境”:{
“GCP_项目”:“projectId”,
“GOOGLE_应用程序_凭据”:“pathToJsonFile.json”
},
“程序”:“${workspaceFolder}/index.js”
}
]
}
GOOGLE\u APPLICATION\u CREDENTIALS
env变量打印到GCF中似乎根本不存在这个变量,但我不知道如何更好地模拟GCF env

谈到auth对象,我发现了两种方法:

第一:
const gmailDWDAuth=new GoogleAuth({clientOptions:{subject:inputData.userPrimaryEmail},作用域:['https://www.googleapis.com/auth/gmail.settings.basic'] });
info({gmailDWDAuth:gmailDWDAuth},null,2);
返回gmail.users.settings.delegates.list({userId:'me',auth:gmailDWDAuth})
第二:
const gmailDWDAuth=wait google.auth.getClient({clientOptions:{subject:inputData.userPrimaryEmail},作用域:['https://www.googleapis.com/auth/gmail.settings.basic'] });
info({gmailDWDAuth:gmailDWDAuth},null,2);
返回gmail.users.settings.delegates.list({userId:'me',auth:gmailDWDAuth})
inputData.userPrimaryEmail
在服务帐户的同一组织中包含有效的GSuite帐户

这两种方法在本地都可以正常工作,但在我将GCF发布到GCP时停止工作,出现
错误请求

有人能帮忙吗


编辑 几个小时后,我发现他在谈论这件事

我按照他的指示修改了代码

第三:

const DWDAuth=wait google.auth.getClient({scopes:['https://www.googleapis.com/auth/gmail.settings.basic'] });
DWDAuth.subject=inputData.userPrimaryEmail;
console.info(util.inspect({DWDAuth:DWDAuth}));
返回gmail.users.settings.delegates.list({userId:inputData.userPrimaryEmail,auth:DWDAuth})
第四:

const DWDAuth=new GoogleAuth({scopes:['https://www.googleapis.com/auth/gmail.settings.basic'] });
const DWDAuthClient=wait DWDAuth.getClient();
DWDAuthClient.subject=inputData.userPrimaryEmail;
info(util.inspect({DWDAuthClient:DWDAuthClient}));
返回gmail.users.settings.delegates.list({userId:inputData.userPrimaryEmail,auth:DWDAuthClient})

和以前一样,所有这些都可以在本地正常工作,但我在GCF中收到了错误的请求
GOOGLE\u应用程序\u凭据
在云函数中不存在。这些凭证来自Google元数据服务器,并且来自您分配给云功能的服务帐户。2) 您无权访问元数据凭据的私钥。您必须使用自己的服务帐户JSON密钥文件来实现域范围的委派。我建议存储加密的密钥文件,并由密钥库进行保护。确切地说,JSON密钥文件存在一些问题。它可能会被盗,可能会失效,当然,如果它具有域范围的活动委托,则必须非常安全地存储。所有这些正是我不想使用它的原因。你看过我贴的最后一个链接了吗?他们说这是可能的,但同样,它不起作用:(应用程序引擎和云功能有完全不同的环境。云功能没有管理API。正如我所说,你没有访问私钥的权限。这意味着你的代码需要请求Google对你的请求进行签名。这不适用于从元数据服务器委派默认服务帐户。我有wr发表了许多关于谷歌云认证的文章和深入探讨: