Как исправить проблему с аутентификацией в диалоге - PullRequest
0 голосов
/ 01 мая 2019

У меня есть проект диалогового потока, к которому я пытаюсь получить доступ из Java с помощью вызова rest.Это дает мне проблему аутентификации.Я выполнил все онлайн-инструкции (и многие предложения на форуме) безрезультатно.

Я попытался сгенерировать ключ json в соответствии с инструкциями здесь:

https://dialogflow.com/docs/reference/v2-auth-setup

и установка моей переменной среды, как описано, но, похоже, ничего не работает.Я проверил свой идентификатор проекта, и я работаю на той же машине с переменной окружения, и дважды, тройной и четверной проверил его имя и местоположение, но я все еще получаю следующую ошибку:

java.net.HttpRetryException: cannot retry due to server authentication, in streaming mode

Вотмой код (хотя это вызов REST, поэтому я не знаю, насколько это актуально):

String url = https://dialogflow.googleapis.com/v2/projects/MYPROJECT/agent/sessions/SESSION_NUM:detectIntent
URL url = new URL(full_url);
String inText = "Hello World";
String outText = "";
HttpURLConnection con = (HttpURLConnection) url.openConnection();
try {
    con.setDoOutput(true);
    con.setRequestMethod("POST");

    // set body of http post
    Map<String,String> arguments = new HashMap<>();
    JSONObject inTextJsn = new JSONObject();
    inTextJsn.append("text",inText);
    inTextJsn.append("languageCode","en");
    JSONObject fieldJsn = new JSONObject();
    fieldJsn.append("text", inTextJsn);
    arguments.put("queryInput", fieldJsn.toString());
    StringJoiner sj = new StringJoiner("&");
    for(Map.Entry<String,String> entry : arguments.entrySet())
        sj.add(URLEncoder.encode(entry.getKey(), "UTF-8") + "="
                + URLEncoder.encode(entry.getValue(), "UTF-8"));

    // post http post as bytes
    byte[] bytes_out = sj.toString().getBytes(StandardCharsets.UTF_8);
    con.setFixedLengthStreamingMode(bytes_out.length);
    con.connect();
    try (OutputStream os = con.getOutputStream()) {
        os.write(bytes_out);
    }
    BufferedReader reader = new BufferedReader(new InputStreamReader(con.getInputStream(),
            "UTF-8"));

    // read all lines to a string
    String line;
    String response = "";
    while ((line = reader.readLine()) != null) {
        response += line;
    }


    JSONObject responseJsn = new JSONObject(response);
    outText = responseJsn.get("fulfillmentText").toString();

} catch (Exception e) {
    System.err.println(e);
} finally {
    con.disconnect();
}

return restResponse;

Суть кода заключается в простой отправке сообщения ("Hello World!") моемудиалоговое окно, и получите ответ моего агента (в коде могут быть ошибки - сложно проверить, когда я не могу пройти эту проблему с аутентификацией, поэтому, пожалуйста, помогите с аутентификацией, а не с ошибками кода).

Спасибо всем!

1 Ответ

0 голосов
/ 01 мая 2019

Указания на этой странице предполагают, что вы собираетесь использовать программу gcloud для создания действующего на данный момент токена-носителя, который затем отправляется вместе с заголовками HTTP.Эта страница иллюстрирует

Ваш код вообще не генерирует HTTP-заголовок Authorization, поэтому вы получаете сообщение об ошибке.

Поскольку вы используетеJava, вы должны взглянуть на google-auth-library-java library , которая предоставит вам инструменты для генерации токена, который вам нужно предоставить в заголовке Authorization.

Youможет также захотеть проверить библиотеку google-cloud-java .Он содержит классы Java для непосредственного выполнения операций с Dialogflow вместо того, чтобы кодировать вызовы REST / HTTP самостоятельно.(Тем не менее, он все еще находится на альфа-уровне для Dialogflow, поэтому может быть нестабильным или совместимым с форвардами.)

...