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>. </li><h3 data-id="heading-4"></ul>Anwendungsszenario<p></p><h2 data-id="heading-11"><strong>Benutzerautorisierter Zugriff</strong></h2><p>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. </p>🎜🎜Informationsaustausch🎜🎜🎜 Speichern Sie verschlüsselte Informationen zwischen Parteien und überprüfen Sie, ob der Signaturinhalt manipuliert wurde. 🎜<h3 data-id="heading-5">🎜Sicherheit🎜🎜🎜Da das Token zerlegt werden kann, können der Header und die darin enthaltene Nutzlast analysiert und angezeigt werden. Versuchen Sie daher, keine privaten Informationen in der Nutzlast zu speichern. 🎜<h2 data-id="heading-6">Installation und Konfiguration🎜🎜 Lassen Sie uns jwt im Knoten verwenden, um den Vorgang auszuführen. 🎜🎜Auf der npm-Website gibt es viele JWT-Pakete. Sie können das Paket auswählen, das Ihrer Meinung nach geeignet ist. 🎜<h3 data-id="heading-7">🎜Suche jwt🎜🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function verify (token) {
return jwt.verify(token, config.secret, function (err, decoded) {
if (err) {
return {
code: 1,
msg: &#39;invalid&#39;,
data: null,
}
} else {
return {
code: 2,
msg: &#39;valid&#39;,
data: decoded,
}
}
})
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div><h3 data-id="heading-8">🎜Installiere jwt🎜🎜🎜Ich persönlich denke das <a href="https:// link.juejin.cn?target=https%3A%2F%2Fwww.npmjs.com%2Fpackage%2Fjsonwebtoken" target="_blank" rel="nofollow noopener noreferrer" title="https://www.npmjs.com/package /jsonwebtoken" ref="nofollow noopener noreferrer">jsonwebtoken🎜 ist sehr gut, dieser Artikel wird dieses Paket verwenden. 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">function decoded (token, complete = true) {
return jwt.decode(token, {
complete,
});
}</pre><div class="contentsignin">Nach dem Login kopieren</div></div><h3 data-id="heading-9">🎜Allgemeine Verwendung🎜🎜🎜🎜Signatur🎜🎜🎜🎜Signatursyntax🎜: <code>jwt.sign(payload, SecretOrPrivateKey, [options, callback])</code >. 🎜🎜Fuch Beispiel: 🎜<div class="code" style="position:relative; padding:0px; margin:0px;"><div class="code" style="position:relative; padding:0px; margin:0px;"><pre class="brush:js;toolbar:false;">mkdir test
cd test
npm init -y
npm i jsonwebtoken</pre><div class="contentsignin">Nach dem Login kopieren</div></div><div class="contentsignin">Nach dem Login kopieren</div></div>🎜🎜Verification🎜🎜🎜🎜Verifikation Syntax 🎜🎜 🎜Dekodierungssyntax🎜: <code>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;
// 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' } */
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!