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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 20:32:34