Maison > interface Web > js tutoriel > Examinons l'utilisation de jwt dans le nœud sous quatre aspects

Examinons l'utilisation de jwt dans le nœud sous quatre aspects

青灯夜游
Libérer: 2022-01-10 19:19:59
avant
2151 Les gens l'ont consulté

Comment utiliser jwt dans

nodejs ? L'article suivant vous présentera l'utilisation de jwt sous quatre aspects. J'espère qu'il vous sera utile !

Examinons l'utilisation de jwt dans le nœud sous quatre aspects

Introduction : Étant donné que http est sans état, les informations d'identité de l'utilisateur ne sont pas stockées et enregistrées pendant le processus de réponse à la demande. Il existe donc de nombreuses méthodes d'identification de l'utilisateur et de stockage de l'identité de l'utilisateur, telles que les cookies, les sessions et jwt. Un service d'interface que j'ai récemment créé utilise jwt pour stocker et gérer les informations des utilisateurs. Par rapport au stockage local des cookies et au stockage de session côté serveur, jwt est devenu plus sûr, plus économique et plus pratique. Cet article explique comment utiliser jwt dans le service node. .Faites un bref résumé.

Table des matières

  • Introduction à jwt
  • Installation et configuration
  • Méthode d'emballage
  • Exercices pratiques

Cet article présente l'utilisation de jwt à partir des quatre aspects ci-dessus.

Introduction à jwt

Concept

JWTnom complet JSON Web Token, il s'agit d'une norme ouverte RFC 7519 qui définit une manière compacte et autonome de communiquer sous forme de JSON entre les parties. Les objets transmettent des informations en toute sécurité. Un JWT peut être signé à l'aide d'une clé secrète ou d'une paire de clés publique/privée utilisant RSA ou ECDSA, et la signature peut être vérifiée.

Composants

Le jeton de signature jwt se compose généralement de trois parties, à savoir l'en-tête (informations d'en-tête), la charge utile (charge) et la signature (signature), telles que xxxxx.yyyyy.zzzzz . xxxxx.yyyyy.zzzzz

  • header

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

{
  "alg": "HS256",
  "typ": "JWT"
}
Copier après la connexion
  • Payload

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

比如:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
Copier après la connexion
  • 签名

利用签名算法对Header和Payload进行签名

比如:

HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
Copier après la connexion

那么一个标准的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                |
Copier après la connexion

安装jwt

我个人觉得这个jsonwebtoken很不错,本文就使用这个包。

npm i jsonwebtoken
Copier après la connexion

常见用法

  • 签名

签名语法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
Copier après la connexion
  • 验证

验证语法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
});
Copier après la connexion
  • 解码

解码语法jwt.decode(token [, options])

header

stocke généralement le type et l'algorithme de signature du jeton, tels que :
var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload);
Copier après la connexion

Payload

  • stocke généralement les déclarations, c'est-à-dire les informations utilisateur et les données de pièce jointe, qui sont divisées en déclarations d'enregistrement, publiques déclarations et déclaration privée.
Par exemple :
    const jwt = require("jsonwebtoken");
    const config = {
        secret: '2021123456**',
        time: 60 * 60,
    }
    Copier après la connexion
  • Signature
  • Utilisez l'algorithme de signature pour signer l'en-tête et la charge utile
Par exemple :
    function create (data, time) {
      let token = jwt.sign(data, config.secret, {
        algorithm: "HS256",
        expiresIn: time || config.time,
      })
      return token;
    }
    Copier après la connexion
  • Ensuite, un jeton de signature jwt standard ressemblera à ceci : eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVC J9.eyJz dWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c .
Scénario d'application

Accès autorisé de l'utilisateur

Par exemple, une fois l'utilisateur connecté, le serveur émet un jeton jwt au client, et chaque fois que l'utilisateur demande des données, l'en-tête de la requête porte ce jeton et les données peuvent être obtenues après vérification par le côté serveur. Cette méthode a très peu de surcharge, ne nécessite pas de stockage côté serveur et peut être utilisée sur plusieurs domaines.

🎜🎜Échange d'informations🎜🎜🎜 Stockez les informations cryptées entre les parties et vérifiez si le contenu de la signature a été falsifié. 🎜

🎜Sécurité🎜🎜🎜Étant donné que le jeton peut être démonté, l'en-tête et la charge utile à l'intérieur peuvent être analysés et vus, alors essayez de ne pas stocker d'informations privées dans la charge utile. 🎜

Installation et configuration🎜🎜 Utilisons jwt dans le nœud pour effectuer l'opération. 🎜🎜Sur le site npm, il existe de nombreux packages jwt, vous pouvez choisir celui qui vous semble approprié. 🎜

🎜Recherchez 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,
      }
    }
  })
}
Copier après la connexion

🎜Installez jwt🎜🎜🎜Personnellement, je pense que ceci jsonwebtoken🎜 est très bien, cet article utilisera ce package. 🎜
function decoded (token, complete = true) {
  return jwt.decode(token, {
    complete,
  });
}
Copier après la connexion

🎜Utilisation courante🎜🎜🎜🎜Signature🎜🎜🎜🎜Syntaxe de la signature🎜 : jwt.sign(payload, secretOrPrivateKey, [options, callback])</code >. 🎜🎜Par exemple : 🎜<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">Copier après la connexion</div></div><div class="contentsignin">Copier après la connexion</div></div>🎜🎜Verification🎜🎜🎜🎜Syntaxe de vérification🎜 : <code>jwt.verify(token, secretOrPublicKey, [options, callback])🎜🎜Par exemple : 🎜
// jwt.js
const jwt = require(&#39;jsonwebtoken&#39;);
const config = {
    secret: &#39;2021123456&#39;, // 密钥
    time: 60*60, // 过期时间
}

// 创建签名令牌
function create (data, time) {
    let token = jwt.sign(data, config.secret, {
        algorithm: &#39;HS256&#39;,
        expiresIn: time || config.time,
    });
    return token;
}

// 验证令牌
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,
        }
      }
    })
}

// 解码令牌
function decoded (token, complete = true) {
    return jwt.decode(token, {
      complete,
    });
}

const token = {
    create,
    verify,
    decoded,
}

module.exports = token;
Copier après la connexion
Copier après la connexion
🎜🎜Decode🎜 🎜🎜 🎜Syntaxe de décodage🎜 : jwt.decode(token [, options])🎜🎜Par exemple : 🎜
// index.js
const jwt = require(&#39;./jwt&#39;);

// 生成令牌
let token = jwt.create({&#39;id&#39;: 1, &#39;name&#39;: &#39;mark&#39;}, 60*60*2);
console.log(token); 

/*
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.
20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8
*/

// 验证令牌
let verifyRes = jwt.verify(token);
console.log(verifyRes); 

/* 
{
    code: 2,
    msg: &#39;valid&#39;,
    data: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 }
}
*/

// 解码令牌
let deRes = jwt.decoded(token, true);
console.log(deRes);

/*
{
  header: { alg: &#39;HS256&#39;, typ: &#39;JWT&#39; },
  payload: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 },
  signature: &#39;20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8&#39;
}
*/
Copier après la connexion
Copier après la connexion
🎜🎜Méthode d'encapsulation🎜🎜🎜Selon la méthode dans la configuration d'installation, vous pouvez effectuer deux fois selon vos propres besoins. Encapsulation, une méthode plus adaptée pour vous. 🎜🎜🎜Présentation des packages et des configurations de dépendances🎜🎜rrreee🎜🎜Signature🎜🎜rrreee🎜🎜Vérification🎜🎜rrreee🎜🎜Décodage🎜🎜rrreee🎜Ce qui précède est une méthode relativement simple si vous souhaitez également utiliser la clé publique. et clé privée , vous pouvez utiliser ce qui précède Comme décrit dans la configuration d'installation. 🎜🎜🎜Pratique pratique🎜🎜🎜Après la méthode d'emballage ci-dessus, vous pouvez la mettre en pratique pour voir si elle est efficace. 🎜
  • 新建一个文件夹test,新建一个文件index.js用于存放测试案例,jwt.js用于存储调用方法。
mkdir test
cd test
npm init -y
npm i jsonwebtoken
Copier après la connexion
Copier après la connexion
  • jwt方法
// jwt.js
const jwt = require(&#39;jsonwebtoken&#39;);
const config = {
    secret: &#39;2021123456&#39;, // 密钥
    time: 60*60, // 过期时间
}

// 创建签名令牌
function create (data, time) {
    let token = jwt.sign(data, config.secret, {
        algorithm: &#39;HS256&#39;,
        expiresIn: time || config.time,
    });
    return token;
}

// 验证令牌
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,
        }
      }
    })
}

// 解码令牌
function decoded (token, complete = true) {
    return jwt.decode(token, {
      complete,
    });
}

const token = {
    create,
    verify,
    decoded,
}

module.exports = token;
Copier après la connexion
Copier après la connexion
  • 创建token,验证token,解码token
// index.js
const jwt = require(&#39;./jwt&#39;);

// 生成令牌
let token = jwt.create({&#39;id&#39;: 1, &#39;name&#39;: &#39;mark&#39;}, 60*60*2);
console.log(token); 

/*
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.
eyJpZCI6MSwibmFtZSI6Im1hcmsiLCJpYXQiOjE2MzkxMDYyNzMsImV4cCI6MTYzOTExMzQ3M30.
20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8
*/

// 验证令牌
let verifyRes = jwt.verify(token);
console.log(verifyRes); 

/* 
{
    code: 2,
    msg: &#39;valid&#39;,
    data: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 }
}
*/

// 解码令牌
let deRes = jwt.decoded(token, true);
console.log(deRes);

/*
{
  header: { alg: &#39;HS256&#39;, typ: &#39;JWT&#39; },
  payload: { id: 1, name: &#39;mark&#39;, iat: 1639106273, exp: 1639113473 },
  signature: &#39;20O1r0NVMf-j-9RwNcgls9ja0n1rGqSKN51_cRcvpE8&#39;
}
*/
Copier après la connexion
Copier après la connexion

运行一下命令node index.js测试是否正确。

好了,以上就是jwt在node中的一些应用和实践方法!

更多node相关知识,请访问:nodejs 教程!!

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Étiquettes associées:
source:juejin.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal