JavaScript 最簡單確認 JWT 過期時間

JWT 的內容很簡單,資料使用 標頭.內容.簽名 這樣的方式組成,並且就只是使用 Base64 編碼,所以很容易就可以取得內容資料:
    
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJSdXl1dCIsImV4cCI6MTY5MzA2MzY3NSwiaWF0IjoxNjkyOTc3Mjc1fQ.OZauf068SFXt-j6El0gYtWodcFPC5WclL5t4rLtAsRQ";

// 內容
const payload = JSON.parse(atob(token.split('.')[1]));
console.log(payload); // {sub: 'Ruyut', exp: 1693063675, iat: 1692977275}

const expirationTime = payload.exp; // 過期時間
const now = Math.floor(Date.now() / 1000); // 現在時間

// 是否過期
const isExpired = now >= expirationTime;
console.log(`是否過期: ${isExpired}`); // 是否過期: true
    

太簡單了吧?那這樣是不是不安全?其實 JWT 安全的重點在於第三段「簽名」,在 JWT 的第一段「標頭」中紀錄了加密的方式,如果真的要自己處理太麻煩了,這裡還是使用套件來解決

安裝套件

    
npm install jsonwebtoken
    

驗證並確認過期時間

一開始示範的方式過於簡單,下面的這個方式是會先驗證,確認 JWT 有效後才會取得內容,再從內容中的 exp 到期時間確認 JWT 是否過期
    
const jwt = require('jsonwebtoken');
const token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiJSdXl1dCIsImV4cCI6MTY5MzA2MzY3NSwiaWF0IjoxNjkyOTc3Mjc1fQ.OZauf068SFXt-j6El0gYtWodcFPC5WclL5t4rLtAsRQ";

// 金鑰
const secret = "12345678901234567890123456789012";

// 使用 verify 方法來驗證 token
jwt.verify(token, secret, (err, decoded) => {
  if (err) {
    // 驗證失敗
    console.log("驗證失敗:", err.message);
  } else {
    console.log("驗證成功:", decoded); // { sub: 'Ruyut', exp: 1693063675, iat: 1692977275 }
    // 確認過期時間
    const now = Date.now() / 1000;
    if (now > decoded.exp) {
      console.log("token 已過期");
    } else {
      console.log("token 還沒過期");
    }
  }
});

    



參考資料:
JWT.IO - Introduction to JSON Web Tokens
Github - auth0/node-jsonwebtoken

留言