当 Watson 调用在到达服务之前就失败时,先确认失败的那次请求是否为 IAM 令牌请求。经 IAM 认证的调用可能先访问 IAM,再访问服务。

在已经使用相应 Watson SDK 和 tunnel 依赖的应用中,为两个对象配置相同的网络设置:

const tunnel = require('tunnel');
const AssistantV2 = require('ibm-watson/assistant/v2');
const { IamAuthenticator } = require('ibm-watson/auth');

const httpsAgent = tunnel.httpsOverHttp({
  proxy: { host: 'proxy.example', port: 8080 },
});

const network = { httpsAgent, proxy: false };
const authenticator = new IamAuthenticator({
  apikey: apiKey,
  ...network,
});
const assistant = new AssistantV2({
  version: serviceVersion,
  serviceUrl,
  authenticator,
  ...network,
});

保留应用现有的 apiKey、serviceVersion 和 serviceUrl。API 与 IAM 端点仍是它们原本的目标地址;代理监听器属于该 agent。HTTP 代理列表可以提供候选地址,前提是两个公共服务端点都能通过你选定的代理访问。

tunnel.httpsOverHttp 通过 HTTP 代理建立 HTTPS 通路。proxy: false 阻止 SDK 在这个自定义 agent 之上再套用另一套内置代理配置。

如果你此前只把上述设置提供给了 assistant,那么认证器就是遗漏、需要检查的地方。基础认证与已签发的 bearer 令牌具有不同的令牌获取生命周期,因此这条额外的 IAM 通路适用于此处使用的基于网络的认证器。

相关文章