IBM Watson IAM 令牌是适用于所有服务还是特定于每项服务,例如 Speech-to-Text?

Are IBM Watson IAM tokens good for all services or specific to each service, e.g., Speech-to-Text?

IBM 的 documentation 表示以下 Node 后端代码使您能够 Use the API key to have the SDK manage the lifecycle of the token. The SDK requests an access token, ensures that the access token is valid, and refreshes it if necessary.

const SpeechToTextV1 = require('ibm-watson/speech-to-text/v1');
const { IamAuthenticator } = require('ibm-watson/auth');

const speechToText = new SpeechToTextV1({
  authenticator: new IamAuthenticator({
    apikey: '{apikey}',
  }),
  url: '{url}',
});

如何从 speechToText 获取令牌以传递到我在浏览器中的前端 Angular 应用程序 运行ning?我尝试调用方法 getToken 来获取令牌:

const SpeechToTextV1 = require('ibm-watson/speech-to-text/v1');
const { IamAuthenticator } = require('ibm-watson/auth');

const speechToText = new SpeechToTextV1({
    authenticator: new IamAuthenticator({
      apikey: 'my-api-key',
    }),
    url: 'my-url',
  });

speechToText.getToken(function (err, token) {
    if (!token) {
      console.log('error: ', err);
    } else {
      console.log(token);
      // do more stuff with the token
    }
});

那没用。错误信息是 speechToText.getToken is not a function。我应该试试 speechToText.authenticator.getToken 吗?

我尝试从 ibm-watson/sdk 而不是从 ibm-watson/speech-to-text/v1?

获取令牌
const watson = require('ibm-watson/sdk');
const { IamAuthenticator } = require('ibm-watson/auth');

const authorization = new watson.AuthorizationV1({
  authenticator: new IamAuthenticator({ apikey: 'my-api-key' }),
  url: 'my-url'
});

authorization.getToken(function (err, token) {
    if (!token) {
      console.log('error: ', err);
    } else {
      console.log(token);
      // do stuff with token
    }
});

那会得到一个冒烟的新令牌。但是令牌不起作用。当我 运行 WatsonSpeech.SpeechToText.recognizeMicrophone 时,我收到一条错误消息 HTTP Authentication failed; no valid credentials available

似乎每个 IBM Watson 服务都需要自己的令牌,使用特定于服务的 URL 创建。我将 Speech-to-Text URL 放入 ibm-watson/sdk 中,这样我应该得到正确的标记。我不明白为什么令牌不起作用。

IBM Cloud 使用它所谓的 Identity and Access Management (IAM) 来管理对资源的访问。 IAM 有几个允许细粒度安全控制的概念。您可以向用户或角色授予范围内的访问权限。因此,一个用户可能是资源的管理员,另一个用户只是 reader.

现在,要访问像 IAM 控制的 Watson 服务这样的服务,您的用户名/密码或 API 密钥会变成 Bearer 和 Refresh 令牌,Bearer 令牌仅在一定时间内有效然后需要一个新的刷新令牌。这可能是您看到不同标记的原因。

您可能已经看到了底层 core Node.js SDK which has background information on Authentication 和一些功能。

长话短说:成功创建 IamAuthenticator 后,您应该能够请求令牌并使用它。更好的是,您可以将 IamAuthenticator 传递给许多服务,包括 Watson 服务,以初始化会话。代码"knows"如何获取身份验证信息并使用它来为其他服务进行身份验证。

如果您想自己管理令牌,请查看 Node SDK 中 README 的提供凭据部分:

Use the BearerTokenAuthenticator if you want to manage the lifecycle yourself. For details, see Authenticating to Watson services. If you want to switch your authenticator, you must override the authenticator property directly.

"Authenticating" 主题中的 link 可能有助于您了解访问过程。参见 Invoking IBM Cloud service APIs