4

我使用Watson APIs Java SDK并且我的身份验证使用函数 setUsernameAndPassword(username, password),但现在我想使用Tokens 进行身份验证

我的“用户名和密码”代码

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"


用于身份验证Method-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)

方法二

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使用 Tokens 进行身份验证,我应该怎么做?

4

3 回答 3

4

编辑:以下答案适用于您之前获得的令牌。但是,我刚刚注意到您使用https://gateway.watsonplatform.net/conversation/apiURL 调用了令牌 API。如果您改为使用 获得令牌https://gateway.watsonplatform.net/assistant/api,则您发布的代码应该可以正常工作。


由于对话 -> 助手重命名,使用新名称的授权似乎存在问题。因此,一旦获得授权令牌,就可以使用该setEndPoint()方法调用 Conversation 端点,如下所示:

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 只是内部对话的别名,因此您的 API 调用应该相同。

或者,您可以直接使用对话服务,尽管在某些时候会消失而只支持助手服务。

于 2018-05-07T15:48:20.380 回答
0

Java SDK 的 README 中实际上有一个示例:有一种方法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(身份和访问管理),而不是 Watson 服务令牌。该功能最近被添加到 Watson 服务中,我建议使用它。您可以使用 UI 或通过bx iam命令管理 API 密钥。

于 2018-05-07T08:34:41.757 回答
0

下面的代码对我来说很好,但我有一个问题,哪种方法更好?

方法一

通过 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);

方法二

通过 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 回答