網站登入JWT的實現

TrentZ發表於2019-03-01

1、關於jwt

  • JWT(json web token)是為了在網路應用環境間傳遞宣告而執行的一種基於JSON的開放標準。

  • JWT的宣告一般被用來在身份提供者和服務提供者間傳遞被認證的使用者身份資訊,以便於從資源伺服器獲取資源。比如用在使用者登入上。

2、jwt的構成

第一部分我們稱它為頭部(header),第二部分我們稱其為載荷(payload),第三部分是簽證(signature)。

  1. header

    jwt的頭部承載兩部分資訊:

    • 宣告型別,這裡是jwt

    • 宣告加密的演算法 通常直接使用 HMAC SHA256

完整的頭部就像下面這樣的JSON:

{

    typ: "JWT",

    alg: "HS256"

}

複製程式碼
  1. playload

    載荷就是存放有效資訊的地方。這個名字像是特指飛機上承載的貨品,這些有效資訊包含三個部分

    • 標準中註冊的宣告

    • 公共的宣告

    • 私有的宣告

  2. signature

    jwt的第三部分是一個簽證資訊,這個簽證資訊由三部分組成:

    • header (base64後的)

    • payload (base64後的)

    • secret

      這個部分需要base64加密後的header和base64加密後的payload使用.連線組成的字串,然後通過header中宣告的加密方式進行加鹽secret組合加密,然後就構成了jwt的第三部分:

      49UF72vSkj-sA4aHHiYN5eoZ9Nb4w5Vb45PsLF7x_NY

      金鑰secret是儲存在服務端的,服務端會根據這個金鑰進行生成token和驗證,所以需要保護好。

相對來說一個完整的jwt token資訊的整體結構為:

header (base64)+payload (base64)+Signature 
複製程式碼

3. jwt 的實現

程式碼實現:

// jwt 登入,config.seret 為設定的伺服器金鑰
// exp: 為token的有效期
// name: 這裡是包含的使用者資訊,可以任意配置
var token = jwt.sign({
    exp: Math.floor(Date.now() / 1000) + 60*60*24,
    name: data.person,
    ....
}, config.secret, function(err, token) {
    res.json({
        msg: {
            status: 1,
            msg: "登入成功"
        },
        data: {
            token: token,
        }
    })
});

// 驗證jwt
new Promise(function(resolve, reject) {
    jwt.verify(token, config.secret, function(err, decoded) {
        if (err) {
            res.json({
                ok: 0,
                msg: err
            })
        } else {
            // 如果驗證成功的話這裡做相應的後臺資料處理
        }
    });
});

複製程式碼

參考連結:
jwt官網

相關文章