Azure Bot Services基于REST API整合MS Graph API OAuth的技术问询
关于Bot Service与Graph API OAuth合并及REST实现的解答
首先明确一点:你无法将Bot Service自身的通信token与用户的Graph API访问token合并成单一OAuth流程,因为这两个token的作用完全不同:
- Bot Service的token是用于Bot与Azure Bot Service/Teams平台之间的身份验证(比如Bot接收Teams消息时需要用这个token证明自己的身份),属于客户端凭证流(client credentials),是Bot自身的身份凭证。
- Graph API的token是代表用户访问其Graph数据的凭证,属于授权码流(authorization code),需要用户授权才能获取。
不过你可以复用同一个Azure AD应用注册来统一管理这两个流程的凭据,不用维护两个独立的应用。下面是具体的实现步骤,以及对你当前操作的确认:
一、确认你当前的方向是正确的
你提到的“Bot向用户请求Graph API认证”是完全正确的路径——要访问用户的Graph数据,必须经过用户授权,这和Bot自身的平台通信token是完全独立的流程。接下来只需要通过REST API完成这个授权流程的具体落地即可。
二、具体实现步骤(基于REST API)
1. 统一配置Azure AD应用注册
首先需要确保你的Azure AD应用同时支持Bot和Graph API的权限:
- 如果你已有Bot的应用注册,直接复用它;如果没有,新建一个应用注册。
- 在应用的“API权限”中添加Graph API的委托权限(比如
User.Read、Mail.Read等,根据你的业务需求选择),如果是企业租户,记得完成管理员同意。 - 设置重定向URI:添加
https://token.botframework.com/.auth/web/redirect(这是Bot Service OAuth的默认回调地址)。 - 生成并保存应用的客户端ID和客户端密码/证书(后续会多次用到)。
2. 在Azure Bot Service中创建OAuth连接设置
这个连接是Bot发起用户授权的核心桥梁:
- 进入你的Azure Bot资源,左侧菜单选择“OAuth连接设置”。
- 点击“新建连接”,服务提供商选择Azure Active Directory v2。
- 填写以下关键信息:
- 连接名称:自定义一个易记的名称(比如
GraphOAuthConnection,后续调用REST时要用到)。 - 客户端ID:你的Azure AD应用ID。
- 客户端密码:你的应用客户端密码。
- 租户ID:多租户应用填
common,单租户填你的租户ID。 - 权限范围:填写你需要的Graph API权限(比如
User.Read Mail.Read,多个权限用空格分隔)。
- 连接名称:自定义一个易记的名称(比如
- 保存连接后,建议测试一下连接是否能正常工作。
3. 通过REST API向用户发送OAuth授权卡片
当Bot需要获取用户的Graph权限时,发送包含OAuth卡片的消息到Teams会话:
- 调用Teams Bot的REST API,POST请求地址为:
https://smba.trafficmanager.net/[region]/v3/conversations/{conversationId}/activities/{activityId}(替换region、conversationId、activityId为实际值)。 - 请求体示例:
{ "type": "message", "text": "为了获取相关数据,请授权访问你的Microsoft Graph账户", "attachments": [ { "contentType": "application/vnd.microsoft.card.oauth", "content": { "connectionName": "GraphOAuthConnection", // 替换为你创建的连接名称 "text": "点击下方按钮授权" } } ] }
4. 处理用户授权后的回调
用户点击卡片完成授权后,Bot会收到一个invoke类型的活动(名称为signin/verifyState):
- 从这个活动的
value字段中提取code参数(这是授权码)。 - 用授权码兑换Graph API的access token,发送POST请求到
https://login.microsoftonline.com/common/oauth2/v2.0/token,请求体采用x-www-form-urlencoded格式:grant_type=authorization_code &code={用户授权返回的code} &redirect_uri=https://token.botframework.com/.auth/web/redirect &client_id={你的应用客户端ID} &client_secret={你的应用客户端密码} - 成功响应会包含
access_token,你就可以用它调用Graph API了(比如请求https://graph.microsoft.com/v1.0/me,请求头添加Authorization: Bearer {access_token})。
5. 关于Bot Service自身的token
这个token仍然需要单独获取,用于Bot与平台的通信:
- 发送POST请求到
https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token,请求体:grant_type=client_credentials &client_id={你的应用客户端ID} &client_secret={你的应用客户端密码} &scope=https://api.botframework.com/.default - 这个token只能用于Bot的平台通信,不能用来访问Graph API,所以两者是独立的,但可以复用同一个应用的凭据来获取。
内容的提问来源于stack exchange,提问作者Swati Sneha
相关产品推荐
相关产品推荐

