|
@@ -1,4 +1,4 @@
|
|
|
-import jwt, { SignOptions } from 'jsonwebtoken';
|
|
|
|
|
|
|
+import jwt, { SignOptions, TokenExpiredError } from 'jsonwebtoken';
|
|
|
import { UserEntity } from '@/server/modules/users/user.entity';
|
|
import { UserEntity } from '@/server/modules/users/user.entity';
|
|
|
import debug from 'debug';
|
|
import debug from 'debug';
|
|
|
|
|
|
|
@@ -24,7 +24,7 @@ export class JWTUtil {
|
|
|
* @param additionalPayload 额外的 payload 数据
|
|
* @param additionalPayload 额外的 payload 数据
|
|
|
* @returns JWT token
|
|
* @returns JWT token
|
|
|
*/
|
|
*/
|
|
|
- static generateToken(user: UserEntity, additionalPayload: Partial<JWTPayload> = {}): string {
|
|
|
|
|
|
|
+ static generateToken(user: UserEntity, additionalPayload: Partial<JWTPayload> = {}, expiresIn?: string): string {
|
|
|
if (!user.id || !user.username) {
|
|
if (!user.id || !user.username) {
|
|
|
throw new Error('用户ID和用户名不能为空');
|
|
throw new Error('用户ID和用户名不能为空');
|
|
|
}
|
|
}
|
|
@@ -38,7 +38,10 @@ export class JWTUtil {
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
try {
|
|
try {
|
|
|
- return jwt.sign(payload, JWT_SECRET, { expiresIn: JWT_EXPIRES_IN as SignOptions['expiresIn']});
|
|
|
|
|
|
|
+ const options: SignOptions = {
|
|
|
|
|
+ expiresIn: expiresIn || JWT_EXPIRES_IN as SignOptions['expiresIn']
|
|
|
|
|
+ };
|
|
|
|
|
+ return jwt.sign(payload, JWT_SECRET, options);
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
logger.error('生成JWT token失败:', error);
|
|
logger.error('生成JWT token失败:', error);
|
|
|
throw new Error('生成token失败');
|
|
throw new Error('生成token失败');
|
|
@@ -55,6 +58,9 @@ export class JWTUtil {
|
|
|
return jwt.verify(token, JWT_SECRET) as JWTPayload;
|
|
return jwt.verify(token, JWT_SECRET) as JWTPayload;
|
|
|
} catch (error) {
|
|
} catch (error) {
|
|
|
logger.error('验证JWT token失败:', error);
|
|
logger.error('验证JWT token失败:', error);
|
|
|
|
|
+ if (error instanceof TokenExpiredError) {
|
|
|
|
|
+ throw new Error('令牌已过期');
|
|
|
|
|
+ }
|
|
|
throw new Error('无效的token');
|
|
throw new Error('无效的token');
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|