尝试通过 API 创建对话时机器人授权被拒绝
Authorization denied for bot when attempting to create conversation via API
我正在尝试开发一个专门用于主动消息传递的机器人(因为不幸的是,连接器似乎不支持直接消息传递)。我建立了一个网络服务,当我向机器人发送消息时能够从 Teams 接收有效负载。
我现在正在尝试将机器人的主动消息发送回我的用户,如 here 所述。根据说明,我将以下有效负载发布到 <serviceUrl>/v3/conversations
。 (括号中的值是从我从 Teams 收到的有效负载中插入的)
{
"bot": {
"id": <recipient.id>,
"name": <recipient.name>
},
"isGroup": false,
"members": [
{
"id": <from.id>,
"name": <from.name>
}
],
"tenantId": <channelData.tenant.id>,
"topicName": "News Alert"
}
我还包含了一个通过调用 https://login.microsoftonline.com/<channelData.tenant.id>/oauth2/v2.0/token
获得的 Bearer 令牌。然而,每当我尝试创建对话时,它都会失败,并显示“此请求的授权已被拒绝”的错误。据我所知,令牌应该是有效的,所以我不确定这里还会发生什么。我看到了一些关于信任服务 URL 的信息,但我不确定该怎么做,因为我没有使用 Bot SDK。也许我做错了,应该尝试创建一个 Activity 而不是对话?
发送主动消息基本上有两个步骤。第一步只是一次性的——获取机器人与用户之间对话的唯一 ID。这是您在原始问题中链接到的段落,也是您显示的有效负载示例。获得该对话 ID 后,您就可以在以后的任何时间继续发送消息(即 this paragraph)。
但是,在 Teams 中,第一部分的处理方式不同。您无需调用机器人框架对话端点(请记住,机器人框架用于 Teams 机器人之外的其他用途),而是等待用户安装应用程序,其中包括您的机器人。完成后,您的机器人将收到一个 conversationUpdate 事件。触发时,您将收到一个有效负载,其中包含新创建对话的 conversationId。这将取代您当前正在拨打的电话。
您需要保存 conversationId 和 serviceUrl(这也很相似 'https://smba.trafficmanager.net/apis',但对于 Teams 来说是唯一的,并且将是您 URL 的 'base'稍后再打电话)。
重要的是,可以使用 Graph API 为用户“预安装”应用程序。参见 Install app for user。
这应该可以帮助您解决遗漏的问题。但是,作为 'fyi',您可以为此使用库,而不是自己直接调用。例如,在 dotnet 中,您可以引用 Microsoft.Bot.Connector.ConnectorClient
(在 Microsoft.Bot.Connector
中),它有一个 Conversations.SendToConversationAsync(..)
方法。
我想我已经找到问题所在了。我向 https://login.microsoftonline.com/<channelData.tenant.id>/oauth2/v2.0/token
发送了我的令牌请求,它成功并给了我一个令牌。但是,概述 here 的说明说不要使用 <channelData.tenant.id>
,而是只使用硬编码字符串 botframework.com
。以这种方式请求令牌后,我的请求似乎有效。
我正在尝试开发一个专门用于主动消息传递的机器人(因为不幸的是,连接器似乎不支持直接消息传递)。我建立了一个网络服务,当我向机器人发送消息时能够从 Teams 接收有效负载。
我现在正在尝试将机器人的主动消息发送回我的用户,如 here 所述。根据说明,我将以下有效负载发布到 <serviceUrl>/v3/conversations
。 (括号中的值是从我从 Teams 收到的有效负载中插入的)
{
"bot": {
"id": <recipient.id>,
"name": <recipient.name>
},
"isGroup": false,
"members": [
{
"id": <from.id>,
"name": <from.name>
}
],
"tenantId": <channelData.tenant.id>,
"topicName": "News Alert"
}
我还包含了一个通过调用 https://login.microsoftonline.com/<channelData.tenant.id>/oauth2/v2.0/token
获得的 Bearer 令牌。然而,每当我尝试创建对话时,它都会失败,并显示“此请求的授权已被拒绝”的错误。据我所知,令牌应该是有效的,所以我不确定这里还会发生什么。我看到了一些关于信任服务 URL 的信息,但我不确定该怎么做,因为我没有使用 Bot SDK。也许我做错了,应该尝试创建一个 Activity 而不是对话?
发送主动消息基本上有两个步骤。第一步只是一次性的——获取机器人与用户之间对话的唯一 ID。这是您在原始问题中链接到的段落,也是您显示的有效负载示例。获得该对话 ID 后,您就可以在以后的任何时间继续发送消息(即 this paragraph)。
但是,在 Teams 中,第一部分的处理方式不同。您无需调用机器人框架对话端点(请记住,机器人框架用于 Teams 机器人之外的其他用途),而是等待用户安装应用程序,其中包括您的机器人。完成后,您的机器人将收到一个 conversationUpdate 事件。触发时,您将收到一个有效负载,其中包含新创建对话的 conversationId。这将取代您当前正在拨打的电话。
您需要保存 conversationId 和 serviceUrl(这也很相似 'https://smba.trafficmanager.net/apis',但对于 Teams 来说是唯一的,并且将是您 URL 的 'base'稍后再打电话)。
重要的是,可以使用 Graph API 为用户“预安装”应用程序。参见 Install app for user。
这应该可以帮助您解决遗漏的问题。但是,作为 'fyi',您可以为此使用库,而不是自己直接调用。例如,在 dotnet 中,您可以引用 Microsoft.Bot.Connector.ConnectorClient
(在 Microsoft.Bot.Connector
中),它有一个 Conversations.SendToConversationAsync(..)
方法。
我想我已经找到问题所在了。我向 https://login.microsoftonline.com/<channelData.tenant.id>/oauth2/v2.0/token
发送了我的令牌请求,它成功并给了我一个令牌。但是,概述 here 的说明说不要使用 <channelData.tenant.id>
,而是只使用硬编码字符串 botframework.com
。以这种方式请求令牌后,我的请求似乎有效。