Отправляя проактивное сообщение через Graph API и пользовательский запрос, я получаю 401 несанкционированный - PullRequest
1 голос
/ 22 апреля 2020

Я хочу отправить проактивное сообщение с командным ботом. Для этого я:

  • создал бота в рамках бота
  • создал приложение с AppStudio в командах
  • назначил бота моему приложению
  • назначил приложение моей команде

Теперь я хотел бы отправить запрос на этот 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 нет методов для него. messageAs Json - это 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.

Если я выполняю тот же запрос в Почтальоне, с тем же токеном, URL и телом, запрос работает нормально, и мое сообщение появляется в MSTeams Сообщение, отправленное из Почтальона, появляется в MSTeams

Почему он не работает с GraphAPI? Где моя ошибка? Чего мне не хватает?

Много поздравлений

1 Ответ

1 голос
/ 22 апреля 2020

Я думаю, что проблема может заключаться в сочетании аутентификации на основе самой платформы ботов и аутентификации на графике Microsoft - я думаю, это не полная 1-1.

Это говорит о том, что гораздо проще напрямую использовать каркас бота - в нем также есть механизм для проактивных сообщений. Вы можете создать экземпляр ConversationContext и взаимодействовать с ним. Для этого вам нужно иметь определенную информацию, в частности, идентификатор разговора, serviceurl и т. Д., Которые вы должны получить и сохранить заранее. Есть несколько способов получить эту информацию, но самый простой - сохранить эту информацию каждый раз, когда пользователь отправляет вашему боту сообщение (каждое сообщение будет содержать эти биты информации), а затем просто сохранить его в базе данных / blob / что угодно.

У меня есть некоторые подробности об этом здесь: Программная отправка сообщения боту в Microsoft Teams

Вот также пример узла: Отправка активна Сообщения от Azure функции к ботсервису - узел

Конечно, не забудьте проверить документы по этому вопросу для получения дополнительной информации: https://docs.microsoft.com/en-us/azure/bot-service/bot-builder-howto-proactive-message?view=azure-bot-service-4.0&tabs=javascript

...