您无权进行此操作。无效的访问令牌DialogFlow v2

时间:2018-06-01 07:48:21

标签: javascript google-api google-cloud-platform dialogflow

我正在尝试使用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))

我不知道这是否是与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 :(得分:2)

您没有显示您正在使用的baseUrl,但这看起来像是V1 API而不是V2 API。你应该migrate your code to V2

另请注意,访问令牌过期,因此您需要定期生成新的令牌。你不能要求长寿&#34;令牌(这被认为是不安全的),但是应该让你的代码在前一个到期之前调用gcloud auth print-access-token(或使用库做同样的事情)。

将您的代码移至V2后,根据您的代码

更新

queryInput参数不直接接受字符串。必须将其设置为QueryInput object。这是一个枚举,因此只能指定一个字段集。看起来您需要text字段,该字段需要TextInput object

因此,您的body参数可能会设置如下:

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

然后在request()选项中设置。

答案 1 :(得分:0)

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