You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用aps-sdk-node的getVersionItem时报令牌无效错误求助

问题描述

使用aps-sdk-node库调用dataManagementClient.getVersionItem时,出现错误:

Error: Please provide a valid access token or an authentication provider at DataManagementClient.

应用数月前运行正常,未在APS博客中找到破坏性更新。目标API为免费版本,认为无需云令牌,且已尝试添加所有可能的权限范围,但问题仍未解决。

补充说明:
令牌获取逻辑如下,且未通过SDK实现的apsRaw.getUserProjectInfo请求可正常使用该令牌。

const sdkManager = SdkManagerBuilder.create().build();
 const authenticationClient = new AuthenticationClient(sdkManager);
 const dataManagementClient = new DataManagementClient(sdkManager);
 const modelDerivativeClient = new ModelDerivativeClient(sdkManager);

getTwoLeggedToken = async () => {
  const { APS_CLIENT_ID, APS_CLIENT_SECRET } = process.env;
  const token = await authenticationClient.getTwoLeggedToken(
    APS_CLIENT_ID,
    APS_CLIENT_SECRET,
    [
      Scopes.AccountRead,
      Scopes.AccountWrite,
      Scopes.BucketCreate,
      Scopes.BucketDelete,
      Scopes.BucketRead,
      Scopes.BucketUpdate,
      Scopes.CodeAll,
      // Scopes.DataCreate,
      Scopes.DataRead,
      // Scopes.DataReadUrnOfResource,
      // Scopes.DataSearch,
      Scopes.DataWrite,
      // Scopes.UserProfileRead,
      // Scopes.UserRead,
      // Scopes.UserWrite,
      Scopes.ViewablesRead,
    ],
  );
  return token;
};

twoLeggedMiddleware = async (req, res, next) => {
  try {
    const { access_token } = await getTwoLeggedToken();
    /* some middleware logic */
    const { roles, name, companyName } = await apsRaw.getUserProjectInfo(
      projectId,
      userId,
      access_token,
    );
    /* some middleware logic */
    next();
  } catch (e) {
    next(e);
  }
};
解决方案

问题核心是:你获取到令牌后,没有将其传递给DataManagementClient实例。手动调用apsRaw接口时是直接传了令牌所以能正常工作,但SDK客户端默认不会自动关联你拿到的令牌。

解决方式有两种:

  • 全局设置令牌(推荐):在中间件拿到access_token后,通过SdkManager设置全局访问令牌,所有基于该实例创建的客户端都会自动使用这个令牌:
    twoLeggedMiddleware = async (req, res, next) => {
      try {
        const { access_token } = await getTwoLeggedToken();
        // 添加这行代码,将令牌绑定到SdkManager
        sdkManager.setAccessToken(access_token);
        /* some middleware logic */
        const { roles, name, companyName } = await apsRaw.getUserProjectInfo(
          projectId,
          userId,
          access_token,
        );
        /* some middleware logic */
        next();
      } catch (e) {
        next(e);
      }
    };
    
  • 单独给DataManagementClient设置令牌:如果不需要全局生效,可直接给目标客户端配置令牌:
    dataManagementClient.setAccessToken(access_token);
    

另外,你已经添加了DataRead权限,这是调用getVersionItem必需的范围,权限配置没问题。

内容的提问来源于stack exchange,提问作者FunkyPenguin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 23:27:43