詳解JWT與Token的應(yīng)用與原理
前言:JWT全稱“JSON Web Token”,是實現(xiàn)Token的機制。官網(wǎng):https://jwt.io/
JWT的應(yīng)用
- JWT用于登錄身份驗證。
- 用戶登錄成功后,后端通過JWT機制生成一個token,返回給客戶端。
- 客戶端后續(xù)的每次請求都需要攜帶token,攜帶在authorization中。
- 后端從authorization中拿到token后,通過secretKey進行解密驗證身份。
Token的組成原理
JWT生成的Token由三部分組成:header payload signature
- header
- alg:指定signature采用的加密算法,默認是HS256,對稱加密(加密和解密的密鑰相同)
- typ:固定值,通常是JWT
- 通過base64Url算法進行編碼
- payload
- 用戶id和name
- 默認攜帶iat,令牌簽發(fā)時間(時間戳)
- exp設(shè)置令牌過期時間
- 通過base64Url算法進行編碼
- signature
- 設(shè)置一個secretKey,通過將前兩個結(jié)果合并后進行HS256算法
- signature的組成:
HS256(baseUrl64(header)+'.'+baseUrl(payload)+','+secretKey) - secreKey一定不能暴露,因為可以頒發(fā)token,也可以解密
采用HS256對稱加密生成的Token(https://jwt.io/)

JWT對稱加密
JWT默認使用的是HS256對稱加密,其中secretKey是密鑰,意味著公鑰和私鑰都是同一個,這樣安全性不高。
例如在分布式服務(wù)中,其他系統(tǒng)服務(wù)器雖然可以用secretKey驗證token,但是這樣不安全,因為采用的是對稱加密算法,每個服務(wù)器都可以通secretKey頒發(fā)token,黑客只要攻破任何一個服務(wù)器就可以拿到secretKey。

JWT非對稱加密
所以我們需要使用非對稱加密,加密和解密的密鑰不一致。加密密鑰稱為“私鑰”,解密密鑰稱為“公鑰”。

采用RS256非對稱加密生成的Token(https://jwt.io/)

生成私鑰和公鑰
mac電腦直接使用終端
windows電腦安裝git,使用git bash終端。
- 輸入openssl
- 輸入
genrsa -out private.key 2048生成私鑰 - 輸入
rsa -in private.key -pubout -out public.key生成公鑰
代碼中加密使用的算法需要修改為RS256非對稱加密算法(注意:RS256最小密鑰大小為2048位)
nodejs中實現(xiàn)JWT(token非對稱加密)
const Koa = require('koa')
const KoaRouter = require('@koa/router')
const jwt = require('jsonwebtoken');
const fs = require('fs')
const app = new Koa();
const loginRouter = new KoaRouter({ prefix: '/login' })
const usersRouter = new KoaRouter({ prefix: '/users' })
const privateKey = fs.readFileSync('./keys/private.key')
const publicKey = fs.readFileSync('./keys/public.key')
// login接口
loginRouter.post('/', (ctx, next) => {
const payload = { id: 1, name: 'zjc' }
const token = jwt.sign(payload, privateKey, {
expiresIn: 3000,
algorithm: 'RS256'
})
ctx.body = {
message: '登錄成功',
code: 200,
token
}
})
// users接口
usersRouter.get('/', (ctx, next) => {
const token = ctx.header.authorization.replace('Bearer ', '')
console.log(token);
try {
// 驗證token
jwt.verify(token, publicKey)
ctx.body = {
code: 200,
data: ['xx', 'yy']
}
} catch (error) {
ctx.body = {
code: -1001,
message: 'token無效'
}
}
})
app.use(loginRouter.routes())
app.use(usersRouter.routes())
app.listen(8000, () => {
console.log('服務(wù)器啟動成功');
})
到此這篇關(guān)于詳解JWT與Token的應(yīng)用與原理的文章就介紹到這了,更多相關(guān)JWT與Token應(yīng)用與原理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
node.js回調(diào)函數(shù)之阻塞調(diào)用與非阻塞調(diào)用
本文重點給大家介紹node.js回調(diào)函數(shù)之阻塞調(diào)用和非阻塞調(diào)用,涉及到node.js回調(diào)函數(shù)的相關(guān)知識,對本文感興趣的朋友一起學(xué)習(xí)吧2015-11-11
詳解NodeJs項目 CentOs linux服務(wù)器線上部署
這篇文章主要介紹了NodeJs項目 CentOs linux服務(wù)器線上部署,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-09-09
node.js中stream流中可讀流和可寫流的實現(xiàn)與使用方法實例分析
這篇文章主要介紹了node.js中stream流中可讀流和可寫流的實現(xiàn)與使用方法,結(jié)合實例形式分析了node.js stream流可讀流和可寫流基本分類、原理、定義、使用方法及相關(guān)注意事項,需要的朋友可以參考下2020-02-02
解決下載了nodejs但npm?-v沒有反應(yīng)問題的全過程
最近工作中遇到了個問題,node安裝成功,但npm無法使用,所以下面這篇文章主要給大家介紹了關(guān)于下載了nodejs但npm?-v沒有反應(yīng)問題解決的相關(guān)資料,需要的朋友可以參考下2022-08-08
Nodejs使用archiver-zip-encrypted庫加密壓縮文件時報錯(解決方案)
這篇文章主要介紹了Nodejs使用archiver-zip-encrypted庫加密壓縮文件時報錯,朋友朋友在測試過程中都出現(xiàn)過異常,下面小編把問題過程分析腳本之家平臺,需要的朋友可以參考下2019-11-11
Node.js五大應(yīng)用性能技巧小結(jié)(必須收藏)
本篇文章主要介紹了Node.js五大應(yīng)用性能技巧小結(jié)(必須收藏),小編覺得挺不錯的,現(xiàn)在分享給大家2017-08-08
Linux使用Node.js建立訪問靜態(tài)網(wǎng)頁的服務(wù)實例詳解
這篇文章主要介紹了Linux使用Node.js建立訪問靜態(tài)網(wǎng)頁的服務(wù)實例詳解的相關(guān)資料,需要的朋友可以參考下2017-03-03

