我想使用NodeJS中的来生成签名的URL
它在云运行环境中工作,但我找不到任何方法在本地弥补它!最后总是出现以下错误:
Error: Cannot sign data without `client_email`.
我知道我必须为此使用一个服务帐户(SA),并且它通过使用命令gcloud config set auth/impersonate_service_account SA_EMAIL
或直接gsutil -i SA_EMAIL signurl -d 10m -u gs://bucket/file
来模拟一个帐户运行得很好
但是它不是由代码工作的,因为我的ADC凭据似乎没有使用在CLI中工作的模拟
我知道我可以这样传递服务帐户的密钥文件。
const storage = new Storage({
credentials: {
client_email: 'SA_EMAIL',
private_key: 'path/to/key.json'
}
});
但是我的组织不允许,所以我必须找到另一种方法让代码知道我使用的是正确的SA
发布于 2022-10-18 19:50:27
您的组织是正确的,您不需要使用服务帐户密钥文件,这是一件坏事/想法。
您可以使用不同的方法,但不确定它在nodeJS中是否有效。
试试那个gcloud auth application-default login --impersonate-service-account=xxxx
。此命令将根据您自己的身份在本地计算机上创建凭据,并模拟服务帐户。
然而,有几个库接受这种新模式(不是新的,我猜是6个月前实现的),但只有JAVA支持它。我做了一个歌朗的贡献,让戈朗支持它。)我不知道NodeJS Google OAuth2库是否支持这种身份验证模式。
我还有另外两个选项(在Python中),但似乎Node中不支持它(我深入了解了源代码,该特性没有实现)
如果它仍然不能工作,并且继续不使用服务帐户密钥文件(这很糟糕),我建议您在客户端库中实现与我在Python中使用的特性相同。我没有NodeJS的技能来做到这一点,如果你可以,如果你有时间作出贡献,那就太好了!
发布于 2022-10-19 17:43:28
发布于 2022-10-18 19:00:26
如果您的组织不允许下载服务帐户密钥,您将无法在本地计算机上获得服务帐户密钥。
您有一些本地测试的选项(我想您这样做是为了测试?)。如果允许的话,最简单的方法是创建一个不属于组织的单独项目,并从那里获取服务帐户密钥。如果它与您的组织的权限和数据完全断开连接,那么希望稍微放松一些凭据是可以接受的。
另一种选择是使用HMAC身份验证,如果它适用于您用来签名URL的任何工具和库。如果您的组织策略没有阻止HMAC签名请求(尽管它们很有可能会阻止HMAC签名请求),您也许可以使用HMAC凭据来签名请求,而不是服务帐户密钥。
https://stackoverflow.com/questions/74109780
复制相似问题