使用 OAuthPrompt 获取 Microsoft Graph API 的刷新令牌

Get refresh tokens of Microsoft Graph API with OAuthPrompt

我正在创建一个 MS Teams 机器人,它通过用户通过 OAuthPrompt 登录后生成的后台线程定期检查用户的 Outlook 日历。

要实现该功能,我似乎必须配置一个 OAuth 连接设置和一个支持 offline_access 的应用程序注册。然后,根据Get access on behalf of a user.

,在获取access token的时候获取refresh token

但只要我尝试 the example botOAuthPrompt 的结果就不会包含刷新令牌。而且我找不到记录的方法来获取它。

我怎样才能达到目标?我需要对 OAuthPrompt 或一些相关的 类 进行一些破解吗?我必须从头开始制作卡片吗?

您使用的示例适用于大多数频道,但 Teams 的行为有所不同。 Invoke Activity 被发送到 bot,而不是其他渠道 使用的事件 Activity。如果正在使用 OAuthPrompt,则必须将此调用 Activity 转发到对话框。

  • 参考this documentation for adding authentication to your MS Teams bot, which makes use of Teams-auth样本。
  • 为了更好地了解 OAuth 在 MS Teams 中的工作原理,您可以参考 this 说明身份验证流程的文档。

希望对您有所帮助!!

我得出结论,我们不能通过调查得到 refresh_tokenOAuthPrompt。所以我想出了一个不同的方法来实现这个目标。 关键思想是为“使用 Microsoft 帐户登录”功能创建一个微型 Web 应用程序,它可以像普通 Web 应用程序一样轻松获得 refresh_token

这是示例应用程序:https://github.com/igrep/example-teams-bot-with-ms-account-refresh-token

alwaysPrompt 标志应为 false。然后 OAuth 提示将在不提示登录卡的情况下静默获取刷新令牌。 关于这个问题请参考github上的回答。

Bot composer OAuth refresh token

在写 时,另一个想法闪过我的脑海:运行 一个对话框,其中包含 TurnContext 中的 OAuthPrompt,其中 ConversationRefrence被保存并传递给后台线程,可能会工作。 (但我没有时间也没有动力去尝试!)

就我而言,我需要 refresh_token 来获取其他 Microsoft 资源(如 Exchange)的访问令牌, 解决方案是使用

      const tokenResponses = await context.adapter.getAadTokens(context, this.connectionName, [
     "https://outlook.office365.com",
     "https://graph.microsoft.com",
  ]);