~/snippets/jwt-utilities
Published on

JWT Authentication Utilities

481 words3 min read

Generate Tokens

const jwt = require('jsonwebtoken')

const generateAccessToken = (userId) => {
  return jwt.sign({ userId }, process.env.JWT_SECRET, { expiresIn: '15m' })
}

const generateRefreshToken = (userId) => {
  return jwt.sign({ userId }, process.env.JWT_REFRESH_SECRET, { expiresIn: '7d' })
}

const generateTokens = (userId) => {
  return {
    accessToken: generateAccessToken(userId),
    refreshToken: generateRefreshToken(userId),
  }
}

Verify Token

const verifyToken = (token, secret) => {
  try {
    const decoded = jwt.verify(token, secret)
    return { valid: true, decoded }
  } catch (error) {
    if (error.name === 'TokenExpiredError') {
      return { valid: false, error: 'Token expired' }
    }
    return { valid: false, error: 'Invalid token' }
  }
}

Refresh Token Handler

const refreshAccessToken = async (refreshToken) => {
  const { valid, decoded } = verifyToken(refreshToken, process.env.JWT_REFRESH_SECRET)

  if (!valid) {
    throw new Error('Invalid refresh token')
  }

  // Optionally verify token is in database/blacklist
  const newAccessToken = generateAccessToken(decoded.userId)

  return newAccessToken
}