我们应该何时丢弃SSO访问令牌



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

详细信息:

在SSO文档中,它说:

何时调用方法

如果没有用户登录Office时无法使用外接程序,则应在外接程序启动时调用getAccessToken,并在getAccessToken的选项参数中传递allowSignInPrompt: true

这很好,也很清楚。但是我们什么时候应该停止使用代币呢?是否有一个事件可以用来了解用户已注销?(我一直找不到。(

我之所以这么问,是因为即使用户在另一个选项卡中注销,令牌也会继续工作。因此,如果我们将令牌保留任意长度的时间,就会出现用户帐户使用错误的情况。例如:

  1. 用户登录
  2. 用户打开加载项;外接程序获取访问令牌并保留它
  3. 用户打开另一个选项卡
  4. 用户在另一个选项卡中注销其帐户
  5. 用户离开
  6. 其他人使用外接程序做了不该做的事情

我刚刚做了(好吧,不是第6步(,访问令牌继续在带有外接程序的选项卡中工作。是的,用户可能应该在注销时关闭选项卡。是的,他们也不应该让电脑解锁。但在这种情况下,我想让代币过期。

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

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

我们只是在每次需要时获取令牌,但我们最近开始遇到速率限制问题。因此,现在我们将对其进行简短的缓存,但要弄清楚缓存的时间有多短是很棘手的,特别是在上面的场景2中。我们想避免利率限制,但不要让窗口开得太久。知道用户何时退出(而不达到速率限制(可以让我们做到这一点。

由于在我发布问题时我们遇到了感知到的速率限制,我们决定将其缓存一分钟,并确保我们的代码中不会有对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());
}

最新更新