【问题标题】:How to refresh id-token using @microsoft/teamsfx如何使用@microsoft/teamsfx 刷新 id-token
【发布时间】:2023-02-02 11:15:51
【问题描述】:

我通过自定义 Teams 工具包中的 SSO React 应用程序示例创建了一个 Teams 选项卡应用程序。该应用程序将用户重定向到我们的网站(在其中一个选项卡内)。我可以在 React (teamsfx.getCredentials().getToken("")) 中获取 id-token,并通过查询参数将其传递给我们的 Web 应用程序。

这个 id-token 经过验证,然后传递到构成我们后端的各种微服务。

这部分运行良好,但随后,我们需要刷新令牌。因此,我们决定让 Web 应用程序(用 Angular 编写)使用 @microsoft/teamsfx 和 @microsoft/teams-js npm 包获取令牌。

虽然我不确定这是否是要走的路,但当我在角度服务中执行以下代码时,它会抛出“SDK初始化超时“ 错误。

    try {
      const teamsFx: TeamsFx = new TeamsFx(IdentityType.User, {         
        "clientId": "ee89fb47-a378-4096-b893-**********",
        "objectId": "df568fe9-3d33-4b22-94fc-**********",
        "oauth2PermissionScopeId": "4ce5bb24-585a-40d3-9891-************",
        "tenantId": "5d65ee67-1073-4979-884c-**************",
        "oauthHost": "https://login.microsoftonline.com",
        "oauthAuthority": "https://login.microsoftonline.com/5d65ee67-1073-4979-884c-****************",
        "applicationIdUris": "api://localhost/ee89fb47-a378-4096-b893-***************",
        "frontendEndpoint": "https://localhost",
        "initiateLoginEndpoint": "https://localhost:8101"
      });

      const creds = await teamsFx.getCredential().getToken('https://graph.microsoft.com/User.Read');
      const token = creds?.token;

      console.log("New Token: ", token);

      const expirationTimestamp = creds?.expiresOnTimestamp;
      this.scheduleRefresh(expirationTimestamp);
      this.tokenRefreshed.next({ token: token, expiresOnTimestamp: expirationTimestamp });
    }
    catch (error) {
      console.error("Error in getNewTeamsToken(): ", error);
    }

我在这里遗漏了什么,或者方法本身是错误的吗?请指教。

【问题讨论】:

    标签: microsoft-teams teams-toolkit microsoft-teams-js


    【解决方案1】:

    Teams 基本上只是在幕后使用MSAL(我认为还有一些其他东西)来获取令牌。如果您希望能够验证您的用户外部对于 Teams,在单独的 Web 应用程序中,您可以自己简单地使用 MSAL(我猜是这样的:https://learn.microsoft.com/en-us/azure/active-directory/develop/tutorial-v2-angular-auth-code)。

    从本质上讲,这意味着您有一个选项卡 Web 应用程序,执行 Teams SSO,然后有一个单独的独立 Angular 应用程序执行直接 MSAL 身份验证。你标签应用程序真的做任何事情吗?如果不是,并且您只是使用它来重定向,您可以将它们组合到一个应用程序中,并在应用程序中检测您是否在 Teams 中 - 如果您在 Teams 中,请使用 TeamsFX 进行 SSO。如果没有,直接做MSAL登录。 This link 展示了如何检测您是否在团队内部。

    如果您想继续使用单独的应用程序,那很好,但我绝对不会将令牌作为 QueryString 参数传递 - 这是非常危险的。首先,令牌根本不应该像这样传递,因为它们可能会被拦截。其次,将它们传递给 Querystring 意味着它们是完全打开 - 中间的任何东西都可以嗅探地址并提取您的令牌(例如,如果它是带有 httpS 的 POST 有效负载,至少“S”会在浏览器和服务器之间加密令牌)。

    【讨论】:

    • 非常感谢你的回复!了解您是否在团队内部的链接真的很有帮助。虽然您关于如何使用 MSAL 进行身份验证的所有断言都是正确的,但我希望网络应用程序做的是,因为我已经从团队获得了令牌,所以在后台从 MS 静默获取刷新的令牌。问题是,当我传递 id_token(并且,我接受作为查询参数传递根本不安全)时,应用程序加载正常,但是当我尝试查明是否已使用 MSAL 完成登录时,它没有认识到这一点!我在某处犯错了吗?
    • 为了回答您的问题,我想将它们作为两个独立的应用程序保留,因为网络应用程序已完全开发。此外,团队应用程序仅执行重定向。
    • 我不确定如何回答更多 - 我没有尝试以这种方式获取刷新令牌,也没有因为我提到的原因尝试传递它。基本上,Teams 为您提供了处理此问题的机制,但您因未实施 MS 的建议而遇到麻烦。我也听说过“正在编写”应用程序,但如果您正在编写代码 - 无论如何 - 以获得“刷新”令牌,为什么不正确地执行它并获得 - 实际 - 令牌?
    • 您使用 MSAL 从 MS 获取实际令牌是正确的,但这意味着一旦重定向到我们的 Web 应用程序,用户就必须使用他的凭据登录一次。我正在努力避免这种情况。这就是我从 React 选项卡应用程序传递令牌的原因。
    • 您需要清楚这里的“登录”是什么意思。如果用户在他们的浏览器中没有 M365 的登录会话,那么是的,他们将需要通过帐户选择器登录。这与 -同意- 屏幕不同。为避免出现同意屏幕,“团队”选项卡中的同意将起作用,或者管理员可以预先同意用户。在任何一种情况下,您都应该能够从您的 Web 应用程序中完全静默地获取令牌。在那种情况下,您会使用 MSAL 正确获得令牌,但它对用户来说是透明的 - 除非 - 出现问题(您需要回退以防万一)。
    猜你喜欢
    • 2019-05-02
    • 2022-11-24
    • 2019-05-09
    • 1970-01-01
    • 2022-12-21
    • 2021-09-29
    • 2021-04-26
    • 2019-11-06
    • 1970-01-01
    相关资源
    最近更新 更多