You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 11:06:06