Jwt Refresh Token 的完整指南

一、什麼是Jwt Refresh Token

Json Web Token(JWT)是一種在網路間傳輸信息的方式,常用於身份驗證和授權。使用JWT需要在客戶端使用密鑰對數據進行簽名,然後將令牌發回伺服器以進行驗證。但是,如果需要長時間訪問某些內容,許多身份驗證和授權令牌將過期。JWT Refresh Token允許客戶端在過期的JWT之前提供一個新的JWT令牌。

JWT Refresh Token是一種標準的身份驗證令牌,它允許客戶端在過期之前自動重新生成新的令牌,而不需要進行用戶重新登錄或者授權。

二、Jwt Refresh Token 的工作原理

JWT是一種聲明式的身份驗證/授權機制,它由三部分組成:頭部、載荷和簽名。第一部分是頭部,用於指定JWT類型和使用的簽名演算法。第二部分是載荷,包含有關用戶的信息和其他元數據。第三部分是簽名,用於驗證JWT的完整性。這三個部分都是使用Base64進行編碼的。

現在,假設在JWT令牌中有一個稱為設置Refresh Token的欄位,值為true。當該令牌在過期之前發現時,可以使用令牌中包含的「Refresh Token」生成新的JWT令牌並發送給客戶端。

以下是JWT和Refresh Token工作的簡要流程:

1.使用伺服器端密鑰和其他信息為JWT生成令牌。

2.返回JWT令牌和Refresh Token

3.客戶端記錄令牌和Refresh Token,並在每個之間進行快速切換。

4.當JWT令牌過期時,客戶端使用Refresh Token請求新的JWT令牌。

5.刷新新的JWT令牌並繼續使用。

三、Jwt Refresh Token 的優勢

使用JWT Refresh Token有幾個優點:

1.頒髮長期有效的訪問令牌。使用Refresh Token可以將訪問令牌的有效期延長到較長的時間。

2.降低伺服器負載。使用Refresh Token可以減少對伺服器的訪問,因為客戶端可以在一段時間內自行處理驗證和更新令牌。

3.提高安全性。使用Refresh Token可以減少發生中間人攻擊的機會,因為JWT令牌有效期非常短,而Refresh Token有效期長。

四、如何實現Jwt Refresh Token

實現JWT Refresh Token需要進行以下步驟:

1.創建初始JWT令牌

const jwt = require('jsonwebtoken');
const jwtKey = 'your_jwt_secret';//jwt密鑰
const jwtExpirySeconds = 300; //JWT Token的有效期為5分鐘

const userName = 'your_username';//用戶名稱

const token = jwt.sign({ userName }, jwtKey, {
  algorithm: 'HS256',
  expiresIn: jwtExpirySeconds
});

2.生成Refresh Token

為每個JWT令牌生成一個Refresh Token,用於在令牌到期之前獲取新的令牌。

const RefreshToken = require('../models/refresh-token.model');//引入 RefreshToken 模型

const generateRefreshToken = async (userName) => {
  const refreshToken = new RefreshToken({
    userName: userName,
    token: crypto.randomBytes(40).toString('hex'), //生成一個40位的隨機Refresh Token
    expires: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000) //Refresh Token有效期7天
  });
  await refreshToken.save();
  return refreshToken;
}

3.驗證JWT令牌並生成新的JWT令牌

const verify = require('./verify');//引入 JWT 驗證方法

const refreshToken = async (oldToken) => {
  const oldDecodedToken = jwt.decode(oldToken);
  const refreshToken = await RefreshToken.findOne({ userName: oldDecodedToken.userName });
  if (!refreshToken) return;//傳遞的舊Token的refreshToken不存在

  //驗證RefreshToken是否過期
  if (refreshToken.expires.valueOf() < Date.now()) {
    await refreshToken.remove();//刪除RefreshToken
    return;//refreshToken已過期
  }

  //驗證JWT令牌的簽名,以確保它沒有被改變
  const { algorithm } = jwt.decode(oldToken, { complete: true }).header;
  await verify(oldToken, jwtKey, algorithm);

  const newToken = jwt.sign({ userName: oldDecodedToken.userName }, jwtKey, {
    algorithm: algorithm,//使用相同的演算法
    expiresIn: jwtExpirySeconds
  });
  return newToken;
}

4.使用Refresh Token獲取新的JWT令牌

const express = require('express');

const router = express.Router();
const RefreshToken = require('../models/refresh-token.model');
const jwtRefreshToken = require('../middleware/jwt-refreshtoken.middleware');
const jwt = require('jsonwebtoken');
const jwtKey = 'your_jwt_secret';//jwt密鑰

router.post('/', jwtRefreshToken, async (req, res) => {
  try {
    const oldToken = req.token;//傳遞的舊的JWT令牌
    const newToken = await refreshToken(oldToken);//生成新的JWT令牌
    if (!newToken) {
      res.status(401).send("Unauthorized");//新的JWT令牌被拒絕
      return;
    }
    res.json({ token: newToken });//發送新的JWT令牌
  } catch (err) {
    res.status(500).send(err);//伺服器錯誤
  }
});

module.exports = router;

五、總結

Jwt Refresh Token 是一種長期有效的身份驗證令牌,可以提高客戶端的使用體驗,降低伺服器負載和提高安全性。實現 JWT Refresh Token 具有重要的意義,需要根據具體的業務需求進行定製化開發。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/206089.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-07 17:49
下一篇 2024-12-07 17:49

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • 運維Python和GO應用實踐指南

    本文將從多個角度詳細闡述運維Python和GO的實際應用,包括監控、管理、自動化、部署、持續集成等方面。 一、監控 運維中的監控是保證系統穩定性的重要手段。Python和GO都有強…

    編程 2025-04-29
  • Python應用程序的全面指南

    Python是一種功能強大而簡單易學的編程語言,適用於多種應用場景。本篇文章將從多個方面介紹Python如何應用於開發應用程序。 一、Web應用程序 目前,基於Python的Web…

    編程 2025-04-29
  • Python wordcloud入門指南

    如何在Python中使用wordcloud庫生成文字雲? 一、安裝和導入wordcloud庫 在使用wordcloud前,需要保證庫已經安裝並導入: !pip install wo…

    編程 2025-04-29
  • Python字元轉列表指南

    Python是一個極為流行的腳本語言,在數據處理、數據分析、人工智慧等領域廣泛應用。在很多場景下需要將字元串轉換為列表,以便於操作和處理,本篇文章將從多個方面對Python字元轉列…

    編程 2025-04-29
  • 打造照片漫畫生成器的完整指南

    本文將分享如何使用Python編寫一個簡單的照片漫畫生成器,本文所提到的所有代碼和技術都適用於初學者。 一、環境準備 在開始編寫代碼之前,我們需要準備一些必要的環境。 首先,需要安…

    編程 2025-04-29
  • Python小波分解入門指南

    本文將介紹Python小波分解的概念、基本原理和實現方法,幫助初學者掌握相關技能。 一、小波變換概述 小波分解是一種廣泛應用於數字信號處理和圖像處理的方法,可以將信號分解成多個具有…

    編程 2025-04-29
  • 如何在Java中拼接OBJ格式的文件並生成完整的圖像

    OBJ格式是一種用於表示3D對象的標準格式,通常由一組頂點、面和紋理映射坐標組成。在本文中,我們將討論如何將多個OBJ文件拼接在一起,生成一個完整的3D模型。 一、讀取OBJ文件 …

    編程 2025-04-29
  • Python初學者指南:第一個Python程序安裝步驟

    在本篇指南中,我們將通過以下方式來詳細講解第一個Python程序安裝步驟: Python的安裝和環境配置 在命令行中編寫和運行第一個Python程序 使用IDE編寫和運行第一個Py…

    編程 2025-04-29
  • Python起筆落筆全能開發指南

    Python起筆落筆是指在編寫Python代碼時的編寫習慣。一個好的起筆落筆習慣可以提高代碼的可讀性、可維護性和可擴展性,本文將從多個方面進行詳細闡述。 一、變數命名 變數命名是起…

    編程 2025-04-29

發表回復

登錄後才能評論