Azure Graph报错:Access Token缺失或格式错误,获取AD用户信息遇阻
嘿,我来帮你搞定这个「Access Token missing or malformed」的问题!咱们先唠唠根源:你的代码里没指定Azure AD Graph API的资源标识符,导致生成的访问令牌不是给这个API用的,服务器自然不认。另外还要提一句,azure-graphrbac这个库已经被微软弃用了,更推荐用Microsoft Graph SDK,但先给你两种可行的解决办法:
解决Azure Graph RBAC API令牌错误方案
方案1:修复现有旧库代码
要让ServicePrincipalCredentials生成正确的令牌,必须加上resource参数,指定Azure AD Graph API的地址https://graph.windows.net。修改后的代码如下:
from azure.common.credentials import ServicePrincipalCredentials from azure.graphrbac import GraphRbacManagementClient TENANT = 'something.onmicrosoft.com' TENANT_ID = '...' CLIENT_ID = '...' SECRET = '...' credentials = ServicePrincipalCredentials( client_id=CLIENT_ID, secret=SECRET, tenant=TENANT, resource="https://graph.windows.net" # 关键:新增这个资源标识参数 ) client = GraphRbacManagementClient(credentials, TENANT_ID) # 注意:list()转成列表,不然是分页迭代器 users = list(client.users.list()) for user in users: print(user.user_principal_name)
加了这个参数后,凭据生成的令牌就会被Azure AD Graph API认可,就能正常拉取用户信息了。
方案2:迁移到微软推荐的Microsoft Graph SDK
因为azure-graphrbac已经停止维护,现在微软主推Microsoft Graph,功能更全、后续支持也更到位。给你贴个新SDK的实现代码:
先装必要的包:
pip install msgraph-core azure-identity
然后编写业务代码:
from azure.identity import ClientSecretCredential from msgraph.core import GraphClient TENANT_ID = '...' CLIENT_ID = '...' SECRET = '...' # 创建凭据,Microsoft Graph默认范围是https://graph.microsoft.com/.default credential = ClientSecretCredential( tenant_id=TENANT_ID, client_id=CLIENT_ID, client_secret=SECRET ) # 初始化Graph客户端 client = GraphClient(credential=credential) # 调用获取用户列表的接口(v1.0版本端点) response = client.get('/users') users = response.json() for user in users.get('value', []): print(user['userPrincipalName'])
额外检查点
最后别忘了确认这两点:
- 你的服务主体(Service Principal)已经被授予Directory.Read.All(或其他合适的权限),并且完成了管理员同意(如果是应用级权限的话);
- TENANT_ID、CLIENT_ID、SECRET这些参数没有拼写错误,都是正确的有效值。
内容的提问来源于stack exchange,提问作者Jakob Kristensen
相关产品推荐
相关产品推荐

