Heim > Artikel > Web-Frontend > Schauen wir uns die Verwendung von JWT im Knoten unter vier Gesichtspunkten an
Wie verwende ich JWT in
nodejs? Der folgende Artikel wird Ihnen die Verwendung von jwt unter vier Gesichtspunkten vorstellen. Ich hoffe, er wird Ihnen hilfreich sein!
Einführung: Da http zustandslos ist, werden Benutzeridentitätsinformationen während des Anforderungsantwortprozesses nicht gespeichert und aufgezeichnet. Daher gibt es viele Methoden zur Benutzeridentifizierung und Speicherung der Benutzeridentität, z. B. Cookies, Sitzungen usw jwt. Ein kürzlich von mir erstellter Schnittstellendienst verwendet JWT zum Speichern und Verwalten von Benutzerinformationen. JWT ist sicherer, wirtschaftlicher und bequemer geworden. In diesem Artikel wird erläutert, wie JWT im node-Dienst verwendet wird . Machen Sie eine kurze Zusammenfassung.
Dieser Artikel stellt die Verwendung von jwt unter den oben genannten vier Aspekten vor.
JWTvollständiger Name JSON Web Token, es handelt sich um einen offenen Standard RFC 7519, der eine kompakte und eigenständige Art der Kommunikation als JSON zwischen Parteien definiert. Objekte übertragen Informationen sicher. Ein JWT kann mithilfe eines geheimen Schlüssels oder eines öffentlichen/privaten Schlüsselpaars mithilfe von RSA oder ECDSA signiert und die Signatur überprüft werden.
jwt-Signaturtoken besteht im Allgemeinen aus drei Teilen, nämlich Header (Header-Informationen), Payload (Laden) und Signatur (Signatur), wie zum Beispiel xxxxx.yyyyy.zzzzz
. xxxxx.yyyyy.zzzzz
。
一般是存储令牌的类型和签名算法,比如:
{ "alg": "HS256", "typ": "JWT" }
一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。
比如:
{ "sub": "1234567890", "name": "John Doe", "admin": true }
利用签名算法对Header和Payload进行签名
比如:
HMACSHA256( base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)
那么一个标准的jwt签名令牌会是这样的eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
。
比如用户登录后,服务端下发一个jwt令牌给客户端,每次用户请求数据都在请求头里面携带此令牌,服务端验证通过后可以获取到数据,这种方式开销很小,并不需要服务端进行存储,而且还可以跨域使用。
在各方之间存储加密信息,验证签名内容是否篡改。
由于令牌可以被拆解,里面的header和Payload可以被解析看到,所以尽量不要在Payload里面存储一些私密的信息。
下面就在node中使用jwt做一下操作。
在npm网站,有很多的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 | [![NPM](https://nod… | =poad | 2021-10-15 | 1.0.1 | jwt appstore rator-core |
我个人觉得这个jsonwebtoken很不错,本文就使用这个包。
npm i jsonwebtoken
签名语法: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'}); // 设置过期时间 jwt.sign({ data: 'bar' }, 'secret', { expiresIn: 60 * 60 }); // 1h
验证语法:jwt.verify(token, secretOrPublicKey, [options, callback])
例如:
// 一般验证 var decoded = jwt.verify(token, 'secret'); console.log(decoded.foo) // bar // 公钥验证 var cert = fs.readFileSync('public.pem'); jwt.verify(token, cert, function(err, decoded) { console.log(decoded.foo) // bar });
解码语法:jwt.decode(token [, options])
header
var decoded = jwt.decode(token, {complete: true}); console.log(decoded.header); console.log(decoded.payload);
Payload
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; }
eyJhbGciOiJIUzI1NiIsInR5cCI 6IkpXVCJ9.eyJz dWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c code>.
Zum Beispiel stellt der Server nach der Anmeldung des Benutzers ein JWT-Token an den Client aus, und zwar jedes Mal, wenn der Benutzer fordert Daten an. Der Anforderungsheader trägt dieses Token und die Daten können abgerufen werden, nachdem die Serverseite sie überprüft hat. Diese Methode hat einen sehr geringen Overhead, erfordert keinen Speicher auf der Serverseite und kann domänenübergreifend verwendet werden.
🎜🎜Informationsaustausch🎜🎜🎜 Speichern Sie verschlüsselte Informationen zwischen Parteien und überprüfen Sie, ob der Signaturinhalt manipuliert wurde. 🎜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, }); }
jwt.sign(payload, SecretOrPrivateKey, [options, callback])
. 🎜🎜Fuch Beispiel: 🎜mkdir test cd test npm init -y npm i jsonwebtoken🎜🎜Verification🎜🎜🎜🎜Verifikation Syntax 🎜🎜 🎜Dekodierungssyntax🎜:
jwt.decode(token [, Optionen])
🎜🎜Zum Beispiel: 🎜// jwt.js 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; } // 验证令牌 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;🎜🎜Kapselungsmethode🎜🎜🎜Entsprechend der Methode in der Installationskonfiguration können Sie ausführen Es ist je nach Bedarf zweimal erforderlich. Kapselung, eine Methode, die für Sie besser geeignet ist. 🎜🎜🎜Einführung von Abhängigkeitspaketen und -konfigurationen🎜🎜
// 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 */ // 验证令牌 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' } */🎜🎜Signatur🎜🎜rrreee🎜🎜Verifizierung🎜🎜rrreee🎜🎜Dekodierung🎜🎜rrreee🎜Das oben genannte ist eine relativ einfache Methode Verwenden Sie den öffentlichen Schlüssel und den privaten Schlüssel , Sie können die oben beschriebene Installationskonfiguration verwenden. 🎜🎜🎜Praktische Übung🎜🎜🎜Nach der oben genannten Verpackungsmethode können Sie sie in der Praxis üben, um zu sehen, ob sie wirksam ist. 🎜
test
,新建一个文件index.js
用于存放测试案例,jwt.js
用于存储调用方法。mkdir test cd test npm init -y npm i jsonwebtoken
// jwt.js 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; } // 验证令牌 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;
// 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 */ // 验证令牌 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' } */
运行一下命令node index.js
测试是否正确。
好了,以上就是jwt在node中的一些应用和实践方法!
更多node相关知识,请访问:nodejs 教程!!
Das obige ist der detaillierte Inhalt vonSchauen wir uns die Verwendung von JWT im Knoten unter vier Gesichtspunkten an. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!