@@ -70,6 +70,7 @@ interface Store<T> {
delObject : ( value? : T ) = > Promise < void > ;
keys : ( key? : string ) = > Promise < string [ ] > ;
setToken : ( value : { accessToken : string ; refreshToken : string ; value? : T } , opts? : StoreSetOpts ) = > Promise < void > ;
delKeys : ( keys : string [ ] ) = > Promise < number > ;
}
export class RedisTokenStore implements Store < OauthUser > {
private redis : Redis ;
@@ -168,6 +169,11 @@ export class RedisTokenStore implements Store<OauthUser> {
await this . set ( userPrefix + ':refreshToken:' + refreshToken , refreshToken , refreshTokenExpire ) ;
}
}
async delKeys ( keys : string [ ] ) {
const prefix = this . prefix ;
const number = await this . redis . del ( keys . map ( ( key ) = > prefix + key ) ) ;
return number ;
}
}
export class OAuth < T extends OauthUser > {
@@ -285,4 +291,39 @@ export class OAuth<T extends OauthUser> {
}
this . store . delObject ( user ) ;
}
/**
* 获取某一个用户的所有token
* @param userId
* @returns
*/
async getUserTokens ( userId : string , orgId? : string ) {
const userPrefix = orgId ? ` org: ${ orgId } :user: ${ userId } ` : ` user: ${ userId } ` ;
const tokens = await this . store . keys ( ` ${ userPrefix } :token:* ` ) ;
return tokens ;
}
/**
* 过期某一个用户的所有token
* @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 ) {
try {
const user = await this . store . getObject ( token ) ;
this . store . delObject ( user ) ;
} catch ( error ) {
console . error ( 'expireUserTokens error' , userId , orgId , error ) ;
}
}
}
/**
* 过期所有用户的token, 然后重启服务
*/
async expireAllTokens() {
const tokens = await this . store . keys ( '*' ) ;
await this . store . delKeys ( tokens ) ;
}
}