Supertokens - 撤销另一个用户的会话而不注销他
Supertokens - revoke another user's session without signing him off
我正在使用超级令牌进行身份验证。在更改另一个用户的权限后,我撤销了他的会话,这将导致他的角色在他当前的活动令牌运行其生命周期限制后更新。
这会导致其他用户在此时注销。
我希望更新他的角色(即重新创建他的会话),但不要注销他并再次询问他的凭据。
这可能吗?
假设您使用的是 NodeJS SDK,我将回答这个问题。如果不是,答案总体上仍然适用,但函数名称会改变。
你想要的都有可能。我假设您很清楚用户在访问令牌中的角色,因此您应该使用 SDK 中的 updateAccessTokenPayload
函数,而不是撤销其他用户的会话:
import Session from "supertokens-node/recipe/session";
async function updateRoleOfOtherUser(userId: string) {
// we first get all the sessionHandles (string[]) for a user
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 }
);
})
}
角色的更新将在他们的会话刷新时生效,并且他们不会注销。
如果您希望更新立即生效,您可以在您这边维护一个缓存,标记所有需要提前刷新的会话句柄。在成功验证包含这些会话句柄的任何此类会话后,您可以向前端发送 401 以强制刷新会话并导致其角色更新。
我正在使用超级令牌进行身份验证。在更改另一个用户的权限后,我撤销了他的会话,这将导致他的角色在他当前的活动令牌运行其生命周期限制后更新。 这会导致其他用户在此时注销。 我希望更新他的角色(即重新创建他的会话),但不要注销他并再次询问他的凭据。 这可能吗?
假设您使用的是 NodeJS SDK,我将回答这个问题。如果不是,答案总体上仍然适用,但函数名称会改变。
你想要的都有可能。我假设您很清楚用户在访问令牌中的角色,因此您应该使用 SDK 中的 updateAccessTokenPayload
函数,而不是撤销其他用户的会话:
import Session from "supertokens-node/recipe/session";
async function updateRoleOfOtherUser(userId: string) {
// we first get all the sessionHandles (string[]) for a user
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 }
);
})
}
角色的更新将在他们的会话刷新时生效,并且他们不会注销。
如果您希望更新立即生效,您可以在您这边维护一个缓存,标记所有需要提前刷新的会话句柄。在成功验证包含这些会话句柄的任何此类会话后,您可以向前端发送 401 以强制刷新会话并导致其角色更新。