调用MS Graph Get User接口带$expand=extensions返回500错误原因咨询
$expand=extensions返回500错误的原因分析 先说说遇到的场景:调用Get User接口只传用户ID时完全正常,代码如下:
const { data: response } = await axios.get(`${ MS_GRAPH_USER_API }/${ id }`, { headers: { Authorization: `Bearer ${ TOKEN }`, "Content-Type": "application/json" } })
但只要加上?$expand=extensions参数,用下面的代码调用就直接返回500内部服务器错误:
const { data: response } = await axios.get(`${ MS_GRAPH_USER_API }/${ id }?$expand=extensions`, { headers: { Authorization: `Bearer ${ TOKEN }`, "Content-Type": "application/json" } })
返回的错误信息如下:
data: '{"@odata.context":"https://graph.microsoft.com/v1.0/$metadata#users(extensions())/$entity"{\r\n' + ' "error": {\r\n' + "code": "InternalServerError",\r\n' + "message": "类型为'microsoft.graph.user'的实体实例值未包含'id'属性的值。计算实体元数据时,必须提供其键和并发令牌属性值。",\r\n + "innerError": {\r\n' + "date": "2020-12-19T09:51:26",\r\n' + "request-id": "93cf5d97-0096-4769-871e-f8fcf7cd17c3",\r\n' + "client-request-id": "93cf5d97-0096-4769-871e-f8fcf7cd17c3"\r\n' + }\r\n' + }\r\n' +}'
已知用户已配置扩展,这个错误的原因是什么?
核心原因
这个500错误的根源很明确:你为用户添加的自定义扩展没有正确包含自身的id属性——这里的id是扩展实体自己的唯一标识,并非用户的ID。
当使用$expand=extensions做关联查询时,Microsoft Graph需要加载对应的扩展实体,而每个扩展必须有自己的id作为键属性来完成元数据计算。如果你的扩展在创建时未生成这个id,或者后续操作中丢失了它,Graph服务在尝试扩展查询时就找不到必要的键值,直接抛出内部服务器错误。
另外还有一种可能:如果你的扩展是通过旧版API或者非标准方式创建的,可能存在元数据不一致的问题,导致Graph无法正确识别扩展的id字段。
验证与修复方向
- 先单独调用
GET /users/{id}/extensions接口,检查返回的扩展列表中每个扩展是否都包含id字段。如果某个扩展缺失id,那就是问题所在。 - 对缺失
id的扩展,建议删除后重新创建——正常创建自定义扩展时,Graph会自动生成格式为extension_<appId>_<propertyName>的id,不要手动修改这个值。 - 如果是通过应用注册创建的扩展,检查扩展的定义是否正确,确保
id这个键属性被正确配置。
内容的提问来源于stack exchange,提问作者JTInfinite

