如何通过Graph API以应用身份向Microsoft Teams频道发消息?
解决以Application身份向Teams频道发消息的问题
核心问题分析
你要实现的是**应用身份(而非用户身份)**发送Teams频道消息,首先要明确不同OAuth流程的适用场景:
- 授权码流程(方案1)本质是代用户操作,token绑定用户身份,所以发消息会显示授权用户,这是该流程的预期行为,不符合你的需求。
方案2的错误修复(client_credentials流程)
你遇到的AADSTS1002012错误,源于client_credentials授权类型的scope使用错误,正确配置步骤如下:
- 在Azure AD应用的应用权限中添加Teams相关应用权限(比如
ChannelMessage.Send、Channel.ReadBasic.All),必须选择「应用权限」而非「委派权限」。 - 完成管理员同意(应用权限需要全局管理员或Teams管理员审批,这是必要步骤)。
- 获取token时,scope必须指定为
https://graph.microsoft.com/.default,示例请求:POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token Content-Type: application/x-www-form-urlencoded client_id={client-id}&client_secret={client-secret}&grant_type=client_credentials&scope=https://graph.microsoft.com/.default - 用获取到的token调用Graph API发送消息,此时消息会以应用身份发出。
Incoming Webhooks的程序化创建
Incoming Webhooks确实可以实现应用发消息,且支持程序化创建,步骤如下:
- 确保Azure AD应用拥有
TeamworkWebhook.ReadWrite.All应用权限并完成管理员同意。 - 调用Graph API的创建端点:
POST https://graph.microsoft.com/v1.0/teams/{team-id}/channels/{channel-id}/webhooks Content-Type: application/json Authorization: Bearer {access-token} { "displayName": "自定义Webhook名称", "configuration": { "url": "" // 留空,API会自动生成专属webhook URL } } - 响应结果中会返回生成的webhook URL,后续即可用该URL直接发送消息。
内容的提问来源于stack exchange,提问作者Shai
相关产品推荐
相关产品推荐

