UNPKG

@ahhaohho/auth-middleware

Version:

Shared authentication middleware with Passport.js for ahhaohho microservices

69 lines (61 loc) 1.93 kB
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 };