Google Dialogflow:应用程序默认凭据不可用
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Google Dialogflow:应用程序默认凭据不可用相关的知识,希望对你有一定的参考价值。
嗨,我对Google Cloud的Java SDK库存在问题。
我需要查询Dialogflow V2 API,我正在使用这个SDK(https://github.com/GoogleCloudPlatform/google-cloud-java/tree/master)
我已按照说明将GOOGLE_APPLICATION_CREDENTIALS设置为环境变量。
我做了几次尝试(我正在使用Mac):
export GOOGLE_APPLICATION_CREDENTIALS=path/to/my.json
不起作用
把
export GOOGLE_APPLICATION_CREDENTIALS=path/to/my.json
在.bash_profile中
不起作用
在我的Java代码中:
System.setProperty("GOOGLE_APPLICATION_CREDENTIALS", "/path/to/my.json");
GoogleCredential credential = GoogleCredential.getApplicationDefault();
不起作用
String jsonPath = "/path/to/my.json";
GoogleCredentials credentials = GoogleCredentials.fromStream(new FileInputStream(jsonPath));
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
不起作用
通过“Maven build> Environment> New variable”将GOOGLE_APPLICATION_CREDENTIALS作为环境变量放入Eclipse并重新启动IDE
不起作用
始终出现相同的错误:
An error occurred during Dialogflow http request: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information.
java.io.IOException: The Application Default Credentials are not available. They are available if running in Google Compute Engine. Otherwise, the environment variable GOOGLE_APPLICATION_CREDENTIALS must be defined pointing to a file defining the credentials. See https://developers.google.com/accounts/docs/application-default-credentials for more information
真的我无法理解有什么不对。
这是由于上述错误而无法查询Dialogflow的代码片段:
SessionsClient sessionsClient = SessionsClient.create();
SessionName session = SessionName.of("my-project-id", sessionId);
InputStream stream = new ByteArrayInputStream(requestBody.getBytes(StandardCharsets.UTF_8));
QueryInput queryInput = QueryInput.newBuilder().build().parseFrom(stream);
DetectIntentResponse response = sessionsClient.detectIntent(session, queryInput);
提出例外
SessionsClient sessionsClient = SessionsClient.create();
提前致谢。
解决方案是将GOOGLE_APPLICATION_CREDENTIALS设置为Application Server的环境变量。
与上面提到的不同,我提供的“凭证”工作方式
Storage storage = StorageOptions.newBuilder().setCredentials(credentials).build().getService();
但与FirestoreOptions
相同的方法失败,提到的错误“应用程序默认凭据不可用”。
注意:我不愿意通过环境变量配置我的应用程序,而更喜欢在代码中进行配置。还有一个原因 - 我需要一个应用程序的多个不同连接。
在调试Google代码后,我发现他们没有使用提供的凭据,而是在提供的选项上调用getCredentialsProvider()
。我认为这是他们的实现中的错误,但解决方法相当简单:
- 创建自己的CredentialsProvider
- 将其设置为FirestoreOptions
假人样本:
public static class MyCredentialsProvider implements CredentialsProvider {
GoogleCredentials credentials;
public MyCredentialsProvider(GoogleCredentials credentials) {
this.credentials = credentials;
}
@Override
public Credentials getCredentials() throws IOException {
return credentials;
}
}
...
FirestoreOptions.Builder builder = FirestoreOptions.newBuilder()
.setProjectId(serviceAccount.project_id)
.setCredentialsProvider(new MyCredentialsProvider(credentials));
以上是关于Google Dialogflow:应用程序默认凭据不可用的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 dialogflow.v2beta1 创建默认响应
Google 的 dialogflow 集成“dialogflow messenger”(测试版)
如何在 C# 中调用 google.apis.dialogflow.v2
DialogFlow Google智能助理Webhook回复:“空话语回应”