jwt在node中的應(yīng)用實(shí)踐(安裝配置封裝)
導(dǎo)語(yǔ)
由于http是無狀態(tài)的,請(qǐng)求響應(yīng)過程中不存儲(chǔ)記錄用戶身份信息,所以就出現(xiàn)了很多用戶識(shí)別存儲(chǔ)用戶身份的方法,比如cookie,session,jwt。我最近做的一個(gè)接口服務(wù)使用了jwt來存儲(chǔ)管理用戶信息,相較于本地cookie存儲(chǔ),服務(wù)器端session存儲(chǔ),jwt就變得比較安全和節(jié)省方便,本文就jwt在node服務(wù)中的使用方法做一個(gè)簡(jiǎn)單的總結(jié)。
jwt簡(jiǎn)介
概念
JWT全稱JSON Web Token,它是一種開放標(biāo)準(zhǔn)RFC 7519,定義了一種緊湊且自包含的方式,用于在各方之間作為JSON對(duì)象安全地傳輸信息。JWT可以使用密鑰或使用RSA或ECDSA的公鑰/私鑰對(duì)進(jìn)行簽名,可以對(duì)簽名進(jìn)行驗(yàn)證。
組成部分
jwt簽名令牌一般由三部分組成,分別是Header(頭部信息),Payload(載荷),Signature(簽名),例如xxxxx.yyyyy.zzzzz
。
- header
一般是存儲(chǔ)令牌的類型和簽名算法,比如:
{ "alg": "HS256", "typ": "JWT" }
- Payload
一般是存儲(chǔ)聲明,也就是用戶信息和附件數(shù)據(jù),分為注冊(cè)聲明、公共聲明和私人聲明。
比如:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
- 簽名
利用簽名算法對(duì)Header和Payload進(jìn)行簽名
比如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
那么一個(gè)標(biāo)準(zhǔn)的jwt簽名令牌會(huì)是這樣的
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c。
應(yīng)用場(chǎng)景
- 用戶授權(quán)訪問
比如用戶登錄后,服務(wù)端下發(fā)一個(gè)jwt令牌給客戶端,每次用戶請(qǐng)求數(shù)據(jù)都在請(qǐng)求頭里面攜帶此令牌,服務(wù)端驗(yàn)證通過后可以獲取到數(shù)據(jù),這種方式開銷很小,并不需要服務(wù)端進(jìn)行存儲(chǔ),而且還可以跨域使用。
- 信息交換
在各方之間存儲(chǔ)加密信息,驗(yàn)證簽名內(nèi)容是否篡改。
安全性
由于令牌可以被拆解,里面的header和Payload可以被解析看到,所以盡量不要在Payload里面存儲(chǔ)一些私密的信息。
安裝配置
下面就在node中使用jwt做一下操作。
在npm網(wǎng)站,有很多的jwt包,你可以選擇你認(rèn)為合適的。
搜索jwt
NAME | DESCRIPTION | AUTHOR | DATE | VERSION | KEYWORDS jwt | JSON Web Token for… | =mattrobenolt | 2012-05-05 | 0.2.0 | express-jwt | JWT authentication… | =woloski… | 2021-08-11 | 6.1.0 | auth authn authentication authz authorization http jwt token oauth express jsonwebtoken | JSON Web Token… | =dschenkelman… | 2019-03-18 | 8.5.1 | jwt jwt-decode | Decode JWT tokens,… | =jeff.shuman… | 2020-11-16 | 3.1.2 | jwt browser passport-jwt | Passport… | =themikenichol… | 2018-03-13 | 4.0.0 | Passport Strategy JSON Web Token JWT koa-jwt | Koa middleware for… | =stiang… | 2021-09-24 | 4.0.3 | auth authn authentication authz authorization http jwt json middleware token oauth permissions koa jsrsasign | opensource free… | =kjur | 2021-12-01 | 10.5.1 | crypto cryptography Cipher RSA ECDSA DSA RSAPSS PKCS#1 PKCS#5 PKCS#8 private key public key CSR PKCS#10 hash function HMac ASN.1 certexpress-jwt-permissions | Express middleware… | =angryunicorn… | 2021-08-18 | 1.3.6 | express middleware JWT permissions authorization token security njwt | JWT Library for… | =robertjd | 2021-12-03 | 1.2.0 | jwt fastify-jwt | JWT utils for… | =starptech… | 2021-12-03 | 4.1.0 | jwt json token jsonwebtoken fastify did-jwt | Library for Signing… | =simonas-notcat… | 2021-12-03 | 5.12.1 | hapi-auth-jwt2 | Hapi.js… | =nelsonic | 2020-09-08 | 10.2.0 | Hapi.js Authentication Auth JSON Web Tokens JWT auth0-lock | Auth0 Lock | =jeff.shuman… | 2021-11-02 | 11.31.1 | auth0 auth openid authentication passwordless browser jwt jwks-rsa | Library to retrieve… | =jeff.shuman… | 2021-10-15 | 2.0.5 | jwks rsa jwt restify-jwt-community | JWT authentication… | =frbuceta | 2021-12-05 | 1.1.21 | auth authentication authorization http jwt token oauth restify did-jwt-vc | Create and verify… | =simonas-notcat… | 2021-11-23 | 2.1.8 | jwt-service | A simple wrapper… | =nfroidure | 2021-11-01 | 8.0.0 | jwt knifecycle angular-jwt | Library to help you… | =jeff.shuman… | 2019-03-20 | 0.1.11 | @thream/socketio-jwt | Authenticate… | =divlo | 2021-07-23 | 2.1.1 | socket socket.io jwt appstore-connect-jwt-gene | [人覺得這個(gè)jsonwebtoken很不錯(cuò),本文就使用這個(gè)包。
npm i jsonwebtoken
常見用法
- 簽名
簽名語(yǔ)法:
jwt.sign(payload, secretOrPrivateKey, [options, callback])。
例如:
// 一般簽名 var jwt = require('jsonwebtoken'); var token = jwt.sign({ foo: 'bar' }, 'secret'); // 加私鑰簽名 var privateKey = fs.readFileSync('private.key'); var token = jwt.sign({ foo: 'bar' }, privateKey, { algorithm: 'RS256'}); // 設(shè)置過期時(shí)間 jwt.sign({ data: 'bar' }, 'secret', { expiresIn: 60 * 60 }); // 1h
- 驗(yàn)證
驗(yàn)證語(yǔ)法:
jwt.verify(token, secretOrPublicKey, [options, callback])
例如:
// 一般驗(yàn)證 var decoded = jwt.verify(token, 'secret'); console.log(decoded.foo) // bar // 公鑰驗(yàn)證 var cert = fs.readFileSync('public.pem'); jwt.verify(token, cert, function(err, decoded) { console.log(decoded.foo) // bar });
- 解碼
解碼語(yǔ)法:
jwt.decode(token [, options])
例如:
var decoded = jwt.decode(token, {complete: true}); console.log(decoded.header); console.log(decoded.payload);
封裝方法
根據(jù)安裝配置里面的方法,可以根據(jù)自己的需要進(jìn)行二次封裝,更加適合自己的方法。
- 引入依賴包和配置
const jwt = require("jsonwebtoken"); const config = { secret: '2021123456**', time: 60 * 60, }
- 簽名
function create (data, time) { let token = jwt.sign(data, config.secret, { algorithm: "HS256", expiresIn: time || config.time, }) return token; }
- 驗(yàn)證
function verify (token) { return jwt.verify(token, config.secret, function (err, decoded) { if (err) { return { code: 1, msg: 'invalid', data: null, } } else { return { code: 2, msg: 'valid', data: decoded, } } }) }
- 解碼
function decoded (token, complete = true) { return jwt.decode(token, { complete, }); }
上面是比較簡(jiǎn)單的方法,如果你還想使用公鑰私鑰,可以用上面安裝配置里面介紹的那樣。
實(shí)戰(zhàn)練習(xí)
經(jīng)過上面的封裝方法,可以來實(shí)戰(zhàn)演練一下,是否有效。
- 新建一個(gè)文件夾
test
,新建一個(gè)文件index.js
用于存放測(cè)試案例,jwt.js
用于存儲(chǔ)調(diào)用方法。
mkdir test cd test npm init -y npm i jsonwebtoken
- jwt方法
// jwt.js const jwt = require('jsonwebtoken'); const config = { secret: '2021123456', // 密鑰 time: 60*60, // 過期時(shí)間 } // 創(chuàng)建簽名令牌 function create (data, time) { let token = jwt.sign(data, config.secret, { algorithm: 'HS256', expiresIn: time || config.time, }); return token; } // 驗(yàn)證令牌 function verify (token) { return jwt.verify(token, config.secret, function (err, decoded) { if (err) { return { code: 1, msg: 'invalid', data: null, } } else { return { code: 2, msg: 'valid', data: decoded, } } }) } // 解碼令牌 function decoded (token, complete = true) { return jwt.decode(token, { complete, }); } const token = { create, verify, decoded, } module.exports = token;
- 創(chuàng)建token,驗(yàn)證token,解碼token
// index.js const jwt = require('./jwt'); // 生成令牌 let token = jwt.create({'id': 1, 'name': 'mark'}, 60*60*2); console.log(token); /* eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9. eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30. 20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8 */ // 驗(yàn)證令牌 let verifyRes = jwt.verify(token); console.log(verifyRes); /* { code: 2, msg: 'valid', data: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 } } */ // 解碼令牌 let deRes = jwt.decoded(token, true); console.log(deRes); /* { header: { alg: 'HS256', typ: 'JWT' }, payload: { id: 1, name: 'mark', iat: 1639106273, exp: 1639113473 }, signature: '20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8' } */
運(yùn)行一下命令node index.js
測(cè)試是否正確。
好了,以上就是jwt在node中的一些應(yīng)用和實(shí)踐方法!
更多關(guān)于jwt在node中的應(yīng)用與實(shí)踐的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
express結(jié)合nodejs開啟服務(wù)示例模版
這篇文章主要為大家展現(xiàn)了express結(jié)合nodejs開啟服務(wù)的代碼示例模版,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步早日升職加薪2022-04-04解決node-webkit 不支持html5播放mp4視頻的方法
本文給大家分享的是解決node-webkit 不支持html5播放mp4視頻的方法,其原因大概是因?yàn)閚ode-webkit沒有購(gòu)買mp4格式的專利授權(quán),恩,我們來想個(gè)辦法來解決這個(gè)事情吧。2015-03-03node.js 開發(fā)指南 – Node.js 連接 MySQL 并進(jìn)行數(shù)據(jù)庫(kù)操作
通常在NodeJS開發(fā)中我們經(jīng)常涉及到操作數(shù)據(jù)庫(kù),尤其是 MySQL ,作為應(yīng)用最為廣泛的開源數(shù)據(jù)庫(kù)則成為我們的首選,本篇就來介紹下如何通過NodeJS來操作 MySQL 數(shù)據(jù)庫(kù)。2014-07-07electron demo項(xiàng)目npm install安裝失敗的解決方法
下面小編就為大家分享一篇electron demo項(xiàng)目npm install安裝失敗的解決方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2018-02-02NodeJs實(shí)現(xiàn)簡(jiǎn)易WEB上傳下載服務(wù)器
這篇文章主要為大家詳細(xì)介紹了NodeJs實(shí)現(xiàn)一個(gè)簡(jiǎn)易WEB上傳下載服務(wù)器,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-08-08利用forever和pm2部署node.js項(xiàng)目過程
這篇文章主要給大家介紹了如何利用forever和pm2部署node.js項(xiàng)目的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼供大家參考學(xué)習(xí),相信對(duì)大家的學(xué)習(xí)或者工作具有一定的學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編一起來看看吧。2017-05-05npm?install報(bào)錯(cuò)unable?to?resolve?dependency?tree的解決辦法
在開發(fā)過程中經(jīng)常會(huì)使用npm安裝依賴包來加速開發(fā),但是在執(zhí)行npm install命令時(shí),有時(shí)會(huì)遇到各種錯(cuò)誤,下面這篇文章主要給大家介紹了關(guān)于npm?install報(bào)錯(cuò)unable?to?resolve?dependency?tree的解決辦法,需要的朋友可以參考下2023-05-05