В API Java Watson Java SDK используется ошибка аутентификации токена Watson - PullRequest
0 голосов
/ 07 мая 2018

Я использую API Watson Java SDK , и моя Аутентификация была с использованием функции setUsernameAndPassword (имя пользователя, пароль), но теперь я хочу использовать Токены для аутентификации .

мой код "Имя пользователя и пароль"

mAssistant = new Assistant("2018-02-16");
mAssistant.setUsernameAndPassword(mUserName, mPassword);
InputData input = new InputData.Builder("Hello").build();
MessageOptions options = new MessageOptions.Builder("{workspaceId}")
                                           .input(input)
                                           .build();
MessageResponse response = mAssistant.message(options).execute();
System.out.println(response);

отлично работает.

Я использую этот метод, чтобы получить мой токен. curl -X GET --user "{username}:{password}" "https://gateway.watsonplatform.net/authorization/api/v1/token?url=https://gateway.watsonplatform.net/conversation/api"

токены для аутентификации
Метод-1

mAssistant = new Assistant("2018-02-16");
Map<String, String> map = new HashMap<>();
map.put("X-Watson-Authorization-Token", "{token_string}");
mAssistant.setDefaultHeaders(map);
mAssistant.setSkipAuthentication(true);
InputData input = new InputData.Builder("Hello").build();
MessageOptions options = new MessageOptions.Builder("{workspaceId}")
                                           .input(input)
                                           .build();
MessageResponse response = mAssistant.message(options).execute();
System.out.println(response);

получить код ошибки

E/WatsonService: POST status: 403, error: Forbidden
com.ibm.watson.developer_cloud.service.exception.ForbiddenException: Forbidden
05-07 16:05:57.720 10392-10476/mvi.rcu W/System.err:     at com.ibm.watson.developer_cloud.service.WatsonService.processServiceCall(WatsonService.java:401)
05-07 16:05:57.720 10392-10476/mvi.rcu W/System.err:     at com.ibm.watson.developer_cloud.service.WatsonService$WatsonServiceCall.execute(WatsonService.java:459)
* * Метод тысяча двадцать-одина-2 * * тысяча двадцать-два
mAssistant = new Assistant("2018-02-16");
IamOptions options = new IamOptions.Builder()
                                   .accessToken(token)
                                   .build();
mAssistant.setIamCredentials(options);
mAssistant.setEndPoint("https://gateway.watsonplatform.net/conversation/api");
// do same ... 
// mAssistant.message(options).execute();
// ...

получить сообщение об ошибке

W/System.err: com.ibm.watson.developer_cloud.service.exception.UnauthorizedException: Unauthorized: Access is denied due to invalid credentials. Tip: Did you set the Endpoint?
W/System.err:     at com.ibm.watson.developer_cloud.service.WatsonService.processServiceCall(WatsonService.java:398)
W/System.err:     at com.ibm.watson.developer_cloud.service.WatsonService$WatsonServiceCall.execute(WatsonService.java:459)

Если я хочу использовать токены для аутентификации с помощью API Watson Java SDK , что мне делать?

Ответы [ 3 ]

0 голосов
/ 07 мая 2018

РЕДАКТИРОВАТЬ: ответ ниже работает с токеном, который вы получили ранее. Однако я только что заметил, что вы вызывали API токена, используя URL https://gateway.watsonplatform.net/conversation/api. Если вместо этого вы получите токен с https://gateway.watsonplatform.net/assistant/api, ваш опубликованный код должен работать нормально.


Из-за переименования «Разговор» -> «Помощник», похоже, возникла проблема с авторизацией с использованием нового имени. Поэтому, как только вы получите свой токен авторизации, вы можете использовать метод setEndPoint() для вызова конечной точки беседы, например:

mAssistant = new Assistant("2018-02-16");
Map<String, String> map = new HashMap<>();
map.put("X-Watson-Authorization-Token", "{token_string}");
mAssistant.setDefaultHeaders(map);
mAssistant.setSkipAuthentication(true);

// change here
mAssistant.setEndPoint("https://gateway.watsonplatform.net/conversation/api");

Помощник - это просто псевдоним для внутренней беседы, поэтому ваши вызовы API должны работать одинаково.

В качестве альтернативы, вы можете просто использовать службу беседы напрямую, хотя в какой-то момент это уйдет в пользу только службы помощника.

0 голосов
/ 08 мая 2018

Приведенный ниже код работает нормально для меня, но у меня есть вопрос, какой метод лучше?

Метод-1

Получить токен по URL https://gateway.watsonplatform.net/assistant/api

curl -X GET --user {username}:{password} "https://gateway.watsonplatform.net/authorization/api/v1/token?url=https://gateway.watsonplatform.net/assistant/api"

Использовать токен

mAssistant = new Assistant("2018-02-16");
Map<String, String> map = new HashMap<>();
map.put("X-Watson-Authorization-Token", "{token_string}");
mAssistant.setDefaultHeaders(map);
mAssistant.setSkipAuthentication(true);

Метод-2

Получить токен по URL https://gateway.watsonplatform.net/conversation/api

curl -X GET --user {username}:{password} "https://gateway.watsonplatform.net/authorization/api/v1/token?url=https://gateway.watsonplatform.net/conversation/api"

Использовать токен

mAssistant = new Assistant("2018-02-16");
Map<String, String> map = new HashMap<>();
map.put("X-Watson-Authorization-Token", "{token_string}");
mAssistant.setDefaultHeaders(map);
mAssistant.setSkipAuthentication(true);
mAssistant.setEndPoint("https://gateway.watsonplatform.net/conversation/api");
0 голосов
/ 07 мая 2018

На самом деле в README Java SDK есть пример : существует метод setIamCredentials(), позволяющий настроить, как служба Watson, включая Watson Assistant, обрабатывает доступ на основе токенов. Он может управлять обновлением токена, если вы предоставите ключ API или передадите сам токен, и вам нужно позаботиться об обновлениях.

Не проверено, но похоже на пример для службы Discovery и адаптировано под ваш код:

mAssistant = new Assistant("2018-02-16");
IamOptions options = new IamOptions.Builder()
  .apiKey("<iam_api_key>")
  .build();
mAssistant.setIamCredentials(options);

Обратите внимание, что здесь используется стратегический IBM Cloud IAM (Identity and Access Management) , а не токен службы Watson. Эта функция была недавно добавлена ​​в сервисы Watson, и я бы порекомендовал ее использовать. Вы можете управлять ключом API с помощью пользовательского интерфейса или с помощью команд bx iam.

...