无法访问 Dialogflow 应用程序的正确应用程序默认凭据
Can't access correct application default credentials for Dialogflow app
我已经使用并发 gcloud 应用程序创建了一个 Dialogflow 代理。但是,当我尝试将它集成到 Node.js 后端时,它似乎访问了错误的应用程序默认凭据。
我可以确认它正在验证身份验证是否成功,因为当我 运行 此代码时它的控制台记录了正确的项目 ID (diagnosistest-56e81):
// Imports the Google Cloud client library.
const Storage = require('@google-cloud/storage')
// Instantiates a client. If you don't specify credentials when constructing
// the client, the client library will look for credentials in the
// environment.
const storage = new Storage();
// Makes an authenticated API request.
storage
.getBuckets()
.then((results) => {
const buckets = results[0];
console.log('Buckets:');
buckets.forEach((bucket) => {
console.log(bucket.name);
});
})
.catch((err) => {
console.error('ERROR:', err);
})
但是,当我尝试连接 dialogflow 时,出现错误。
连接到 dialogflow 的代码:
// You can find your project ID in your Dialogflow agent settings
const projectId = 'diagnosistest-56e81'; //https://dialogflow.com/docs/agents#settings
const sessionId = 'quickstart-session-id';
const query = 'hello';
const languageCode = 'en-US';
// Instantiate a DialogFlow client.
const dialogflow = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient();
// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);
// The text query request.
const request = {
session: sessionPath,
queryInput: {
text: {
text: query,
languageCode: languageCode,
},
},
};
// Send request and log result
sessionClient
.detectIntent(request)
.then(responses => {
console.log('Detected intent');
const result = responses[0].queryResult;
console.log(` Query: ${result.queryText}`);
console.log(` Response: ${result.fulfillmentText}`);
if (result.intent) {
console.log(` Intent: ${result.intent.displayName}`);
} else {
console.log(` No intent matched.`);
}
})
.catch(err => {
console.error('ERROR:', err);
});
我收到的错误消息:
ERROR: { Error: 7 PERMISSION_DENIED: Dialogflow API has not been used in project 764086051850 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dialogflow.googleapis.com/overview?project=764086051850 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
奇怪的是,我的项目编号是 889800549397 而不是 764086051850。所以它似乎没有访问正确的凭据。
目前我尝试过的:
- 创建新的 Dialogflow 服务帐户密钥并通过
export GOOGLE_APPLICATION_CREDENTIALS='/Users/Joseph/workspace/finddoc/DiagnosisTest-cred.json
设置导出到 json 密钥文件
- 正在删除
./config/gcloud/
文件夹中的 application_default_credentials.json
文件。
当我这样做时,我收到一条不同的错误消息:
ERROR: Error: Unexpected error while acquiring application default credentials: Could not load the default credentials. Browse to https://developers.google.com/accounts/docs/application-default-credentials for more information.
终于明白问题出在哪里了。设置好环境变量GOOGLE_APPLICATION_CREDENTIALS后,需要重启电脑才能生效!
当我尝试使用 Dialogflow V2 API 时,我在本地计算机上遇到了完全相同的错误消息(包括 764086051850 项目 ID)。我不想打扰 GOOGLE_APPLICATION_CREDENTIALS
环境变量,所以我按照说明进行操作 here.
具体来说,这部分很重要:
API enablement and quotas are managed by the master Application Default Credentials project. In the case of errors related to the API not being enabled or quota limitations, use the --client-id-file flag. You can create the client-id-file at https://console.cloud.google.com/apis/credentials.
我结束的命令运行:
gcloud auth application-default login --client-id-file=my_app_client_id.json
这会将应用程序默认凭据保存到您的主目录中的一个文件中。例如:/Users/nathanb/.config/gcloud/application_default_credentials.json
我已经使用并发 gcloud 应用程序创建了一个 Dialogflow 代理。但是,当我尝试将它集成到 Node.js 后端时,它似乎访问了错误的应用程序默认凭据。
我可以确认它正在验证身份验证是否成功,因为当我 运行 此代码时它的控制台记录了正确的项目 ID (diagnosistest-56e81):
// Imports the Google Cloud client library.
const Storage = require('@google-cloud/storage')
// Instantiates a client. If you don't specify credentials when constructing
// the client, the client library will look for credentials in the
// environment.
const storage = new Storage();
// Makes an authenticated API request.
storage
.getBuckets()
.then((results) => {
const buckets = results[0];
console.log('Buckets:');
buckets.forEach((bucket) => {
console.log(bucket.name);
});
})
.catch((err) => {
console.error('ERROR:', err);
})
但是,当我尝试连接 dialogflow 时,出现错误。
连接到 dialogflow 的代码:
// You can find your project ID in your Dialogflow agent settings
const projectId = 'diagnosistest-56e81'; //https://dialogflow.com/docs/agents#settings
const sessionId = 'quickstart-session-id';
const query = 'hello';
const languageCode = 'en-US';
// Instantiate a DialogFlow client.
const dialogflow = require('dialogflow');
const sessionClient = new dialogflow.SessionsClient();
// Define session path
const sessionPath = sessionClient.sessionPath(projectId, sessionId);
// The text query request.
const request = {
session: sessionPath,
queryInput: {
text: {
text: query,
languageCode: languageCode,
},
},
};
// Send request and log result
sessionClient
.detectIntent(request)
.then(responses => {
console.log('Detected intent');
const result = responses[0].queryResult;
console.log(` Query: ${result.queryText}`);
console.log(` Response: ${result.fulfillmentText}`);
if (result.intent) {
console.log(` Intent: ${result.intent.displayName}`);
} else {
console.log(` No intent matched.`);
}
})
.catch(err => {
console.error('ERROR:', err);
});
我收到的错误消息:
ERROR: { Error: 7 PERMISSION_DENIED: Dialogflow API has not been used in project 764086051850 before or it is disabled. Enable it by visiting https://console.developers.google.com/apis/api/dialogflow.googleapis.com/overview?project=764086051850 then retry. If you enabled this API recently, wait a few minutes for the action to propagate to our systems and retry.
奇怪的是,我的项目编号是 889800549397 而不是 764086051850。所以它似乎没有访问正确的凭据。
目前我尝试过的:
- 创建新的 Dialogflow 服务帐户密钥并通过
export GOOGLE_APPLICATION_CREDENTIALS='/Users/Joseph/workspace/finddoc/DiagnosisTest-cred.json
设置导出到 json 密钥文件
- 正在删除
./config/gcloud/
文件夹中的application_default_credentials.json
文件。
当我这样做时,我收到一条不同的错误消息:
ERROR: Error: Unexpected error while acquiring application default credentials: Could not load the default credentials. Browse to https://developers.google.com/accounts/docs/application-default-credentials for more information.
终于明白问题出在哪里了。设置好环境变量GOOGLE_APPLICATION_CREDENTIALS后,需要重启电脑才能生效!
当我尝试使用 Dialogflow V2 API 时,我在本地计算机上遇到了完全相同的错误消息(包括 764086051850 项目 ID)。我不想打扰 GOOGLE_APPLICATION_CREDENTIALS
环境变量,所以我按照说明进行操作 here.
具体来说,这部分很重要:
API enablement and quotas are managed by the master Application Default Credentials project. In the case of errors related to the API not being enabled or quota limitations, use the --client-id-file flag. You can create the client-id-file at https://console.cloud.google.com/apis/credentials.
我结束的命令运行:
gcloud auth application-default login --client-id-file=my_app_client_id.json
这会将应用程序默认凭据保存到您的主目录中的一个文件中。例如:/Users/nathanb/.config/gcloud/application_default_credentials.json