![](/img/trans.png)
[英]GCP DialogFlow API error: "The Application Default Credentials are not available"
[英]Google Dialogflow: The Application Default Credentials are not available
嗨,我对 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()
。 我认为这是他们实现中的错误,但解决方法相当简单:
虚拟样本:
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));
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.