jwt在node中的应用实践(安装配置封装)

 更新时间:2023年09月06日 09:42:35   作者:MarkGuan  
这篇文章主要为大家介绍了jwt在node中的应用实践包括安装配置封装,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

导语

由于http是无状态的,请求响应过程中不存储记录用户身份信息,所以就出现了很多用户识别存储用户身份的方法,比如cookie,session,jwt。我最近做的一个接口服务使用了jwt来存储管理用户信息,相较于本地cookie存储,服务器端session存储,jwt就变得比较安全和节省方便,本文就jwt在node服务中的使用方法做一个简单的总结。

jwt简介

概念

JWT全称JSON Web Token,它是一种开放标准RFC 7519,定义了一种紧凑且自包含的方式,用于在各方之间作为JSON对象安全地传输信息。JWT可以使用密钥或使用RSA或ECDSA的公钥/私钥对进行签名,可以对签名进行验证。

组成部分

jwt签名令牌一般由三部分组成,分别是Header(头部信息),Payload(载荷),Signature(签名),例如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])

例如:

var decoded = jwt.decode(token, {complete: true});
console.log(decoded.header);
console.log(decoded.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;
}
  • 验证
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,
  });
}

上面是比较简单的方法,如果你还想使用公钥私钥,可以用上面安装配置里面介绍的那样。

实战练习

经过上面的封装方法,可以来实战演练一下,是否有效。

  • 新建一个文件夹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中的一些应用和实践方法!

更多关于jwt在node中的应用与实践的资料请关注脚本之家其它相关文章!

相关文章

  • node+axios实现下载外网文件到本地

    node+axios实现下载外网文件到本地

    这篇文章主要为大家介绍了node+axios实现下载外网文件到本地示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-06-06
  • node.js中优雅的使用Socket.IO模块的方法

    node.js中优雅的使用Socket.IO模块的方法

    Socket.IO是一个WebSocket库,包括了客户端的js和服务器端的node.js,它的目标是构建可以在不同浏览器和移动设备上使用的实时应用,这篇文章主要介绍了node.js中优雅的使用Socket.IO模块,需要的朋友可以参考下
    2022-12-12
  • Nodejs全栈框架StrongLoop推荐

    Nodejs全栈框架StrongLoop推荐

    StrongLoop基本提供了制作一个移动产品所有的框架和工具,从标准的Backend server,Devops,应用监控,。要想介绍完全StrongLoop的所有产品得写一个长篇连载了,这里只简单的浏览一遍。
    2014-11-11
  • 手把手教你更优雅的修改node_modules里的代码

    手把手教你更优雅的修改node_modules里的代码

    这篇文章主要给大家介绍了关于如何更优雅的修改node_modules里的代码的相关资料,文中通过实例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2023-02-02
  • 深入解析koa之异步回调处理

    深入解析koa之异步回调处理

    这篇文章主要介绍了深入解析koa之异步回调处理,我们研究一下koa当中异步回调同步化写法的原理,同样的,我们也会实现一个管理函数,是的我们能够通过同步化的写法来写异步回调函数。,需要的朋友可以参考下
    2019-06-06
  • nodejs检测因特网是否断开的解决方案

    nodejs检测因特网是否断开的解决方案

    这篇文章主要给大家介绍了关于nodejs如何检测因特网是否断开的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用nodejs具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04
  • node.js中的fs.readdir方法使用说明

    node.js中的fs.readdir方法使用说明

    这篇文章主要介绍了node.js中的fs.readdir方法使用说明,本文介绍了fs.readdir方法说明、语法、接收参数、使用实例和实现源码,需要的朋友可以参考下
    2014-12-12
  • 使用nodejs搭建一个简易HTTP服务的实现示例

    使用nodejs搭建一个简易HTTP服务的实现示例

    本文主要介绍了使用nodejs搭建一个简易HTTP服务的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-05-05
  • 详解Node.js amqplib 连接 Rabbit MQ最佳实践

    详解Node.js amqplib 连接 Rabbit MQ最佳实践

    这篇文章主要介绍了详解Node.js amqplib 连接 Rabbit MQ最佳实践,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2019-01-01
  • Nginx设置为Node.js的前端服务器方法总结

    Nginx设置为Node.js的前端服务器方法总结

    在本篇文章中小编给大家分享了关于Nginx设置为Node.js的前端服务器的方法和实例,需要的朋友们学习下。
    2019-03-03

最新评论