Heim  >  Artikel  >  Web-Frontend  >  Schauen wir uns die Verwendung von JWT im Knoten unter vier Gesichtspunkten an

Schauen wir uns die Verwendung von JWT im Knoten unter vier Gesichtspunkten an

青灯夜游
青灯夜游nach vorne
2022-01-10 19:19:182093Durchsuche

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!

Schauen wir uns die Verwendung von JWT im Knoten unter vier Gesichtspunkten an

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.

Inhaltsverzeichnis

  • Einführung in jwt
  • Installation und Konfiguration
  • Verpackungsmethode
  • Praktische Übungen

Dieser Artikel stellt die Verwendung von jwt unter den oben genannten vier Aspekten vor.

Einführung in jwt

Konzept

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.

Komponenten

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

  • header

一般是存储令牌的类型和签名算法,比如:

{
  "alg": "HS256",
  "typ": "JWT"
}
  • Payload

一般是存储声明,也就是用户信息和附件数据,分为注册声明、公共声明和私人声明。

比如:

{
  "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包,你可以选择你认为合适的。

搜索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                |

安装jwt

我个人觉得这个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

speichert im Allgemeinen den Typ und den Signaturalgorithmus des Tokens, wie zum Beispiel:
var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload);

Payload

  • speichert im Allgemeinen Anweisungen, dh Benutzerinformationen und Anhangsdaten, die in öffentliche Registrierungsanweisungen unterteilt sind Aussagen und private Aussage.
Zum Beispiel:
    const jwt = require("jsonwebtoken");
    const config = {
        secret: '2021123456**',
        time: 60 * 60,
    }
  • Signatur
  • Verwenden Sie den Signaturalgorithmus, um den Header und die Nutzlast zu signieren
Zum Beispiel:
    function create (data, time) {
      let token = jwt.sign(data, config.secret, {
        algorithm: "HS256",
        expiresIn: time || config.time,
      })
      return token;
    }
  • Dann sieht ein Standard-JWT-Signaturtoken so aus. eyJhbGciOiJIUzI1NiIsInR5cCI 6IkpXVCJ9.eyJz dWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c code>.
Anwendungsszenario

Benutzerautorisierter Zugriff

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. 🎜

🎜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. 🎜

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. 🎜

🎜Suche jwt🎜🎜
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,
      }
    }
  })
}

🎜Installiere jwt🎜🎜🎜Ich persönlich denke das jsonwebtoken🎜 ist sehr gut, dieser Artikel wird dieses Paket verwenden. 🎜
function decoded (token, complete = true) {
  return jwt.decode(token, {
    complete,
  });
}

🎜Allgemeine Verwendung🎜🎜🎜🎜Signatur🎜🎜🎜🎜Signatursyntax🎜: 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方法
// 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;
  • 创建token,验证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
*/

// 验证令牌
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!

Stellungnahme:
Dieser Artikel ist reproduziert unter:juejin.cn. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen