Watson Node SDK 中用于 API 与 IAM 请求的代理设置
在 Watson 服务客户端与其 IAM 认证器之间共用同一隧道代理,使令牌获取也能走代理。
当 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 通路适用于此处使用的基于网络的认证器。