Go语言CLI工具通过MSAL对接Azure AD认证调用MS Graph查询应用
适用的认证流
首先排除资源所有者密码凭据(ROPC)流,该流原生不支持MFA校验,只要用户开启MFA就会直接返回认证失败,完全不符合你的需求。
适合你场景的是设备代码流,该流专门为无浏览器、无法完成网页交互的客户端(比如CLI工具)设计,全程不需要CLI所在环境启动浏览器,兼容MFA校验逻辑,认证流程如下:
- CLI向Azure AD发起设备代码认证请求,获取用户代码、验证地址、过期时间等信息
- CLI将上述信息展示给用户,提示用户使用任意可联网设备(手机、其他电脑)打开验证地址,输入用户代码后登录自己的账号(输入用户名、密码),完成手机端MFA审批
- CLI后台自动轮询Azure AD的认证结果,用户完成全流程校验后即可拿到访问令牌
如果你要求用户必须在CLI交互界面内直接输入账号密码,目前没有支持MFA的官方认证方案,设备代码流是唯一符合微软安全规范、满足无浏览器+支持MFA要求的方案。
实现前的准备工作
- 首先在Azure AD中注册一个公开客户端类型的应用,不需要配置重定向URI
- 为该应用配置MS Graph的委托权限,按需选择
User.Read、Application.Read.All、Directory.Read.All即可,不需要管理员预授权的话用户首次使用时可自行同意权限。
推荐实现方式
直接使用微软官方的MSAL(微软身份验证库)完成认证逻辑,不要自行手写OAuth请求,MSAL已经封装好了设备代码流的全流程,同时自动处理令牌缓存、刷新、过期重试等逻辑,支持所有主流开发语言。
核心示例代码(Python为例,其他语言逻辑一致)
首先安装依赖:pip install msal requests
示例代码:
import msal import requests # 替换为你自己的配置 AZURE_AD_TENANT_ID = "你的Azure AD租户ID" REGISTED_CLIENT_ID = "你注册的公开客户端应用ID" TARGET_USER_UPN = "要查询的用户主体名称,比如user@contoso.com" GRAPH_SCOPE = ["https://graph.microsoft.com/.default"] # 初始化公开客户端实例 msal_app = msal.PublicClientApplication( REGISTED_CLIENT_ID, authority=f"https://login.microsoftonline.com/{AZURE_AD_TENANT_ID}" ) # 发起设备代码流请求 device_flow = msal_app.initiate_device_flow(scopes=GRAPH_SCOPE) if "user_code" not in device_flow: raise Exception(f"获取设备码失败:{device_flow.get('error_description')}") # 打印认证提示给用户 print(device_flow["message"]) # 轮询获取认证结果 auth_result = msal_app.acquire_token_by_device_flow(device_flow) if "access_token" in auth_result: # 调用MS Graph获取目标用户的应用分配列表 graph_headers = { "Authorization": f"Bearer {auth_result['access_token']}", "Content-Type": "application/json" } # 拉取应用角色分配列表,如需拉取委托权限授权可替换为 /oauth2PermissionGrants 接口 response = requests.get( f"https://graph.microsoft.com/v1.0/users/{TARGET_USER_UPN}/appRoleAssignments", headers=graph_headers ) print("用户分配的应用列表:") print(response.json()) else: print(f"认证失败:{auth_result.get('error')},错误描述:{auth_result.get('error_description')}")
注意事项
- 设备代码流的默认有效时长为15分钟,用户需要在有效期内完成认证,过期后需要重新发起请求
- 可根据实际需求调整MS Graph的调用接口,
appRoleAssignments对应应用角色分配的应用,oauth2PermissionGrants对应用户同意了委托权限的应用 - 不要使用ROPC流兼容MFA场景,微软已经明确不支持该组合,且ROPC流存在极高的安全风险,不符合身份安全最佳实践
内容的提问来源于stack exchange,提问作者bobocu
相关产品推荐
相关产品推荐

