@ahhaohho/auth-middleware
Version:
Shared authentication middleware with Passport.js for ahhaohho microservices
69 lines (61 loc) • 1.93 kB
JavaScript
const jwt = require('jsonwebtoken');
const { getJwtKeys } = require('./secretManager');
/**
* 다중 키를 사용한 JWT 토큰 검증
* 현재 키로 검증 실패 시 이전 키로 fallback 검증
*
* @param {string} token - JWT 토큰
* @returns {Promise<{decoded: object, keyUsed: string}>}
*/
async function verifyTokenWithFallback(token) {
const keys = await getJwtKeys();
// 1. 현재 키로 검증 시도
try {
const decoded = jwt.verify(token, keys.current);
return { decoded, keyUsed: 'current' };
} catch (currentKeyError) {
// 2. 이전 키가 있으면 fallback 검증 시도
if (keys.previous) {
try {
const decoded = jwt.verify(token, keys.previous);
console.warn(
'[@ahhaohho/auth-middleware] ⚠️ Token verified with previous key (fallback) for userId:',
decoded.userId
);
return { decoded, keyUsed: 'previous' };
} catch (previousKeyError) {
// 두 키 모두 실패한 경우 현재 키의 에러를 던짐 (더 중요한 에러)
throw currentKeyError;
}
} else {
// 이전 키가 없으면 현재 키 에러를 그대로 던짐
throw currentKeyError;
}
}
}
/**
* 토큰 서명을 위한 현재 키 가져오기
* @returns {Promise<string>}
*/
async function getCurrentSigningKey() {
const keys = await getJwtKeys();
return keys.current;
}
/**
* JWT 토큰 생성 (항상 현재 키 사용)
* @param {object} payload - JWT payload
* @param {object} options - JWT options (expiresIn 등)
* @returns {Promise<string>} JWT 토큰
*/
async function signToken(payload, options = {}) {
const signingKey = await getCurrentSigningKey();
if (!signingKey) {
throw new Error('JWT signing key is not available');
}
return jwt.sign(payload, signingKey, options);
}
module.exports = {
verifyTokenWithFallback,
getCurrentSigningKey,
signToken
};