我正在测试应该异步发布消息的新Google聊天机器人,因此我必须使用GoogleCredentials来验证请求。
当我在本地工作时使用GoogleCredentials.getApplicationDefault()
时,它工作得很好,但是当我将机器人部署到Cloud Run时,它就停止了。
惯用的安全方式(无效)
通过以下方式创建环聊聊天
var credentials = GoogleCredentials.getApplicationDefault()
.createScoped(CHAT_BOT_SCOPE);
var credentialsAdapter = new HttpCredentialsAdapter(credentials);
var chat = new HangoutsChat.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
credentialsAdapter)
.setApplicationName(BOT_NAME)
.build();
因此,为了在本地工作,我设置了GOOGLE_APPLICATION_CREDENTIALS
并将其指向这样的服务帐户密钥:export GOOGLE_APPLICATION_CREDENTIALS=./credentials/adc.json
。在云环境中,我希望可以使用相同的服务帐户,但是如果未从文件中明确设置,则凭据会因insufficientPermissions
引发PERMISSION_DENIED
错误。
解决方法(工作正常)
作为一种解决方法,我正在使用存储在Secret Manager中的服务帐户创建凭据,如下所示:
var serviceAccount = Secrets.chatServiceAccount();
var credentials = GoogleCredentials.fromStream(streamFrom(serviceAccount))
.createScoped(CHAT_BOT_SCOPE);
var credentialsAdapter = new HttpCredentialsAdapter(credentials);
var chat = new HangoutsChat.Builder(
GoogleNetHttpTransport.newTrustedTransport(),
JacksonFactory.getDefaultInstance(),
credentialsAdapter)
.setApplicationName(BOT_NAME)
.build();
return chat;
private static InputStream streamFrom(String data) {
return new ByteArrayInputStream(data.getBytes(Charset.defaultCharset()));
}
问题是:有人可以使用HangoutsChat API的预设凭证吗?甚至有可能还是我在这里错过了什么?