oauth2.0 Microsoft Graph API -是否可以使用客户端凭据流发送聊天消息?

bqujaahr  于 2023-05-21  发布在  其他
关注(0)|答案(1)|浏览(157)

我一直在尝试在应用程序模式下向单个用户发送聊天消息,我的意思是,不需要每个用户进行身份验证并授予对应用程序的访问权限。我们的想法是让它对他们透明。
所以我发送这个请求来获取访问令牌:

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')"
    }
  ]
}

要创建聊天它工作正常,但发送消息,我得到了一个错误。
我拥有所有应用程序权限。

j8yoct9x

j8yoct9x1#

根据此MS文档,使用应用程序权限发送聊天消息不支持。由于客户端凭证流仅支持应用程序权限,因此无法使用该流发送聊天消息。
但通过Microsoft Graph API创建聊天时,支持应用权限。检查此MS文档。
我注册了一个Azure AD应用,并授予API权限如下:

现在,我通过Postman使用客户端凭据流程生成访问令牌,如下所示:

POST https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/token

grant_type:client_credentials
client_id: <appID>
client_secret:<secret>
scope: https://graph.microsoft.com/.default

答复:

当我使用上面的token创建这个查询的聊天时,我成功地得到了response,如下所示:

POST https://graph.microsoft.com/v1.0/chats
Content-Type: application/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')"
    }
  ]
}

答复:

但是,当我尝试在这个聊天中使用相同的令牌发送消息时,我得到了相同的错误

POST https://graph.microsoft.com/beta/chats/{chat-id}/messages
{
  "body": {
    "content": "Hello World"
  }
}

答复:

要解决此错误,您需要向应用授予Delegated权限,并使用授权码流或用户名密码流等Delegated流生成访问令牌。
我在申请中添加了**ChatMessage.Send**委托权限,如下所示:

在我的例子中,我使用用户名密码流生成了访问令牌,其中不需要用户交互,如下所示:

POST https://login.microsoftonline.com/<tenantID>/oauth2/v2.0/token

grant_type:password
client_id: <appID>
client_secret:<secret>
scope: https://graph.microsoft.com/.default
username: username@xxxxxxxx.onmicrosoft.com
password: xxxxxxxxxx

答复:

当我在下面的查询中使用该token在聊天中发送消息时,我成功地得到了响应,如下所示:

POST https://graph.microsoft.com/beta/chats/{chat-id}/messages
{
  "body": {
    "content": "Hello World"
  }
}

答复:

相关问题