【问题标题】:Teams proactive messages and Graph API token团队主动消息和图形 API 令牌
【发布时间】:2021-02-11 18:10:42
【问题描述】:

我正在尝试构建一个定期发送主动用户推荐的机器人。它们看起来和这个相似:

我已经完成了所有来自后端的用户数据的工作,但我还想添加一些来自 Graph API 的额外内容 - 其中之一是个人资料图片。

我已经设置了一个 Azure Bot Channel,让 Graph auth sample 运行,但我仍然不知道如何将主动消息与 OAuthPrompt 对话框混合。

如果我让用户在应用注册时登录,我能否可靠地获取图形令牌并在我的主动消息处理程序中使用它?请注意,这些消息将每周发送一次。恐怕令牌要过期了。

有没有人做过类似的事情?

【问题讨论】:

  • 您使用 Graph 到底是为了什么?您应该能够在不调用 Graph 的情况下发送主动消息。如果你确实需要调用 Graph,你可以授权你的机器人(通过应用注册)为任何用户进行这些调用,这样你就不需要用户特定的令牌。
  • @billoverton 我需要图表来拍摄建议用户的个人资料照片,然后再将其发送到聊天中。您能否链接任何有关在没有用户特定令牌的情况下使用 Graph API 的文档?

标签: javascript botframework microsoft-teams azure-bot-service microsoft-graph-teams


【解决方案1】:

如果您只需要机器人调用 Graph 并检索用户数据,您可以使用应用程序权限来执行此操作,而无需用户登录。首先,您需要在 Azure Active Directory>App 中启用权限注册>API 权限。您在此处需要的特定是User.Read.All(或User.ReadWrite.All,如果您可能希望它具有其他用例的写入权限)。如果您需要,组和联系人也有单独的权限。

对于机器人,您首先需要获取令牌。有一个完整的参考文章here(其中包括如上所述的应用程序权限)。客户端 ID 和密钥是您的应用程序的值。所以在javascript中我做了类似的事情

        var identityUrl = `https://login.microsoftonline.com/${tenantId}/oauth2/v2.0/token`;
        var formData = `client_id=${clientId}&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=${clientSecret}&grant_type=client_credentials`
        try {
            var idResponse = await request({
                url: identityUrl,
                method: 'POST',
                headers: {'Content-Type': 'application/x-www-urlencoded;charset=UTF-8'},
                form: formData
            });
            var token = JSON.parse(idResponse).access_token;
        } catch (err) {
            await step.context.sendActivity(`Sorry, something went wrong. Please try again later.`);
            console.log(err.message);
            return step.endDialog();
        }

我在实际调用图形的地方有很多事情要做,但我的 http 调用看起来像这样:

            var userResponse = await request({
                url: usersUrl + queryString,
                method: 'GET',
                headers: {'Authorization':`Bearer ${token}`, 'ConsistencyLevel':'eventual'}
            });
            userResponse = JSON.parse(userResponse);

现在,在您的情况下,您正在调用 Get Photo 端点,我没有这样做,但应该与上面的基本相同。这是Get photo documentation 的链接。所以现在,您的机器人应该能够在发送主动消息之前进行身份验证并抓取图片,而无需用户提供任何凭据。

【讨论】:

    猜你喜欢
    • 2018-07-31
    • 1970-01-01
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2021-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多