4

私はWatson APIs Java SDKを使用しており、私の認証は関数 setUsernameAndPassword(username, password) を使用していましたが、今は認証にトークンを使用したいと考えています。

私の「ユーザー名とパスワード」コード

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)

Watson APIs Java SDKによる認証にトークンを使用したい場合、どうすればよいですか?

4

3 に答える 3

4

編集:以下の回答は、以前に取得したトークンで機能します。ただし、https://gateway.watsonplatform.net/conversation/apiURL を使用してトークン 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");

Assistant は、内部的に Conversation の単なるエイリアスであるため、API 呼び出しは同じように機能するはずです。

別の方法として、Conversation サービスを直接使用することもできますが、いずれは Assistant サービスのみが優先されます。

于 2018-05-07T15:48:20.380 に答える
0

以下のコードは私にとっては問題なく機能しますが、どの方法が優れているかという質問があります。

方法-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");
于 2018-05-08T02:04:08.473 に答える