В разрешении IAM отказано при попытке определить намерение в dialogflow CX

# #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.