# #node.js #firebase #google-cloud-functions #dialogflow-cx
Вопрос:
Я создал учетную запись службы и предоставил ее своему env в соответствии с этим руководством
https://cloud.google.com/dialogflow/cx/docs/quick/setup#windows
Я попытался запустить свой код с помощью firebase serve
, но получил следующую ошибку:
Error: 7 PERMISSION_DENIED: IAM permission 'dialogflow.sessions.detectIntent' on 'projects/botDialogflowCX/locations/us-central1/agents/chat' denied
Я уверен, что учетная запись службы верна. Я уже пытался создать учетную запись администратора dialogflow, учетную запись клиента и владельца проекта.
Вот мой код
const functions = require("firebase-functions");
const { SessionsClient } = require("@google-cloud/dialogflow-cx");
const crededentials = require("../../.env/botdialogflowcx-5e936a89c163.json");
exports.teste = functions.https.onRequest((request, response) => {
functions.logger.info("Hello logs!", { structuredData: true });
const client = new SessionsClient({
apiEndpoint: "us-central1-dialogflow.googleapis.com",
});
const sessionId = Math.random().toString(36).substring(7);
const sessionPath = client.projectLocationAgentSessionPath(
"botDialogflowCX",
"us-central1",
"chat",
sessionId);
console.info(sessionPath);
const requestDialogflow = {
session: sessionPath,
queryInput: {
text: {
text: "Oi",
},
languageCode: "pt-br",
},
};
client.detectIntent(requestDialogflow).then((snapshot) => {
const webhookResponse = {
fulfillment_response: {
messages: [{
text: {
text: ["testandoooo", snapshot],
},
},
],
},
};
response.send(webhookResponse);
}).catch((error) => {
console.log(error);
response.status(500).send(error);
});
});
Я действительно не знаю, что происходит.
Выполнение команды
gcloud projects get-iam-policy botdialogflowcx --flatten="bindings[].members" --format="table(bindings.role)" --filter="bindings.members:teste-889@botdialogflowcx.iam.gserviceaccount.com"
Выход был roles/dialogflow.admin
.
Я добавляю электронное письмо в учетную запись службы в диалоговом окне CX — agent — share.
электронная почта в диалоговом окне CX — агент — общий доступ
электронная почта в службе учетных записей
Но все равно возникает та же ошибка, что у IAM нет разрешения.
Комментарии:
1. 1) Найдите файл client_emil в botdialogflowcx-5e936a89c163.json . 2) Отредактируйте свой вопрос и включите эту команду и выходные данные в свой вопрос: проекты gcloud получают-iam-политику $PROJECT —выравнивание=»привязки[].участники» —формат=»таблица(привязки.роль)» —фильтр=»привязки.участники:$SA_EMAIL»
2. Выполните эту команду, затем подождите пять минут и повторите попытку: службы gcloud включают dialogflow.googleapis.com
3. Также попробуйте изменить код клиента: const client = новый сеанс({Имя файла ключа: «../../.env/botdialogflowcx-5e936a89c163.json», точка доступа: «us-central1-dialogflow.googleapis.com»});
4. Все еще испытываю ту же проблему. Я включил службы gcloud и изменил имя файла ключа
5. В консоли Dialogflow CX у учетной записи службы есть разрешение? dialogflow.cloud.google.com/cx/projects Для учетной записи службы потребуется администратор роли агента Dialogflow. Настройки агента -> Поделиться.
Ответ №1:
Ошибка «Отказано в разрешении IAM» обычно возникает из-за того, что используемой учетной записи службы не было предоставлено достаточное разрешение для выполнения запрошенного действия в проекте GCP, подключенном к агенту Dialogflow, вы использовали неверные учетные данные в своем запросе или запросили неверного агента.
Глядя на следующий код и обнаруженную ошибку, кажется, что Имя проекта и Имя агента использовались вместо идентификатора проекта и значения идентификатора агента соответственно.
const sessionPath = client.projectLocationAgentSessionPath(
"botDialogflowCX", // update to Project ID
"us-central1",
"Chat", // update to Agent ID
sessionId);
Пожалуйста, обратите внимание, что идентификатор проекта и идентификатор агента отличаются от Имени проекта и Имени агента, вы можете обратиться к следующей документации о том, как собирать идентификаторы.
Ответ №2:
Я понял. Мне просто нужно было изменить
client.projectLocationAgentSessionPath(
"botDialogflowCX",
"us-central1",
"chat",
sessionId);
Для
const sessionPath = client.projectLocationAgentSessionPath(
"botdialogflowcx",
"us-central1",
"e55b9ef5-d1f2-4e5c-9e95-974501233d50",
sessionId);
и это сработало.
Ответ №3:
если вы используете этот код в облачных функциях, я не считаю, что вам нужно предоставлять учетные данные. Если вы запускаете это локально, вы бы установили свои учетные данные следующим образом :
$env:GOOGLE_APPLICATION_CREDENTIALS="KEY_PATH"
Таким образом, вам не нужно будет указывать учетные данные в своем коде.
Комментарии:
1. Я получаю ошибку при попытке загрузки в облачные функции. Когда я пытаюсь запустить локально, я получаю ошибку 7.