Rumah  >  Artikel  >  hujung hadapan web  >  Mari kita lihat penggunaan jwt dalam nod dari empat aspek

Mari kita lihat penggunaan jwt dalam nod dari empat aspek

青灯夜游
青灯夜游ke hadapan
2022-01-10 19:19:182111semak imbas

Bagaimana untuk menggunakan jwt dalam

nodejs? Artikel berikut akan memperkenalkan anda kepada penggunaan jwt dari empat aspek Saya harap ia akan membantu anda!

Mari kita lihat penggunaan jwt dalam nod dari empat aspek

Pengenalan: Memandangkan http adalah tanpa status, maklumat identiti pengguna tidak disimpan dan direkodkan semasa proses permintaan dan respons, jadi terdapat banyak pengguna Kenal pasti kaedah menyimpan identiti pengguna, seperti kuki, sesi, jwt. Perkhidmatan antara muka yang saya buat baru-baru ini menggunakan jwt untuk menyimpan dan mengurus maklumat pengguna Berbanding dengan storan kuki tempatan dan storan sesi sisi pelayan, jwt telah menjadi lebih selamat, lebih menjimatkan dan mudah digunakan > Mari kita buat ringkasan ringkas tentang cara menggunakannya.

Direktori

pengenalan jwt
  • Konfigurasi pemasangan
  • Kaedah pembungkusan
  • Latihan praktikal
  • Artikel ini memperkenalkan penggunaan jwt dari empat aspek di atas.

Pengenalan kepada jwt

Konsep

JWT

Nama penuh ialah JSON Web Token, yang merupakan standard terbukaRFC 7519 , mentakrifkan cara yang padat dan serba lengkap untuk memindahkan maklumat antara pihak dengan selamat sebagai objek JSON. JWT boleh ditandatangani menggunakan kunci rahsia atau pasangan kunci awam/peribadi menggunakan RSA atau ECDSA, dan tandatangan boleh disahkan.

Komponen

Token tandatangan jwt secara amnya terdiri daripada tiga bahagian iaitu Header (maklumat header), Payload (loader), Tandatangan (signature), contohnya

.

xxxxx.yyyyy.zzzzz

header
  • secara amnya menyimpan jenis token dan algoritma tandatangan, seperti:

{
  "alg": "HS256",
  "typ": "JWT"
}
Payload
  • Secara amnya, penyata storan, iaitu maklumat pengguna dan data lampiran, dibahagikan kepada penyata pendaftaran, penyata awam dan penyata persendirian.

Contohnya:

{
  "sub": "1234567890",
  "name": "John Doe",
  "admin": true
}
Tandatangan
  • Gunakan algoritma tandatangan untuk menandatangani Pengepala dan Muatan

Sebagai contoh:

Kemudian token bertanda jwt standard akan kelihatan seperti ini
HMACSHA256(
  base64UrlEncode(header) + "." +
  base64UrlEncode(payload),
  secret)
.

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c

Senario aplikasi

Akses dibenarkan pengguna
  • Sebagai contoh, selepas pengguna log masuk, pelayan mengeluarkan token jwt kepada pelanggan Setiap kali pengguna meminta data, token ini dibawa dalam pengepala permintaan Data boleh diperolehi selepas bahagian pelayan telah lulus pengesahan Kaedah ini mempunyai overhed yang sangat sedikit, tidak memerlukan penyimpanan di bahagian pelayan, dan juga boleh digunakan merentas domain.

Pertukaran maklumat
  • Simpan maklumat yang disulitkan antara pihak untuk mengesahkan sama ada kandungan tandatangan telah diusik.

Keselamatan

Memandangkan token boleh dibongkar, pengepala dan muatan di dalam boleh dihuraikan dan dilihat, jadi cuba jangan menyimpan beberapa maklumat peribadi dalam muatan .

Pemasangan dan konfigurasi

Mari gunakan jwt dalam nod untuk melakukan operasi.

Dalam laman web npm, terdapat banyak pakej jwt, anda boleh pilih mana yang anda rasa sesuai.

Cari 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                |
Pasang jwt

Saya secara peribadi berpendapat

jsonwebtoken

ini sangat bagus , artikel ini menggunakan pakej ini.

npm i jsonwebtoken
Penggunaan biasa

Tandatangan
Sintaks tandatangan

:. jwt.sign(payload, secretOrPrivateKey, [options, callback]) Contohnya:

// 一般签名
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
Pengesahan
Sintaks pengesahan

: jwt.verify(token, secretOrPublicKey, [options, callback]) Untuk contoh:

// 一般验证
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
});
Menyahkod
Menyahkod sintaks

: jwt.decode(token [, options])Contohnya:

var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.payload);
Kaedah pembungkusan

Mengikut kaedah dalam konfigurasi pemasangan, anda boleh melakukan pembungkusan sekunder mengikut keperluan anda sendiri, yang lebih sesuai untuk anda.

Perkenalkan pakej pergantungan dan konfigurasi
const jwt = require("jsonwebtoken");
const config = {
    secret: '2021123456**',
    time: 60 * 60,
}
Tandatangan
function create (data, time) {
  let token = jwt.sign(data, config.secret, {
    algorithm: "HS256",
    expiresIn: time || config.time,
  })
  return token;
}
Sahkan
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,
      }
    }
  })
}
Penyahkodan
di atas adalah kaedah yang agak mudah. konfigurasi yang diterangkan di atas.
function decoded (token, complete = true) {
  return jwt.decode(token, {
    complete,
  });
}

Amalan praktikal

Selepas kaedah enkapsulasi di atas, anda boleh mengamalkannya secara praktikal untuk melihat sama ada ia berkesan.

  • 新建一个文件夹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 教程!!

Atas ialah kandungan terperinci Mari kita lihat penggunaan jwt dalam nod dari empat aspek. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:juejin.cn. Jika ada pelanggaran, sila hubungi admin@php.cn Padam