微软账户User的id与ID Token中oid是否为同一标识?
如何判断微软个人账户的Graph API ID与ID Token OID是否属于同一用户
在Azure AD内部用户中,User对象的id和ID Token里的oid是完全一致的,但微软个人账户(Microsoft Account)的情况特殊:调用Graph API的/me接口返回的id是短字符串(如0123456789abcdef),而同一用户ID Token中的oid是UUID格式(如00000000-0000-0000-0123-456789abcdef)。
这两个ID确实属于同一用户,可以通过以下两种方式验证:
1. 字符串格式匹配验证
微软个人账户的Graph API返回的id,本质是ID Token中oid去掉所有连字符(-)后的最后16个字符。
以你提供的示例为例:
- OID去掉连字符后:
00000000000000000123456789abcdef - 截取最后16位:
0123456789abcdef,正好和Graph返回的id完全一致。
你可以通过代码实现这个逻辑:先移除OID中的所有-,再取末尾16位,与Graph的id比对,若相同则为同一用户。
2. 关联字段交叉验证
ID Token中的preferred_username(或email)字段,与Graph API返回的userPrincipalName(或mail,若存在)字段值完全一致,也可以通过这些字段的匹配来辅助确认是同一用户。
示例参考
Graph API /me接口返回结果:
$ curl https://graph.microsoft.com/v1.0/users/me -H 'Authorization: Bearer ...' | jq . { "@odata.context": "https://graph.microsoft.com/v1.0/$metadata#users/$entity", "displayName": "", "surname": "", "givenName": "", "id": "0123456789abcdef", "userPrincipalName": "user@example.com", "businessPhones": [], "jobTitle": null, "mail": null, "mobilePhone": null, "officeLocation": null, "preferredLanguage": null }
ID Token内容:
{ "ver": "2.0", "iss": "https://login.microsoftonline.com/9188040d-6c67-4c5b-b112-36a304b66dad/v2.0", "sub": "...", "aud": "xxxxxxxx-xxx-xxxx-xxxx-xxxxxxxxxxxx", "exp": 1668257519, "iat": 1668170819, "nbf": 1668170819, "preferred_username": "user@example.com", "oid": "00000000-0000-0000-0123-456789abcdef", "email": "user@example.com", "tid": "xxxxxxxx-xxx-xxxx-xxxx-xxxxxxxxxxxx", "nonce": "...", }
内容的提问来源于stack exchange,提问作者okapies
相关产品推荐
相关产品推荐

