Teams 主动消息和 Graph API 代币
Teams proactive messages and Graph API token
我正在尝试构建一个定期发送主动用户推荐的机器人。它们看起来类似于这个:
我已经根据来自后端的用户数据进行了所有工作,但我还想添加一些来自图表的其他内容 API - 其中之一是个人资料图片。
我已经设置了一个 Azure Bot Channel,获得了 Graph auth sample 运行,但我仍然不知道如何将主动消息与 OAuthPrompt 对话框混合。
如果我让用户在应用注册时登录,我能否可靠地获取图形令牌并在我的主动消息处理程序中使用它?请注意,这些消息将每周发送一次。恐怕令牌要过期了。
有没有人做过类似的事情?
如果您只需要机器人调用 Graph 并检索用户数据,您可以使用应用程序权限来执行此操作而无需用户登录。首先,您需要在 Azure Active Directory 中启用权限>应用注册>API 权限。您在这里需要的特定内容是 User.Read.All
(或者 User.ReadWrite.All
,如果您可能希望它对其他用例具有写访问权限)。如果需要,还可以为群组和联系人提供单独的权限。
对于bot,首先需要获取token。有一篇完整的参考文章 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();
}
我在实际调用 graph 的地方做了很多事情,但我的 http 调用看起来像这样:
var userResponse = await request({
url: usersUrl + queryString,
method: 'GET',
headers: {'Authorization':`Bearer ${token}`, 'ConsistencyLevel':'eventual'}
});
userResponse = JSON.parse(userResponse);
现在在你的例子中你正在调用获取照片端点,我没有这样做,但应该与上面的基本相同。这是 Get photo documentation 的 link。所以现在,您的机器人应该能够在发送主动消息之前进行身份验证并抓取图片,而无需用户提供任何凭据。
我正在尝试构建一个定期发送主动用户推荐的机器人。它们看起来类似于这个:
我已经根据来自后端的用户数据进行了所有工作,但我还想添加一些来自图表的其他内容 API - 其中之一是个人资料图片。
我已经设置了一个 Azure Bot Channel,获得了 Graph auth sample 运行,但我仍然不知道如何将主动消息与 OAuthPrompt 对话框混合。
如果我让用户在应用注册时登录,我能否可靠地获取图形令牌并在我的主动消息处理程序中使用它?请注意,这些消息将每周发送一次。恐怕令牌要过期了。
有没有人做过类似的事情?
如果您只需要机器人调用 Graph 并检索用户数据,您可以使用应用程序权限来执行此操作而无需用户登录。首先,您需要在 Azure Active Directory 中启用权限>应用注册>API 权限。您在这里需要的特定内容是 User.Read.All
(或者 User.ReadWrite.All
,如果您可能希望它对其他用例具有写访问权限)。如果需要,还可以为群组和联系人提供单独的权限。
对于bot,首先需要获取token。有一篇完整的参考文章 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();
}
我在实际调用 graph 的地方做了很多事情,但我的 http 调用看起来像这样:
var userResponse = await request({
url: usersUrl + queryString,
method: 'GET',
headers: {'Authorization':`Bearer ${token}`, 'ConsistencyLevel':'eventual'}
});
userResponse = JSON.parse(userResponse);
现在在你的例子中你正在调用获取照片端点,我没有这样做,但应该与上面的基本相同。这是 Get photo documentation 的 link。所以现在,您的机器人应该能够在发送主动消息之前进行身份验证并抓取图片,而无需用户提供任何凭据。