From 254735596428e47d0f6a64fa676924b01597ae57 Mon Sep 17 00:00:00 2001 From: xion Date: Fri, 23 May 2025 00:08:13 +0800 Subject: [PATCH] feat: add expire user tokens --- package.json | 2 +- src/models/user.ts | 9 +++++++++ src/oauth/oauth.ts | 14 ++++++++------ 3 files changed, 18 insertions(+), 7 deletions(-) diff --git a/package.json b/package.json index 4326588..a4ee2db 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@kevisual/code-center-module", - "version": "0.0.18", + "version": "0.0.19", "description": "", "main": "dist/system.mjs", "module": "dist/system.mjs", diff --git a/src/models/user.ts b/src/models/user.ts index 4a16904..8cdc765 100644 --- a/src/models/user.ts +++ b/src/models/user.ts @@ -82,6 +82,15 @@ export class User extends Model { static async getOauthUser(token: string) { return await oauth.verifyToken(token); } + /** + * 清理用户的token,需要重新登陆 + * @param userid + * @param orgid + * @returns + */ + static async clearUserToken(userid: string, type: 'org' | 'user' = 'user') { + return await oauth.expireUserTokens(userid, type); + } /** * 获取用户信息, 并设置tokenUser * @param token diff --git a/src/oauth/oauth.ts b/src/oauth/oauth.ts index 5af698a..bc3dea1 100644 --- a/src/oauth/oauth.ts +++ b/src/oauth/oauth.ts @@ -64,6 +64,7 @@ type StoreSetOpts = { [key: string]: any; }; interface Store { + redis?: Redis; getObject: (key: string) => Promise; setObject: (key: string, value: T, opts?: StoreSetOpts) => Promise; expire: (key: string, ttl?: number) => Promise; @@ -73,7 +74,7 @@ interface Store { delKeys: (keys: string[]) => Promise; } export class RedisTokenStore implements Store { - private redis: Redis; + redis: Redis; private prefix: string = 'oauth:'; constructor(redis: Redis, prefix?: string) { this.redis = redis; @@ -307,15 +308,16 @@ export class OAuth { * @param userId * @param orgId */ - async expireUserTokens(userId: string, orgId?: string) { - const userPrefix = orgId ? `org:${orgId}:user:${userId}` : `user:${userId}`; - const tokens = await this.store.keys(`${userPrefix}:token:*`); - for (const token of tokens) { + async expireUserTokens(userId: string, type: 'user' | 'org' = 'user') { + const userPrefix = type === 'org' ? `org:${userId}:user:*:` : `user:${userId}`; + const tokensKeys = await this.store.keys(`${userPrefix}:token:*`); + for (const tokenKey of tokensKeys) { try { + const token = await this.store.redis.get(tokenKey); const user = await this.store.getObject(token); this.store.delObject(user); } catch (error) { - console.error('expireUserTokens error', userId, orgId, error); + console.error('expireUserTokens error', userId, type, error); } } }