欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

前端Token?組成及生成方法示例詳解

 更新時間:2023年04月21日 08:45:08   作者:亦黑迷失  
這篇文章主要為大家介紹了前端Token?組成及生成方法示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

正文

平常前端項目中,我們通常使用 token 來進行身份驗證 —— 客戶登錄成功,接口就會返回一個 token,之后前端每次發(fā)送請求就在請求頭中添加個值為 token 的 authorization 字段來表明身份。至于 token 是怎么生成的?那一長串的字母數(shù)字到底有什么含義?或許一些身為前端的小伙伴們長久以來并不甚了解。那么本文,就來對 token 的組成及生成方法做個基本的介紹吧。

生成 token

在使用 koa 搭建的后端項目中,可以安裝 jsonwebtoken 這個庫來生成 token:

npm i jsonwebtoken

之后引入 jwt,通過 jwt.sign() 即可得到 token,傳入的第一個參數(shù)是 token 攜帶的信息,第二個參數(shù)是用于數(shù)字簽名的密鑰,第三個參數(shù)可以傳入一些配置,比如過期時間 expiresIn,單位為秒:

// 代碼片段一,省略部分代碼
const jwt = require('jsonwebtoken')
loginRouter.get('/login', (ctx, next) => {
  const token = jwt.sign({ name: 'Jay' }, 'aaabbbccc', { expiresIn: 60 * 60 })
  ctx.body = {
    msg: '登錄成功',
    token
  }
})

使用瀏覽器發(fā)送請求,可以看到生成的 token:

token 的組成

我們可以將生成的 token 復制粘貼到 jwt 官網(wǎng)的 debugger 工具里進行解碼:

可以發(fā)現(xiàn) token 使用 . 分割成了 3 部分:

1. Header

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9 這部分,為 Base64 編碼后的結(jié)果,其中有兩個屬性:

  • alg,也就是 Algorithm(算法) 的縮寫,指定加密算法,默認為 HS256(HMAC-SHA256),是一種單項散列函數(shù),加密解密采用同個密鑰;
  • typ,token 的類型(type),通常可以固定寫成 JWT。

所以這部分結(jié)果,如果保持代碼片段一不變,瀏覽器每次重新請求得到的結(jié)果也都不會變化。

2. Payload

token 攜帶的數(shù)據(jù),除了我們在代碼片段一中傳入的 name 信息以及過期時間 exp ,還有默認攜帶的 iat(issued at),為 token 的簽發(fā)時間。Payload 部分的數(shù)據(jù)同樣是經(jīng)過 Base64 編碼的。

3. Signature

簽名部分,通過 HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload),secret) 得到,即將 Header 和 Payload 的 Base64 編碼結(jié)果與數(shù)字簽名的密鑰 secret 結(jié)合,通過 HS256 算法生成,這部份的結(jié)果,瀏覽器每次重新請求時都會重新生成。

驗證 token

假定前端是通過 Bearer Token 類型向服務器傳遞的 token,實際上就是將 token 賦值給請求頭的 authorization 屬性。那么后端在驗證時,可以通過 ctx.headers.authorization 拿到帶有 Bearer 前綴(注意 Bearer 后有個空格)的 token 。之后再將獲取的 token 以及代碼片段一生成 token 時傳入的密鑰一起傳給 jwt.verify(),如果驗證成功,則 res 可以得到 Payload 數(shù)據(jù);如果驗證失敗,則會報錯,可用 try catch 捕獲 :

// 代碼片段二
userRouter.get('/center', (ctx, next) => {
  const authorization = ctx.headers.authorization
  const token = authorization.replace('Bearer ', '')
  try {
    const res = jwt.verify(token, 'aaabbbccc') 
    console.log('res', res) // res { name: 'Jay', iat: 1679814009, exp: 1679817609 }
    ctx.body = '驗證成功'
  } catch (error) {
    ctx.body = '驗證失敗'
  }
})

采用非對稱加密算法

在代碼片段一中使用 jwt 生成 token 時,默認采用的加密算法是 HS256,安全性不高,所以一般公司里的項目采用的都是非對稱加密算法,比如 RSA 算法,使用私鑰來頒發(fā) token,使用公鑰來驗證 token,關于加密算法這部分知識,若想了解更多,可移步 《前端加密》

生成公私密鑰

在 windows 系統(tǒng)下,公私密鑰的生成可以去下載安裝 OpenSSL, 然后通過系統(tǒng)自帶的命令行工具使用 openssl 生成。也可以直接通過 git 的 bash 工具(集成了 OpenSSL)來生成 。首先生成私鑰: 進入到要保存密鑰的目錄下,輸入 openssl 按下回車:

接著就可以輸入 genrsa -out private.key 1024 來生成 rsa 算法的私鑰:

生成的私鑰如下:

有了私鑰,再使用 rsa -in private.key -pubout -out public.key 生成與之對應的公鑰:

公鑰如下:

修改之前的代碼

有了一對公私密鑰后,生成 token 時我們就可以將代碼片段一稍加修改,將傳入的密鑰改為私鑰,并在配置對象中指定要使用的算法為 RS256

const token = jwt.sign({ name: 'Jay' }, privateKey, {
  expiresIn: 60 * 60,
  algorithm: 'RS256'
})

驗證 token 時,也需將代碼片段二中用公鑰替換原本的密鑰,然后添加算法配置,只不過這里 algorithm 的值為數(shù)組,因為在驗證時是可以通過多種算法依次嘗試的:

const res = jwt.verify(token, publicKey, {
  algorithm: ['RS256']
})

privateKeypublicKey 可以通過 fs 模塊獲?。?/p>

const fs = require('fs')
const privateKey = fs.readFileSync('./src/keys/private.key')
const publicKey = fs.readFileSync('./src/keys/public.key')

以上就是前端Token 組成及生成方法示例詳解的詳細內(nèi)容,更多關于前端Token組成生成方法的資料請關注腳本之家其它相關文章!

相關文章

  • js事件處理程序跨瀏覽器解決方案

    js事件處理程序跨瀏覽器解決方案

    這篇文章主要為大家詳細介紹了js事件處理程序跨瀏覽器解決方案,感興趣的小伙伴們可以參考一下
    2016-03-03
  • 原生js實現(xiàn)表格循環(huán)滾動

    原生js實現(xiàn)表格循環(huán)滾動

    這篇文章主要為大家詳細介紹了原生js實現(xiàn)表格循環(huán)滾動,每次滾動一行停頓,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-11-11
  • javascript的防抖節(jié)流函數(shù)解析

    javascript的防抖節(jié)流函數(shù)解析

    這篇文章主要為大家介紹了javascript防抖節(jié)流函數(shù),具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • JS獲取當前日期時間并定時刷新示例

    JS獲取當前日期時間并定時刷新示例

    這篇文章主要介紹了JS如何獲取當前日期時間并執(zhí)行定時刷新,示例代碼如下,需要的朋友不要錯過
    2014-06-06
  • 微信小程序canvas實現(xiàn)簽名功能

    微信小程序canvas實現(xiàn)簽名功能

    這篇文章主要為大家詳細介紹了微信小程序canvas實現(xiàn)簽名功能,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-01-01
  • 用js實現(xiàn)用戶注冊功能

    用js實現(xiàn)用戶注冊功能

    這篇文章主要為大家詳細介紹了用js實現(xiàn)用戶注冊的簡潔版,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • JavaScript實現(xiàn)選中文字提示新浪微博分享效果

    JavaScript實現(xiàn)選中文字提示新浪微博分享效果

    這篇文章主要為大家詳細介紹了JavaScript實現(xiàn)選中文字提示新浪微博分享效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-06-06
  • javascript感應鼠標圖片透明度顯示的方法

    javascript感應鼠標圖片透明度顯示的方法

    這篇文章主要介紹了javascript感應鼠標圖片透明度顯示的方法,涉及javascript針對鼠標事件及圖片透明度操作技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-02-02
  • 別了 JavaScript中的isXX系列

    別了 JavaScript中的isXX系列

    我們很容易被漂亮的代碼吸引,也不知不覺的在自己的代碼庫中加入這些。卻沒有冷靜的想過它們的優(yōu)劣。這不,我就收集了一系列形如 是否為……? 的判斷的boolean函數(shù)
    2012-08-08
  • JS實現(xiàn)換膚功能的方法實例詳解

    JS實現(xiàn)換膚功能的方法實例詳解

    這篇文章主要介紹了JS實現(xiàn)換膚功能的方法,結(jié)合實例形式分析了javascript針對頁面元素屬性與樣式動態(tài)操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2019-01-01

最新評論