feat: add expire user tokens

This commit is contained in:
熊潇 2025-05-23 00:08:13 +08:00
parent ad0d2e717f
commit 2547355964
3 changed files with 18 additions and 7 deletions

View File

@ -1,6 +1,6 @@
{ {
"name": "@kevisual/code-center-module", "name": "@kevisual/code-center-module",
"version": "0.0.18", "version": "0.0.19",
"description": "", "description": "",
"main": "dist/system.mjs", "main": "dist/system.mjs",
"module": "dist/system.mjs", "module": "dist/system.mjs",

View File

@ -82,6 +82,15 @@ export class User extends Model {
static async getOauthUser(token: string) { static async getOauthUser(token: string) {
return await oauth.verifyToken(token); 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 * , tokenUser
* @param token * @param token

View File

@ -64,6 +64,7 @@ type StoreSetOpts = {
[key: string]: any; [key: string]: any;
}; };
interface Store<T> { interface Store<T> {
redis?: Redis;
getObject: (key: string) => Promise<T>; getObject: (key: string) => Promise<T>;
setObject: (key: string, value: T, opts?: StoreSetOpts) => Promise<void>; setObject: (key: string, value: T, opts?: StoreSetOpts) => Promise<void>;
expire: (key: string, ttl?: number) => Promise<void>; expire: (key: string, ttl?: number) => Promise<void>;
@ -73,7 +74,7 @@ interface Store<T> {
delKeys: (keys: string[]) => Promise<number>; delKeys: (keys: string[]) => Promise<number>;
} }
export class RedisTokenStore implements Store<OauthUser> { export class RedisTokenStore implements Store<OauthUser> {
private redis: Redis; redis: Redis;
private prefix: string = 'oauth:'; private prefix: string = 'oauth:';
constructor(redis: Redis, prefix?: string) { constructor(redis: Redis, prefix?: string) {
this.redis = redis; this.redis = redis;
@ -307,15 +308,16 @@ export class OAuth<T extends OauthUser> {
* @param userId * @param userId
* @param orgId * @param orgId
*/ */
async expireUserTokens(userId: string, orgId?: string) { async expireUserTokens(userId: string, type: 'user' | 'org' = 'user') {
const userPrefix = orgId ? `org:${orgId}:user:${userId}` : `user:${userId}`; const userPrefix = type === 'org' ? `org:${userId}:user:*:` : `user:${userId}`;
const tokens = await this.store.keys(`${userPrefix}:token:*`); const tokensKeys = await this.store.keys(`${userPrefix}:token:*`);
for (const token of tokens) { for (const tokenKey of tokensKeys) {
try { try {
const token = await this.store.redis.get(tokenKey);
const user = await this.store.getObject(token); const user = await this.store.getObject(token);
this.store.delObject(user); this.store.delObject(user);
} catch (error) { } catch (error) {
console.error('expireUserTokens error', userId, orgId, error); console.error('expireUserTokens error', userId, type, error);
} }
} }
} }