通过 Graph Api 向 Teams 发送聊天/频道消息

Sending chat / channel message to Teams via Graph Api

我有一个 SPA,我正在尝试代表 Teams 中的用户通过 - POST https://graph.microsoft.com/v1.0/teams/{teamid}/channel/{channelid}/messages

通过同。

但我不断收到此错误 -

{

"error": {
    "code": "Unauthorized",
    "message": "Unauthorized",
    "innerError": {
        "date": "2020-12-03T06:09:02",
        "request-id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx",
        "client-request-id": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx"
    }
}

}

SPA 是使用 Azure AD 应用程序注册构建的,并且已向该应用程序授予以下 API 权限: ChannelMessage.Send(代表),Chat.ReadWrite(代表),ChatMessage.Send(代表)。

以上 API 在从 Microsoft Graph 资源管理器门户调用时有效。

我还比较了来自 Graph Explorer 和 My Azure AD 应用程序的 jwt.io 上的访问令牌,两者都有范围 - [ ChannelMessage.Send ] 向频道发送消息所必需的

如果我遗漏了什么或做错了什么,需要这方面的帮助。

我不是这方面的专家,但我认为您不能直接从不受信任的客户端(即 SPA)直接连接到 Graph,并且您首先需要获得“代表的”令牌(这意味着您需要拥有自己的后端 API 才能建立安全连接并检索此令牌)。您可以在此处查看此示例(dotnet 和节点):https://github.com/HiltonGiesenow/teams-dev-samples/tree/add-tabs-sso-sample

使用 Send Channel Message Graph API 向频道发布消息需要 ChannelMessage.Send Group.ReadWrite.All 权限

这是向频道发送消息的代码片段,你需要实现 authProvider 才能传递它 graphClient,我为我的租户测试了它,我能够成功地在频道中发送消息. 下面是代码片段

GraphServiceClient graphClient = new GraphServiceClient( authProvider );

var chatMessage = new ChatMessage
{
    Body = new ItemBody
    {
        Content = "Hello World"
    }
};

await graphClient.Teams["{TeamId}"].Channels["{ChannelId}"].Messages
    .Request()
    .AddAsync(chatMessage);