supertokens 撤销其他用户的活动会话

supertokens revoke other users active sessions

我有一个通过超级令牌管理授权和用户角色的网络应用程序。初始化会话时,应用程序从数据库中读取用户角色并将其传递给 supertokens 角色初始化。

有些用户是管理员,他们可以更改其他用户的角色。当另一个用户的角色改变时,我想撤销他们的活动会话,或改变他们的角色。这需要立即发生,即使用户有活动会话,所以改变他们在我的数据库中的角色是不够的。

我知道 supertokens 有一个关于“为 UserRoles 定义数据库架构和 API”的未决问题。然而,我希望有一些方法可以撤销具有当前结构的其他用户的活动会话。

任何关于如何解决这个问题的帮助或解释将不胜感激。

首先,关于 SuperTokens 会话如何工作的一些信息:

  • 访问令牌是包含有效负载(具有您添加的用户角色)的问题。访问令牌的验证是无状态的(默认情况下)。

  • 颁发刷新令牌,用于在现有访问令牌过期时获取新的访问和刷新令牌。

现在,当您更改用户的角色时,您希望将该更改传播到他们的所有会话。 SuperTokens 提供的后端 SDK 有这方面的功能。例如,如果你使用的是 NodeJS,你可以这样做:

let sessionHandles = await Session.getAllSessionHandlesForUser(userId);

// we update all the session's Access Token payloads for this user
sessionHandles.forEach(async (handle) => {
    let currAccessTokenPayload = (await Session.getSessionInformation(handle)).accessTokenPayload;

    await Session.updateAccessTokenPayload(handle,
            { role: "newRole", ...currAccessTokenPayload }
    );
})

由于我们正在更改另一个会话的访问令牌的内容,该会话只有在刷新后才会知道。因此默认情况下,该用户的角色更改传播会有延迟。

下面是解决此问题的选项:

  • 缩短访问令牌的生命周期。这样,会话会更频繁地刷新,角色更改的传播也会更快。
  • 启用访问令牌黑名单。这可以通过核心的 config.yaml 设置(access_token_blacklisting: true 标志)来完成。如果你用的是docker,你可以传ACCESS_TOKEN_BLACKLISTING=true。通过此设置,每个会话验证都将查询核心,如果访问令牌的有效负载发生变化,则会立即反映出来。这样做的缺点是会话验证不会因为额外的网络调用而变慢。

最后,您可以自己实施混合方法:

维护角色更改的缓存(由您自己),并在会话验证期间添加中间件(在 verifySession 运行之后)以检查您的缓存。如果当前用户的角色已更改,return 向前端发送 401 强制它刷新会话,从而立即更新访问令牌的有效负载。

希望对您有所帮助!