如何使用JWT生成和驗證Token

JSON Web Tokens (JWT) 是一種基於 JSON 格式的輕量級、可自包含的身份驗證標識,它可以作為用戶的身份令牌,用於應用程序和伺服器之間的通信。在本文中,我們將探討如何使用JWT生成和驗證Token。

一、JWT簡介

JWT是一種令牌,它由三部分組成:頭部、載荷和簽名。頭部包含令牌的類型以及使用的加密演算法。載荷包含用戶身份信息和其他的元數據。簽名是對頭部和載荷進行加密後的字元串。JWT可以被用來作為一個授權標識,在服務端驗證授權後進行某些操作。

下面是JWT的一個例子:


eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

其中,使用 . 連接的三個字元串分別為頭部、載荷和簽名,如果將它們拆開並進行解碼,你就可以看到其中包含的信息。

二、JWT生成過程

為了生成JWT,我們可以按照以下步驟進行:

1. 創建載荷

載荷包含了JWT所要傳遞的信息,例如用戶ID、訪問許可權等。載荷必須是一個JSON對象,可以包含任意數量的屬性。以下是一個例子:


{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022
}

其中,sub代表用戶的唯一標識符,name代表用戶名,iat代表令牌的發行時間,可以用來判斷令牌是否過期。

2. 創建頭部

頭部包含了JWT的類型和使用的加密演算法。頭部也必須是一個JSON對象,包含兩個屬性:alg和typ。演算法可以是HS256、RS256等。


{
  "alg": "HS256",
  "typ": "JWT"
}

3. 創建簽名

簽名是使用頭部和載荷生成的,在生成簽名時需要指定一些秘密信息。在這個例子中,我們使用SHA256演算法和一個密鑰來生成簽名。


HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)

其中,秘密信息可以是任何你想要的字元串,只要它足夠長、足夠隨機即可。你應該盡量保護這個秘密信息,否則可能會有人仿冒你的令牌。

4. 將所有部分組合成JWT

最後,我們將頭部、載荷和簽名按照以下格式組合成JWT:


base64UrlEncode(header) + '.' +
base64UrlEncode(payload) + '.' +
base64UrlEncode(signature)

其中,base64UrlEncode是將JSON對象進行URL安全的Base64編碼。

5. 完整示例代碼


const jwt = require('jsonwebtoken');
const secret = 'mysecret';

const payload = {
  sub: '1234567890',
  name: 'John Doe',
  iat: 1516239022
};

const header = {
  alg: 'HS256',
  typ: 'JWT'
};

const token = jwt.sign(payload, secret, {
  header: header,
  expiresIn: '1h'
});

console.log(token);

三、JWT驗證過程

在服務端接收到JWT後,我們需要進行驗證來確認它是真實有效的,以下是驗證JWT的一般步驟:

1. 將JWT按照 . 分割成頭部、載荷和簽名三個部分

可以使用以下代碼將JWT解析成JSON對象:


const token = 'your_token_here';
const [headerEncoded, payloadEncoded, signatureEncoded] = token.split('.');

const header = JSON.parse(Buffer.from(headerEncoded, 'base64').toString('utf-8'));
const payload = JSON.parse(Buffer.from(payloadEncoded, 'base64').toString('utf-8'));

2. 確認頭部中的演算法和類型是否正確

在頭部中,我們定義了JWT簽名使用的演算法和類型,我們需要確認它們是否與預期相符。

3. 使用和生成JWT時相同的秘密信息來生成簽名

在驗證簽名之前,我們需要使用JWT生成時使用的相同秘密信息來生成簽名,然後將生成的簽名與JWT中的簽名進行比對。如果它們不匹配,那麼這個JWT是無效的。

4. 驗證過期時間

當生成JWT時,可以指定它的過期時間,或使用默認值。在驗證JWT時,我們需要檢查iat(發行時間)和exp(過期時間)是否在有效範圍內。如果JWT已經過期,那麼它也是無效的。

5. 完整示例代碼


const jwt = require('jsonwebtoken');
const secret = 'mysecret';

const token = 'your_token_here';
const [headerEncoded, payloadEncoded, signatureEncoded] = token.split('.');

const header = JSON.parse(Buffer.from(headerEncoded, 'base64').toString('utf-8'));
const payload = JSON.parse(Buffer.from(payloadEncoded, 'base64').toString('utf-8'));

jwt.verify(token, secret, { algorithms: ['HS256'] }, (err, decoded) => {
  if (err) {
    console.error(err.message);
  } else {
    console.log(decoded);
  }
});

四、結論

JWT是一種輕量級、可自包含的身份驗證標識,它可以被用來作為用戶的身份令牌,用於應用程序和伺服器之間的通信。在本文中,我們探討了如何使用JWT生成和驗證Token,包括創建載荷、頭部和簽名,將它們組合成JWT,以及如何在服務端接收和驗證JWT。希望本文能對讀者有所幫助。

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

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

相關推薦

  • 如何使用Python獲取某一行

    您可能經常會遇到需要處理文本文件數據的情況,在這種情況下,我們需要從文本文件中獲取特定一行的數據並對其進行處理。Python提供了許多方法來讀取和處理文本文件中的數據,而在本文中,…

    編程 2025-04-29
  • 如何使用jumpserver調用遠程桌面

    本文將介紹如何使用jumpserver實現遠程桌面功能 一、安裝jumpserver 首先我們需要安裝並配置jumpserver。 $ wget -O /etc/yum.repos…

    編程 2025-04-29
  • 如何使用Python讀取CSV數據

    在數據分析、數據挖掘和機器學習等領域,CSV文件是一種非常常見的文件格式。Python作為一種廣泛使用的編程語言,也提供了方便易用的CSV讀取庫。本文將介紹如何使用Python讀取…

    編程 2025-04-29
  • Hibernate註解聯合主鍵 如何使用

    解答:Hibernate的註解方式可以用來定義聯合主鍵,使用@Embeddable和@EmbeddedId註解。 一、@Embeddable和@EmbeddedId註解 在Hibe…

    編程 2025-04-29
  • 如何使用HTML修改layui內部樣式影響全局

    如果您想要使用layui來構建一個美觀的網站或應用,您可能需要使用一些自定義CSS來修改layui內部組件的樣式。然而,修改layui組件的樣式可能會對整個頁面產生影響,甚至可能破…

    編程 2025-04-29
  • 如何使用random生成不重複的隨機數

    在編程開發中,我們經常需要使用隨機數來模擬一些場景或生成一些數據。但是如果隨機數重複,就會造成數據的不準確性。這時我們就需要使用random庫來生成不重複且隨機的數值。下面將從幾個…

    編程 2025-04-29
  • 如何使用GPU加速運行Python程序——以CSDN為中心

    GPU的強大性能是眾所周知的。而隨著深度學習和機器學習的發展,越來越多的Python開發者將GPU應用於深度學習模型的訓練過程中,提高了模型訓練效率。在本文中,我們將介紹如何使用G…

    編程 2025-04-29
  • 如何使用Python導入Random庫

    Python是一門優秀的編程語言,它擁有豐富的第三方庫和模塊。其中,Random庫可謂是最常用的庫之一,它提供了用於生成隨機數的功能。對於開發人員而言,使用Random庫能夠提高開…

    編程 2025-04-29
  • 理解agentmain方法如何使用

    如果你不清楚如何使用agentmain方法,那麼這篇文章將會為你提供全面的指導。 一、什麼是agentmain方法 在Java SE 5.0中,Java提供了一個機制,允許程序員在…

    編程 2025-04-29
  • 如何使用Python將print輸出到界面?

    在Python中,print是最常用的調試技巧之一。在編寫代碼時,您可能需要在屏幕上輸出一些值、字元串或結果,以便您可以更好地理解並調試代碼。因此,在Python中將print輸出…

    編程 2025-04-29

發表回復

登錄後才能評論