• 技术文章 >web前端 >js教程

    从四个方面来看看 jwt 在node中的使用

    青灯夜游青灯夜游2022-01-10 19:19:59转载90
    nodejs中要怎么使用jwt?下面本篇文章就来给大家从四个方面介绍一下jwt的使用,希望对大家有所帮助!

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

    目录

    本文从以上四个方面介绍jwt的使用。

    jwt简介

    概念

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

    组成部分

    jwt签名令牌一般由三部分组成,分别是Header(头部信息),Payload(载荷),Signature(签名),例如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包,你可以选择你认为合适的。

    搜索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,
      });
    }

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

    实战练习

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

    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 教程!!

    以上就是从四个方面来看看 jwt 在node中的使用的详细内容,更多请关注php中文网其它相关文章!

    声明:本文转载于:掘金社区,如有侵犯,请联系admin@php.cn删除
    专题推荐:node jwt
    上一篇:浅析Angular中的可观察对象、观察者和RxJS操作符 下一篇:探索一下Node中的堆内存分配,聊聊内存限制!

    相关文章推荐

    • 命令行如何查看nodejs目录• 一文深入了解 Node 中的事件循环• 一文带你了解Node.js中的eventloop• 探索下浏览器和 Node.js 为什么会这样设计 EventLoop!• 聊聊一些Node.js 缓冲区(Buffer)模块的重要方法• 怎么利用Node.js进行html页面跳转• nodejs中async的用法是什么

    全部评论我要评论

  • 取消发布评论发送
  • 1/1

    PHP中文网