Вы не авторизованы для этой операции.Неверный токен доступа DialogFlow v2 - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь использовать конечную точку DialogFlow v2, но по какой-то причине я получаю неавторизованное сообщение, даже если я могу сгенерировать токен доступа, используя следующую команду:

Сначала я запускаю это для авторизации службычтобы моя локальная машина могла авторизоваться для службы: gcloud auth activate-service-account --key-file=<service-account-key-file.json>, тогда я получаю токен доступа с помощью следующей команды: gcloud auth print-access-token и этот токен доступа я прилагаю к следующему коду:

fetch(configs.baseUrl + "query?v=20150910", {
    body: JSON.stringify({query: text, lang: "en", sessionId: "somerandomthing"}),
    headers: {
        'content-type': 'application/json',
        "Authorization": "Bearer " + accessToken,
    },
    method: 'POST',
})
    .then(response => response.json())
    .then(data => {
        console.log(data.result.fulfillment.speech);
        return data.result.fulfillment.speech;
    })
    .catch(error => console.error(error))

IНе знаете, если это правильный путь для достижения связи с DialogFlow V2?Пожалуйста, если вы могли бы сообщить мне, что я делаю неправильно и почему я говорю, что я не авторизован, так как я авторизируюсь вышеуказанными командами и смог получить маркер доступа!

Редактировать:

После нескольких изменений мой код, наконец, выглядит следующим образом:

fetch("https://dialogflow.googleapis.com/v2beta1/projects/xxx/agent/sessions/xxx/:detectIntent", {
        body: JSON.stringify({queryInput: "Hello"}),
        headers: {
            'content-type': 'application/json',
            "Authorization": "Bearer xxxx",
        },
        method: 'POST',
    })
        .then(response => response.json())
        .then(data => {
            console.log(data.result.fulfillment.speech);
            return data.result.fulfillment.speech;
        })
        .catch(error => console.error(error))

и новое сообщение об ошибке, которое я получаю:

{
  "error": {
    "code": 400,
    "message": "Invalid value at 'query_input' (type.googleapis.com/google.cloud.dialogflow.v2beta1.QueryInput), \"Hello\"",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.BadRequest",
        "fieldViolations": [
          {
            "field": "query_input",
            "description": "Invalid value at 'query_input' (type.googleapis.com/google.cloud.dialogflow.v2beta1.QueryInput), \"Saanko yhteystiedot?\""
          }
        ]
      }
    ]
  }
}

Ответы [ 2 ]

0 голосов
/ 16 августа 2019
Because you have put wrong URL in your project.
Open below image and see which URL use for posturl in your project

https://i.stack.imgur.com/3ym9n.png

0 голосов
/ 01 июня 2018

Вы не показываете baseUrl, который вы используете, но это похоже на API V1, а не API V2.Вы должны перенести свой код в V2 .

Также имейте в виду, что срок действия маркера доступа истекает, поэтому вам потребуется периодически генерировать новый.Вы не можете запросить «долгоживущий» токен (это считается небезопасным), но ваш код должен вызвать gcloud auth print-access-token (или использовать библиотеку, чтобы сделать то же самое) до истечения срока действия предыдущего.

Обновите в соответствии с вашим кодом, как только вы переместили его в V2:

Параметр queryInput не принимает строку напрямую.Это должен быть объект QueryInput .Это перечисление, поэтому может быть установлено только одно из указанных полей.Похоже, вам нужно поле text, для которого требуется объект TextInput .

Так что ваш параметр body может быть настроен примерно так:

var body = {
  queryInput: {
    text: {
      text: "Hello",
      language: "en-US"
    }
  }
};
var bodyStr = JSON.stringify(body);

и затем установите в ваших request() опциях.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...