调用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
相关产品推荐
相关产品推荐

