我一直在尝试在应用程序模式下向单个用户发送聊天消息,我的意思是,不需要每个用户进行身份验证并授予对应用程序的访问权限。我们的想法是让它对他们透明。
所以我发送这个请求来获取访问令牌:
POST https://login.microsoftonline.com/{tenant-id}/oauth2/v2.0/token
grant_type=client_credentials,
client_id={app id registered in azure portal},
client_secret={registered app key},
scope=https://graph.microsoft.com/.default
发送这个请求,我得到了令牌。
使用此令牌,我尝试使用此请求向用户发送消息:
POST https://graph.microsoft.com/beta/chats/{chat-id}/messages
使用JSON中的payload:
{
"body": {
"content": "Hello World"
}
}
问题是我得到了这个错误消息:
{
"error": {
"code": "Unauthorized",
"message": "Message POST is allowed in application-only context only for import purposes. Refer to https://docs.microsoft.com/microsoftteams/platform/graph-api/import-messages/import-external-messages-to-teams for more details.",
"innerError": {
"date": "2023-05-18T17:49:24",
"request-id": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"client-request-id": "xxxxxxxxxxxxxxxxxxxxxxxx"
}
}
}
一个有趣的观点是,我可以创建一个聊天,使用相同的逻辑解释。我用我得到的令牌发送此请求:
https://graph.microsoft.com/v1.0/chats
Json中的有效负载:
{
"chatType": "oneOnOne",
"members": [
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": ["owner"],
"user@odata.bind": "https://graph.microsoft.com/beta/users('user1')"
},
{
"@odata.type": "#microsoft.graph.aadUserConversationMember",
"roles": ["owner"],
"user@odata.bind": "https://graph.microsoft.com/beta/users('user2')"
}
]
}
要创建聊天它工作正常,但发送消息,我得到了一个错误。
我拥有所有应用程序权限。
1条答案
按热度按时间j8yoct9x1#
根据此MS文档,使用应用程序权限发送聊天消息不支持。由于客户端凭证流仅支持应用程序权限,因此无法使用该流发送聊天消息。
但通过Microsoft Graph API创建聊天时,支持应用权限。检查此MS文档。
我注册了一个Azure AD应用,并授予API权限如下:
现在,我通过Postman使用客户端凭据流程生成访问令牌,如下所示:
答复:
当我使用上面的token创建这个查询的聊天时,我成功地得到了response,如下所示:
答复:
但是,当我尝试在这个聊天中使用相同的令牌发送消息时,我得到了相同的错误:
答复:
要解决此错误,您需要向应用授予Delegated权限,并使用授权码流或用户名密码流等Delegated流生成访问令牌。
我在申请中添加了**
ChatMessage.Send
**委托权限,如下所示:在我的例子中,我使用用户名密码流生成了访问令牌,其中不需要用户交互,如下所示:
答复:
当我在下面的查询中使用该token在聊天中发送消息时,我成功地得到了响应,如下所示:
答复: