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

如何通过代用户获取令牌实现Azure AD无交互用户认证

适合无交互场景的Azure AD认证方案

推荐使用的认证流:用户名密码流(ROPc)

这个流无需网页交互,直接通过用户的用户名+密码获取令牌,完全匹配你的无交互需求,但有几点限制需要注意:

  • 仅支持Azure AD工作/学校账户,不兼容个人微软账户
  • 必须禁用目标用户的多因素认证(MFA),否则无法完成认证
  • 属于较传统的认证方式,仅在其他流无法满足需求时使用

步骤1:Azure AD应用配置

  1. 在Azure AD中注册两个应用:
    • 客户端应用:用于发起令牌请求(对应你的Python/Java/Postman客户端)
    • API应用:用于保护你的后端API资源
  2. 配置API应用:
    • 定义一个权限范围(Scope),格式示例:api://<你的API应用ID>/access_as_user
  3. 配置客户端应用:
    • 开启公共客户端流:在「认证」→「高级设置」中勾选「允许公共客户端流」
    • 添加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示例

  1. 新建POST请求,URL填写:https://login.microsoftonline.com/<你的租户ID>/oauth2/v2.0/token
  2. 在「Body」选项卡选择「form-data」,添加以下参数:
    • grant_type: password
    • client_id: 你的客户端应用ID
    • username: 用户邮箱
    • password: 用户密码
    • scope: api://<你的API应用ID>/access_as_user openid
  3. 发送请求,即可在响应中获取access_token

步骤3:验证令牌并保护API

后端API需要对传入的access_token进行验证,确保其有效性和权限:

  • Python后端(如FastAPI):可使用fastapi-azure-auth库自动完成令牌验证
  • Java后端(如Spring Boot):引入spring-boot-starter-oauth2-resource-server依赖,配置Azure AD的JWKS端点实现令牌验证
  • 核心验证逻辑:
    1. 验证令牌签名是否合法(使用Azure AD公钥)
    2. 检查令牌的aud(受众)是否匹配你的API应用ID
    3. 检查令牌的scp(权限范围)是否包含你定义的访问权限

替代方案:客户端凭证流(无用户上下文场景)

如果你的API不需要区分具体用户,仅用于服务间调用,可使用客户端凭证流:

  • 无需用户密码,通过客户端应用的ID+客户端密钥获取令牌
  • 适合后台服务调用API的场景

内容的提问来源于stack exchange,提问作者user14488986

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 20:20:25