如何通过代用户获取令牌实现Azure AD无交互用户认证
适合无交互场景的Azure AD认证方案
推荐使用的认证流:用户名密码流(ROPc)
这个流无需网页交互,直接通过用户的用户名+密码获取令牌,完全匹配你的无交互需求,但有几点限制需要注意:
- 仅支持Azure AD工作/学校账户,不兼容个人微软账户
- 必须禁用目标用户的多因素认证(MFA),否则无法完成认证
- 属于较传统的认证方式,仅在其他流无法满足需求时使用
步骤1:Azure AD应用配置
- 在Azure AD中注册两个应用:
- 客户端应用:用于发起令牌请求(对应你的Python/Java/Postman客户端)
- API应用:用于保护你的后端API资源
- 配置API应用:
- 定义一个权限范围(Scope),格式示例:
api://<你的API应用ID>/access_as_user
- 定义一个权限范围(Scope),格式示例:
- 配置客户端应用:
- 开启公共客户端流:在「认证」→「高级设置」中勾选「允许公共客户端流」
- 添加API权限:在「API权限」中添加刚才定义的范围,完成后点击「授予管理员同意」
步骤2:获取令牌(示例代码)
Python示例(基于msal库)
import msal # 替换为你的实际配置 CLIENT_ID = "你的客户端应用ID" TENANT_ID = "你的Azure AD租户ID" USERNAME = "用户邮箱" PASSWORD = "用户密码" SCOPE = ["api://<你的API应用ID>/access_as_user"] # 初始化客户端 app = msal.PublicClientApplication(CLIENT_ID, authority=f"https://login.microsoftonline.com/{TENANT_ID}") # 获取令牌 result = app.acquire_token_by_username_password(USERNAME, PASSWORD, scopes=SCOPE) if "access_token" in result: print("获取到的访问令牌:", result["access_token"]) else: print("令牌获取失败:", result.get("error_description"))
Java示例(基于MSAL4J)
import com.microsoft.aad.msal4j.*; import java.util.Collections; import java.util.concurrent.CompletableFuture; public class ROPCAuthExample { public static void main(String[] args) throws Exception { // 替换为你的实际配置 String clientId = "你的客户端应用ID"; String tenantId = "你的Azure AD租户ID"; String username = "用户邮箱"; String password = "用户密码"; String scope = "api://<你的API应用ID>/access_as_user"; PublicClientApplication pca = PublicClientApplication.builder(clientId) .authority("https://login.microsoftonline.com/" + tenantId) .build(); CompletableFuture<IAuthenticationResult> future = pca.acquireToken( UsernamePasswordParameters .builder(Collections.singleton(scope), username, password.toCharArray()) .build()); IAuthenticationResult result = future.get(); System.out.println("获取到的访问令牌: " + result.accessToken()); } }
Postman示例
- 新建POST请求,URL填写:
https://login.microsoftonline.com/<你的租户ID>/oauth2/v2.0/token - 在「Body」选项卡选择「form-data」,添加以下参数:
grant_type:passwordclient_id: 你的客户端应用IDusername: 用户邮箱password: 用户密码scope:api://<你的API应用ID>/access_as_user openid
- 发送请求,即可在响应中获取
access_token
步骤3:验证令牌并保护API
后端API需要对传入的access_token进行验证,确保其有效性和权限:
- Python后端(如FastAPI):可使用
fastapi-azure-auth库自动完成令牌验证 - Java后端(如Spring Boot):引入
spring-boot-starter-oauth2-resource-server依赖,配置Azure AD的JWKS端点实现令牌验证 - 核心验证逻辑:
- 验证令牌签名是否合法(使用Azure AD公钥)
- 检查令牌的
aud(受众)是否匹配你的API应用ID - 检查令牌的
scp(权限范围)是否包含你定义的访问权限
替代方案:客户端凭证流(无用户上下文场景)
如果你的API不需要区分具体用户,仅用于服务间调用,可使用客户端凭证流:
- 无需用户密码,通过客户端应用的ID+客户端密钥获取令牌
- 适合后台服务调用API的场景
内容的提问来源于stack exchange,提问作者user14488986
相关产品推荐
相关产品推荐

