配置Agent身份并获取访问令牌
场景描述
在企业办公自动化场景中,AI Agent需要访问员工的Microsoft数据,以便自动处理邮件分类、文件整理等任务,这涉及到复杂的OAuth 2.0授权流程。
本示例展示如何通过AgentIdentity简化Agent访问Microsoft的开发复杂度,让开发者无需关心OAuth 2.0的底层细节。
总体思路
1. 为Agent创建工作负载身份。
2. 配置Microsoft OAuth2凭证。
3. 获取工作负载访问令牌。
4. 获取Microsoft访问令牌。
涉及的接口如下:
步骤1:创建工作负载身份
URI:POST /v1/workload-identities
API文档详情请参见:创建工作负载身份
- 请求示例:
POST https://{endpoint}/v1/workload-identities { "name": "my_workload_identity", "allowed_resource_oauth2_return_urls": [ "https://example.com/oauth2/callback" ], "authorizer_type": "CUSTOM_JWT", "authorizer_configuration": { "custom_jwt": { "discovery_url": "https://example.com/.well-known/openid-configuration", "allowed_audience": ["example-audience"], "allowed_clients": ["example-client-id"], "allowed_scopes": ["read","write"], "custom_claims": [ { "inbound_token_claim_name": "tenant", "inbound_token_claim_value_type": "STRING", "authorizing_claim_match_value": { "claim_match_operator": "EQUALS", "claim_match_value": {"match_value_string": "acme"} } } ] } } }
- 响应示例:
{ "workload_identity": { "workload_identity_id": "684a2c3e5f1b9d0e7a3c4f56", "name": "my_workload_identity", "urn": "agentIdentity:<region>:<account-id>:workloadIdentity:workloadIdentityDirectory/<workload-directory-id>/<workload-identity-name>", "authorizer_type": "CUSTOM_JWT", "api_key_secret": null, "allowed_resource_oauth2_return_urls": [ "https://example.com/oauth2/callback" ], "created_by": {"type": "SERVICE","identifier": "service.AgentRuntime"}, "created_at": "2025-12-01T08:00:00Z", "updated_at": "2025-12-01T08:00:00Z", "tags": null } }
步骤2:创建Microsoft OAuth2凭证提供商
URI:POST /v1/oauth2-credential-providers
API文档详情请参见:创建OAuth2凭证提供商
- 请求示例:
POST https://{endpoint}/v1/oauth2-credential-providers { "name": "my_microsoft_oauthprovider", "credential_provider_vendor": "MicrosoftOauth2", "oauth2_provider_config_input": { "microsoft_oauth2_provider_config": { "client_id": "285634f5-5958-4f36-b171-168305215bce", "client_secret": "28365081388-oovo6094eg8opo187jn0mstj8s2cevku", "tenant_id": "285634f5-5958-4f36-b171-168305215bce" } } }
- 响应示例:
{ "credential_provider": { "credential_provider_id": "684a2c3e5f1b9d0e7a3c4f56", "name": "my_microsoft_oauthprovider", "urn": "agentIdentity:<region>:<account-id>:oauth2CredentialProvider:tokenVault/<token-vault-id>/<name>", "credential_provider_vendor": "MicrosoftOauth2", "client_secret": { "secret_id": "285624f5-5958-4f36-b171-168303615bce", "secret_name": "test-secret" }, "callback_url": "https://agent-identity.cn-north-4.myhuaweicloud.com/v1/oauth2/callback/9c38be75-5973-4709-a211-7e2c438c250d", "created_at": "2025-12-01T08:00:00Z", "updated_at": "2025-12-01T08:00:00Z", "oauth2_provider_config_output": { "microsoft_oauth2_provider_config": { "oauth2_discovery": { "discovery_url": "https://login.microsoftonline.com/common/v2.0/.well-known/openid-configuration", "authorization_server_metadata": null }, "client_id": "285624f5-5958-4f36-b171-168303615bce" }, "google_oauth2_provider_config": null, "github_oauth2_provider_config": null, "custom_oauth2_provider_config": null }, "tags": null } }
注:需在 Microsoft Entra ID 中完成配置,将回调地址添加为应用的 Redirect URI。
步骤3:获取工作负载访问令牌
URI:POST /v1/workload-access-token-for-user-id
API文档详情请参见:使用用户ID创建工作负载访问令牌(以用户身份操作)
- 请求示例:
POST https://{endpoint}/v1/workload-access-token-for-user-id { "workload_name" : "my_workload_identity", "user_id" : "user-12345" }
- 响应示例:
{ "workload_access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "expiration": "2025-12-31T23:59:59Z" }
在三种获取工作负载访问令牌的方法中,/v1/workload-access-token(不带用户)签出的WAT不能用于USER_FEDERATION流程;USER_FEDERATION必须使用-for-user-id或-for-jwt。
步骤4:获取Microsoft访问令牌
URI:POST /v1/oauth2/token
API文档详情请参见:从资源凭证提供商处获取OAuth 2.0令牌
- 请求示例:
POST https://{endpoint}/v1/oauth2/token { "custom_state": "string", "force_authentication": false, "oauth2_flow": "USER_FEDERATION", "resource_credential_provider_name": "my_microsoft_oauthprovider", "scopes": ["openid", "email", "profile"], "workload_access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9..." }
- 响应示例(首次调用,USER_FEDERATION):
{ "authorization_url": "https://{endpoint}/v1/oauth2/authorize?request_uri=urn%3Aietf%3Aparams%3Aoauth%3Arequest_uri%3A8f14e45f...", "session_status": "IN_PROGRESS", "session_uri": "urn:ietf:params:oauth:request_uri:abc123" }
Agent 收到首次响应后,将 authorization_url 提供给最终用户,用户在浏览器中打开该链接,登录 Microsoft 账号并同意授权。授权完成后,系统自动完成令牌交换。Agent 携带首次返回的 session_uri 和相同的工作负载访问令牌轮询本接口,待 session_status 变为 SUCCEEDED 后,即可获取 access_token。
- 请求示例(授权后调用,USER_FEDERATION):
POST https://{endpoint}/v1/oauth2/token { "custom_state": "string", "force_authentication": false, "oauth2_flow": "USER_FEDERATION", "resource_credential_provider_name": "my_microsoft_oauthprovider", "workload_access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "session_uri": "urn:ietf:params:oauth:request_uri:abc123" }
- 响应示例(用户已完成授权):
{ "session_uri": "urn:ietf:params:oauth:request_uri:abc123", "access_token": "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...", "expires_at": "2025-12-31T23:59:59Z" }
GET https://graph.microsoft.com/v1.0/me/messages Authorization: Bearer <access_token>