无需服务主体访问Azure REST API:生成个人身份Bearer Token
用个人身份生成Bearer Token(Postman预请求脚本实现)
一、手动复制Token报401的排查点
你从微软Try It页面复制Token到Postman后触发InvalidAuthenticationToken错误,大概率是这几个原因:
- Token已过期:用户身份的Azure Token有效期默认1小时,复制后超过时效直接失效
- 受众不匹配:每个Azure服务API的受众(
aud字段)不同,比如Data Factory API的受众是https://management.azure.com/,如果Try It生成的Token是针对其他API的,必然无法通过验证 - 格式错误:Postman的Bearer Token输入框只需要填Token本身,不能带
Bearer前缀——你更新里提到的错误就是因为没移除这个前缀
二、Postman预请求脚本自动生成个人身份Token
要实现和微软Try It一致的个人身份登录生成Token,本质是调用Microsoft Identity Platform的授权码流程(带PKCE),下面是两种实现方式:
方法1:Postman内置OAuth 2.0授权(推荐,最省心)
- 打开目标请求的Authorization标签页,授权类型选OAuth 2.0
- 点击Get New Access Token,按以下参数配置:
- Token名称:自定义(比如「Data Factory 用户令牌」)
- Grant Type:
Authorization Code - Callback URL:填
https://oauth.pstmn.io/v1/callback(Postman默认回调地址) - Auth URL:
https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/authorize(个人账号用common替换租户ID) - Access Token URL:
https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token - Client ID:可以用微软官方公共客户端ID
04b07795-8ddb-461a-bbee-02f9e1bf7b46,或者自己在Azure AD注册公共客户端应用 - Scope:
https://management.azure.com/user_impersonation offline_access(根据目标API调整,Data Factory需此权限) - Client Secret:留空(公共客户端无需密钥)
- 勾选Authorize using browser
- 点击Request Token,在弹出的浏览器中用个人Azure账号登录授权,Postman会自动获取并保存Token
- 要实现预请求自动刷新,需确保Scope包含
offline_access(获取Refresh Token),然后在预请求脚本中判断Token过期时间,调用刷新端点更新Token
方法2:纯预请求脚本实现(适合自动化场景)
如果不想依赖Postman内置授权,可通过脚本调用授权流程(注意:公共客户端必须使用PKCE验证):
// 预请求脚本:自动生成个人身份Bearer Token const currentTime = Math.floor(Date.now() / 1000); const tokenExpiry = pm.environment.get("token_expiry"); // 检查Token是否过期或未存在 if (!pm.environment.get("access_token") || tokenExpiry <= currentTime) { // 生成PKCE Code Verifier function generateCodeVerifier() { const array = new Uint32Array(28); window.crypto.getRandomValues(array); return Array.from(array, dec => ('0' + dec.toString(16)).slice(-2)).join(''); } // 生成PKCE Code Challenge function generateCodeChallenge(verifier) { return window.crypto.subtle.digest("SHA-256", new TextEncoder().encode(verifier)) .then(digest => btoa(String.fromCharCode(...new Uint8Array(digest))) .replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '')); } const codeVerifier = generateCodeVerifier(); pm.environment.set("code_verifier", codeVerifier); generateCodeChallenge(codeVerifier).then(challenge => { const authUrl = `https://login.microsoftonline.com/common/oauth2/v2.0/authorize?client_id=04b07795-8ddb-461a-bbee-02f9e1bf7b46&response_type=code&redirect_uri=https://oauth.pstmn.io/v1/callback&response_mode=query&scope=https://management.azure.com/user_impersonation offline_access&code_challenge=${challenge}&code_challenge_method=S256`; console.log("请访问以下地址完成登录授权:", authUrl); // 注:手动处理回调需将返回的code存入环境变量,再调用token端点获取Token,因此更推荐方法1 }); } // 将有效Token添加到请求头 pm.request.headers.add({key: "Authorization", value: `Bearer ${pm.environment.get("access_token")}`});
三、Token有效性验证
拿到Token后,可通过JWT解码工具查看关键字段:
aud:必须与目标API的受众一致(比如Data Factory为https://management.azure.com/)exp:确认Token未过期oid:验证是否为当前用户的ID
内容的提问来源于stack exchange,提问作者successhawk
相关产品推荐
相关产品推荐

