Azure DevOps扩展后端查询用户组成员API返回401问题排查
Azure DevOps扩展调用Graph成员接口返回401问题
问题背景
开发向UI新增中心的Azure DevOps扩展时,前端通过SDK拿到两个令牌:
SDK.getAppToken()获取的应用令牌SDK.getAccessToken()获取的当前用户访问令牌
两个令牌都会被传递到后端,原计划用访问令牌调用成员列表查询接口,获取当前登录用户的组成员归属,但接口始终返回401未授权。
复现过程
- 扩展运行时通过Chrome开发者工具抓包,拿到前端传递到后端的应用令牌、访问令牌
- 在Postman中使用抓取到的访问令牌作为Bearer认证凭证,发起请求:
GET https://vssps.dev.azure.com/{organization}/_apis/graph/Memberships/{user subject descriptor}?api-version=6.0-preview.1 - 接口返回401,响应内容:
<div class="title">401 - Uh-oh, you do not have access.</div> <div class="details">The request requires authentication.</div>
已确认的有效信息
- 访问令牌本身有效:同个令牌可成功调用
https://vssps.dev.azure.com/{organization}/_apis/connectionData接口 - 请求中使用的用户subject descriptor取值正确,直接取自上述connectionData接口的返回结果
- 换用成员存在性校验接口做目标组归属判断,同样返回401错误
- 核心需求:仅判断当前扩展用户是否属于指定组,不需要拉取用户全量组成员列表
问题根因与修复方案
根因
SDK.getAccessToken()默认返回的令牌未携带Graph API所需的权限范围(scope)。connectionData属于基础身份接口,仅需最基础的用户身份声明即可访问,但所有Graph域下的成员关系类接口,都要求令牌携带vso.graph权限声明,未声明对应权限的令牌哪怕本身格式有效、认证通过,也会被Graph接口拒绝返回401。
修复步骤
- 第一步:修改扩展的manifest.json配置文件,在
scopes配置节点新增Graph权限声明:
仅做成员存在性校验的场景,申请"scopes": [ "vso.profile", "vso.graph" ]vso.graph权限完全足够,不需要更高等级的权限。 - 第二步:重新打包扩展,上传到市场后更新组织内已安装的扩展版本,完全刷新扩展页面重新获取令牌,此时
SDK.getAccessToken()返回的令牌就会携带Graph接口的访问权限。 - 第三步:修正请求路径的大小写问题,接口路径中
memberships需要全小写,首字母大写在部分Azure DevOps服务节点会直接触发401。
做成员存在性校验的正确请求格式如下,不需要拉取全量成员列表:
接口返回状态码GET https://vssps.dev.azure.com/{organization}/_apis/graph/memberships/{userSubjectDescriptor}/{targetGroupSubjectDescriptor}?api-version=6.0-preview.1200即代表用户在目标组内,返回404即代表不在目标组,完全匹配校验需求。
注意:不要用
SDK.getAppToken()调用这类用户身份相关接口,应用令牌对应扩展服务的身份,和当前登录用户身份无关,用它查询会拿到扩展服务本身的权限,无法匹配当前用户的实际组归属。
内容的提问来源于stack exchange,提问作者Turbo
相关产品推荐
相关产品推荐

