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

使用Client Credentials Flow调用Microsoft Graph API发送聊天消息遇权限问题

问题分析与解决方案

问题核心

使用**应用权限模式(客户端凭证流)**创建一对一Chat成功,但调用POST /beta/chats/{chat-id}/messages发送实时消息时,返回Unauthorized错误,提示该操作仅支持导入消息场景。

原因说明

Microsoft Graph对应用权限模式下的Chat消息操作有明确限制:

  • 应用权限允许创建Chat(对应Chat.Create权限),但直接发送实时消息到Chat的操作仅支持委托权限(用户授权);
  • 应用权限模式下的ChatMessage.Send权限仅用于导入外部历史消息的场景,而非实时发送消息。

可行解决方案

方案1:切换为委托权限模式

如果需要实时发送消息,改用委托权限流获取令牌:

  • 授权流程使用authorization_code或device_code授权类型;
  • 申请ChatMessage.Send委托权限,让用户授权后再执行消息发送操作。

请求令牌示例:

POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&client_id={app-id}
&client_secret={app-secret}
&code={authorization-code}
&redirect_uri={redirect-uri}
&scope=https://graph.microsoft.com/ChatMessage.Send

方案2:使用Teams Bot发送实时消息

如果必须保持应用级无用户交互的模式,改用Teams Bot实现消息发送:

  • 在Azure中注册Teams Bot,配置ChannelMessage.Send、ChatMessage.Send等应用权限;
  • 通过Bot Framework的API发送消息,Bot支持在应用模式下直接向Chat发送实时消息。

方案3:按导入消息规范操作(仅适用于历史消息导入)

如果确实是要导入历史消息,需符合以下要求:

  • 确保应用已配置ChatMessage.ReadWrite.All应用权限;
  • 在消息请求体中添加导入相关属性,比如指定历史时间的createdDateTime、设置from字段指向原发送用户、标记isImported为true。

示例请求体:

{
  "body": {
    "content": "历史消息内容"
  },
  "createdDateTime": "2023-01-01T10:00:00Z",
  "from": {
    "user": {
      "id": "{user-id}"
    }
  },
  "isImported": true
}

内容的提问来源于stack exchange,提问作者S_A

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 20:05:02