使用默认服务帐户进行的环聊聊天API身份验证失败

时间:2020-06-25 08:48:17

标签: java google-cloud-platform google-cloud-run hangouts-chat

我正在测试应该异步发布消息的新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的预设凭证吗?甚至有可能还是我在这里错过了什么?

0 个答案:

没有答案