我们什么时候应该删除 SSO 访问令牌?

T.J*_*der 6 office-js

TL;DR - 当用户在另一个选项卡中注销时,我们如何使访问令牌过期?

细节:

SSO 文档中,它说:

何时调用方法

如果在没有用户登录到Office无法使用您的加载就可以了,那么你应该调用getAccessToken 时加载启动,并通过allowSignInPrompt: true在选项参数getAccessToken

这很好,很清楚。但是我们什么时候应该停止使用令牌?是否有一个事件我们可以用来知道用户已退出?(我一直没找到。)

我问是因为即使用户在另一个选项卡中注销,令牌仍会继续工作。因此,如果我们将令牌保留任何时间长度,就会导致用户帐户被错误使用的情况。例如:

  1. 用户登录
  2. 用户打开加载项;加载项获取访问令牌并保留它
  3. 用户打开另一个选项卡
  4. 用户在另一个选项卡中退出他们的帐户
  5. 用户走开
  6. 其他人使用加载项来做他们不应该做的事情

我只是这样做了(好吧,不是第 6 步),并且访问令牌继续在带有加载项的选项卡中工作。是的,用户在退出时可能应该关闭选项卡。是的,他们也不应该让计算机处于解锁状态。但我想在这种情况下使令牌过期。

这是另一个更容易看到的情况:

  1. 用户登录
  2. 用户打开加载项
  3. 用户意识到他们需要切换帐户。由于您无法在 Web Excel 中执行此操作,因此他们在另一个选项卡中执行此操作
  4. 用户尝试使用加载项 - 它使用的是旧帐户,而不是切换到的帐户

我们只是获取令牌的每一个我们需要它的时候,但我们最近才开始运行到速率限制的问题。所以现在我们简单地缓存它,但弄清楚它有多简单是棘手的,特别是在上面的场景 #2 的情况下。我们想要避免速率限制,但不要让窗口打开太久。知道用户何时退出(没有达到速率限制)可以让我们这样做。

T.J*_*der 0

由于在我发布问题时我们遇到了感知到的速率限制,我们决定将其缓存一分钟,并确保getAccessToken我们的代码中永远不会有重叠的调用。这几年来效果很好。但有一天我注意到文档(现在)

不缓存访问令牌

切勿在客户端代码中缓存或存储访问令牌。getAccessToken当您需要访问令牌时,请务必致电。Office 将缓存访问令牌(如果过期,则请求一个新的令牌。)这将有助于避免意外从加载项泄漏令牌。

所以要么我在 2020 年错过了它,要么它已经更新了(显然我倾向于认为后者,但是嘿,我们都错过了一些事情)。

我们认为的速率限制实际上可能是平台不允许重叠调用或无法正确处理它们。getAccessToken我们通过确保使用包装函数来序列化调用来解决这个问题。

let lastPromise = Promise.resolve("");
function getToken() {
    return lastPromise = lastPromise
        .catch(() => {}) // We don't care if the _last_ one failed, just that it settled
        .then(() => OfficeRuntime.auth.getAccessToken());
}
Run Code Online (Sandbox Code Playgroud)