获取Azure AD JWT令牌用于集成测试中的授权验证
哈哈,这个需求太常见了——不用改现有注册,直接拿JWT跑自动化测试对吧?我给你分享几个靠谱的方案,完全适配你的场景:
方案1:使用ROPC授权流(最适合自动化测试)
ROPC(Resource Owner Password Credentials)流允许你直接用测试用户的账号密码获取JWT令牌,全程无交互,完美适配自动化测试流程,而且不需要改动任何已注册的API或客户端配置。
前置准备
- 确保你的测试用户没有启用MFA(ROPC流不支持多因素认证,测试环境可以专门创建无MFA的测试账号)
- 确认你的客户端应用已经在Azure AD中被授予访问目标Web API的权限(如果是需要管理员同意的权限,提前完成管理员授权)
获取令牌的步骤
向Azure AD的令牌端点发送POST请求,参数如下:
POST https://login.microsoftonline.com/{你的租户ID}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded grant_type=password &client_id={你的客户端应用ID} &username={测试用户的UPN,比如test-submitter@yourdomain.com} &password={测试用户密码} &scope={你的Web API的scope,比如api://{API应用ID}/access_as_user}
代码示例(Python)
import requests # 配置参数,建议放在测试配置文件中,不要硬编码 TENANT_ID = "your-tenant-id" CLIENT_ID = "your-client-id" API_SCOPE = "api://your-api-client-id/access_as_user" # 获取提交订单用户的令牌 submitter_username = "test-submitter@yourdomain.com" submitter_password = "test-submitter-password" token_payload = { "grant_type": "password", "client_id": CLIENT_ID, "username": submitter_username, "password": submitter_password, "scope": API_SCOPE } token_response = requests.post( f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token", data=token_payload ) submitter_token = token_response.json()["access_token"] # 调用提交订单接口 submit_order_url = "https://your-web-api.com/api/orders" submit_headers = {"Authorization": f"Bearer {submitter_token}"} order_payload = {"productId": "123", "quantity": 5} submit_response = requests.post(submit_order_url, json=order_payload, headers=submit_headers) order_id = submit_response.json()["id"] # 获取审批用户的令牌 approver_username = "test-approver@yourdomain.com" approver_password = "test-approver-password" approver_payload = token_payload.copy() approver_payload.update({"username": approver_username, "password": approver_password}) approver_token_response = requests.post( f"https://login.microsoftonline.com/{TENANT_ID}/oauth2/v2.0/token", data=approver_payload ) approver_token = approver_token_response.json()["access_token"] # 调用审批接口 approve_order_url = f"https://your-web-api.com/api/orders/{order_id}/approve" approve_headers = {"Authorization": f"Bearer {approver_token}"} approve_response = requests.post(approve_order_url, headers=approve_headers)
注意事项
- 仅在测试环境使用ROPC:生产环境绝对不能用,因为它会暴露用户密码,不符合安全最佳实践
- 如果你的客户端是机密客户端(比如后端服务),可以在请求中添加
client_secret={你的客户端密钥}增强安全性
方案2:使用Azure AD PowerShell模块(适合PowerShell自动化脚本)
如果你习惯用PowerShell写自动化测试脚本,可以用Azure AD模块直接获取用户令牌:
步骤
- 安装Azure AD模块(首次使用):
Install-Module -Name AzureAD -Scope CurrentUser -Force
- 获取令牌并调用API:
# 配置参数 $tenantId = "your-tenant-id" $clientId = "your-client-id" $apiResource = "api://your-api-client-id" # 获取提交订单用户的令牌 $submitterUsername = "test-submitter@yourdomain.com" $submitterPassword = ConvertTo-SecureString "test-submitter-password" -AsPlainText -Force $submitterCred = New-Object System.Management.Automation.PSCredential($submitterUsername, $submitterPassword) $submitterToken = Get-AzureADUserOAuth2AccessToken -Resource $apiResource -Credential $submitterCred -ClientId $clientId -TenantId $tenantId # 提交订单 $submitOrderUrl = "https://your-web-api.com/api/orders" $submitHeaders = @{"Authorization" = "Bearer $($submitterToken.AccessToken)"} $orderPayload = @{"productId" = "123"; "quantity" = 5} | ConvertTo-Json $submitResponse = Invoke-RestMethod -Uri $submitOrderUrl -Method Post -Headers $submitHeaders -Body $orderPayload -ContentType "application/json" $orderId = $submitResponse.id # 获取审批用户的令牌并审批 $approverUsername = "test-approver@yourdomain.com" $approverPassword = ConvertTo-SecureString "test-approver-password" -AsPlainText -Force $approverCred = New-Object System.Management.Automation.PSCredential($approverUsername, $approverPassword) $approverToken = Get-AzureADUserOAuth2AccessToken -Resource $apiResource -Credential $approverCred -ClientId $clientId -TenantId $tenantId $approveOrderUrl = "https://your-web-api.com/api/orders/$orderId/approve" $approveHeaders = @{"Authorization" = "Bearer $($approverToken.AccessToken)"} Invoke-RestMethod -Uri $approveOrderUrl -Method Post -Headers $approveHeaders
总结
这两个方案都不需要修改你已注册的Web API或客户端应用,只需要准备好符合要求的测试账号,就能快速实现“用户提交订单→另一个用户审批”的自动化测试流程。
内容的提问来源于stack exchange,提问作者Bjørn Nørgaard
相关产品推荐
相关产品推荐

