本文小編為大家詳細(xì)介紹“jwt在node中怎么使用”,內(nèi)容詳細(xì),步驟清晰,細(xì)節(jié)處理妥當(dāng),希望這篇“jwt在node中怎么使用”文章能幫助大家解決疑惑,下面跟著小編的思路慢慢深入,一起來(lái)學(xué)習(xí)新知識(shí)吧。
在海淀等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站建設(shè) 網(wǎng)站設(shè)計(jì)制作按需策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),成都全網(wǎng)營(yíng)銷(xiāo)推廣,外貿(mào)網(wǎng)站建設(shè),海淀網(wǎng)站建設(shè)費(fèi)用合理。

導(dǎo)語(yǔ):由于http是無(wú)狀態(tài)的,請(qǐng)求響應(yīng)過(guò)程中不存儲(chǔ)記錄用戶(hù)身份信息,所以就出現(xiàn)了很多用戶(hù)識(shí)別存儲(chǔ)用戶(hù)身份的方法,比如cookie,session,jwt。我最近做的一個(gè)接口服務(wù)使用了jwt來(lái)存儲(chǔ)管理用戶(hù)信息,相較于本地cookie存儲(chǔ),服務(wù)器端session存儲(chǔ),jwt就變得比較安全和節(jié)省方便,本文就jwt在node服務(wù)中的使用方法做一個(gè)簡(jiǎn)單的總結(jié)。
JWT全稱(chēng)JSON Web Token,它是一種開(kāi)放標(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ǔ)令牌的類(lèi)型和簽名算法,比如:
{
"alg": "HS256",
"typ": "JWT"
}Payload
一般是存儲(chǔ)聲明,也就是用戶(hù)信息和附件數(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。
用戶(hù)授權(quán)訪(fǎng)問(wèn)
比如用戶(hù)登錄后,服務(wù)端下發(fā)一個(gè)jwt令牌給客戶(hù)端,每次用戶(hù)請(qǐng)求數(shù)據(jù)都在請(qǐng)求頭里面攜帶此令牌,服務(wù)端驗(yàn)證通過(guò)后可以獲取到數(shù)據(jù),這種方式開(kāi)銷(xiāo)很小,并不需要服務(wù)端進(jìn)行存儲(chǔ),而且還可以跨域使用。
信息交換
在各方之間存儲(chǔ)加密信息,驗(yàn)證簽名內(nèi)容是否篡改。
由于令牌可以被拆解,里面的header和Payload可以被解析看到,所以盡量不要在Payload里面存儲(chǔ)一些私密的信息。
下面就在node中使用jwt做一下操作。
在npm網(wǎng)站,有很多的jwt包,你可以選擇你認(rèn)為合適的。
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 | [人覺(jué)得這個(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è)置過(guò)期時(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)行二次封裝,更加適合自己的方法。
引入依賴(lài)包和配置
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)單的方法,如果你還想使用公鑰私鑰,可以用上面安裝配置里面介紹的那樣。
經(jīng)過(guò)上面的封裝方法,可以來(lái)實(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, // 過(guò)期時(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中怎么使用”文章已經(jīng)介紹完畢,想要掌握這篇文章的知識(shí)點(diǎn)還需要大家自己動(dòng)手實(shí)踐使用過(guò)才能領(lǐng)會(huì),如果想了解更多相關(guān)內(nèi)容的文章,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道。
網(wǎng)站標(biāo)題:jwt在node中怎么使用
標(biāo)題網(wǎng)址:http://www.yijiale78.com/article4/ihddoe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供外貿(mào)建站、營(yíng)銷(xiāo)型網(wǎng)站建設(shè)、標(biāo)簽優(yōu)化、品牌網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)公司、外貿(mào)網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)