通过 Graph API 和自定义请求发送主动消息,我收到 401 未授权
Sending a proactive message via Graph API and custom Request I get a 401 unauthorized
我想用团队机器人发送主动消息。为此我:
- 在机器人框架中创建了一个机器人
- 在团队中使用 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 中没有它的方法。
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
我想用团队机器人发送主动消息。为此我:
- 在机器人框架中创建了一个机器人
- 在团队中使用 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 中没有它的方法。 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