通过 Graph API 和自定义请求发送主动消息,我收到 401 未授权

Sending a proactive message via Graph API and custom Request I get a 401 unauthorized

我想用团队机器人发送主动消息。为此我:

现在我想向这个Url发送请求:

https://smba.trafficmanager.net/de/v3/conversations/{teamId}/activities/

向频道发送消息。 为此,我必须使用此令牌获得一个承载令牌 Url:

https://login.microsoftonline.com/botframework.com/oauth2/v2.0/token

我拿回来没有任何问题。

现在我想使用 GraphAPI 来执行自定义请求

首先,我必须像这样创建一个 GraphServiceClient:

OAuth2AuthenticationProvider authProvider = new OAuth2AuthenticationProvider(_getBotToken(botClientId, botClientSecret, BOT_SCOPE));
    graphBotClient = GraphServiceClient.builder().authenticationProvider(authProvider).buildClient();

创建客户端后,我执行请求。

graphBotClient.customRequest("https://smba.trafficmanager.net/de/v3/conversations/" + pTeamId + "/activities").buildRequest().post(messageAsJson);

我需要使用自定义查询,因为 Java 中没有它的方法。 messageAsJson 是一个看起来像 activity 对象的 Json 对象,需要它来写入消息。

{
    "type": "message",
    "from": {
        "id": "{clientBotIdFromAzure}",
        "name": "Botname"
    },
    "conversation": {
        "id": "{teamId}",
        "name": "ChannelName"
   },
    "text": "My bot's reply"
}

当我执行此命令时,出现以下异常:

401 : Unauthorized
Strict transport security : max-age=31536000
Cache control : private
x-ms-ags-diagnostic : {"ServerInfo":{"DataCenter": "West Europe", "Slice": "SliceC", "Ring": "5", "ScaleUnit": "002", "RoleInstance": "AGSFE_IN_102"}}
client-request-id : 9a7197en-dd0f-4c90-8b2b-8dc5bb1200ee
WWW-Authenticate : Bearer realm="", authorization_uri="https://login.microsoftonline.com/common/oauth2/authorize", client_id="00000003-0000-0000-c000-000000000000"
request-id : b07b1399-7175-40d3-9891-266abe1144b9
Content-Length : 262
Date : Wed, 22 Apr 2020 08:24:28 GMT
Content-Type : application/json
{
  "error." {
    "code." "InvalidAuthenticationToken"
    "message": "Access token validation failure. Invalid audience."
    "innerError": {
      "request-id": "b07b1399-7175-40d3-9891-266abe1144b9"
      "date": "2020-04-22T08:24:29"
    }
  }
}

Exception in thread "main" com.microsoft.graph.http.GraphServiceException: Error code: InvalidAuthenticationToken
Error message: Access token validation failure. Invalid audience.

如果我在 Postman 中执行相同的请求,使用相同的令牌 url 和正文,请求工作正常并且我的消息出现在 MSTeams 中 Message sent out of Postman appears in MSTeams

为什么它不适用于 GraphAPI?我的错误在哪里?我错过了什么?

很多问候

我认为问题可能是针对机器人框架本身的身份验证与针对 Microsoft Graph 的身份验证的混合 - 我认为它们不是完整的 1-1。

也就是说,直接使用 bot 框架要容易得多 - 它也有一个主动消息机制。您可以创建一个 ConversationContext 实例并与之交互。为此,您需要事先获取并存储某些信息,尤其是对话 ID、服务 URL 等。有多种方法可以获取此信息,但最简单的方法是在用户向您的机器人发送消息时保存此信息(每条消息都会包含这些信息),然后将其保存在 database/blob/whatever.

我在这里得到了更多详细信息:

这里还有一个节点示例:

当然,不要忘记查看相关文档以获取更多信息:https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-proactive-message?view=azure-bot-service-4.0&tabs=javascript