解析jsonwebtoken(jwt)在nodejs中的使用。

栏目: Node.js · 发布时间: 6年前

内容简介:这里要用到三个插件, 加上前端一共是至少4个插件passport //token解析主插件 相当于各种passport策略的容器passport-jwt // 密钥解析规则(策略)插件, 有密钥解析

这里要用到三个插件, 加上前端一共是至少4个插件

>>>>>>后端应用:
jsonwebtoken //生成token字符串

passport //token解析主插件

passport-jwt // 密钥解析规则插件, 有密钥解析
------------------------------------------------------------

>>>>>> 给前端使用的
jwt-decode   //无密钥解析, secretOrKey 是存储在环境变量中的,因此在前端必须使用无密钥解析。

复制代码

使用jsonwebtoken进行加密 和 使用jwt无密钥解析

// jwt加密的使用:
const jwt = require('jsonwebtoken');
// 无密钥解析插件
const jwt_decode = require('jwt-decode');

//设置一个密钥
const secretOrKey = "hello world";
//待生成token的对象
const rules = { id: '0001', name: 'liyuanzhe', job: 'developer' };

// -----> 这里使用promise 方便大家分开查看这两个插件的执行

new Promise((resolve, require) => {

    // jwt.sign是异步执行操作 
    // 使用jsonwebtoken创建字符串
    // 参数 (需要加密的内容, 密钥字符串, token属性, 回调函数)
    jwt.sign(rules, secretOrKey, { expiresIn: 3600 }, (err, token) => {
        if (err) throw err;
        
        token = "Bearer " + token /*根据插件作者的要求, 这里一定要写 Bearer空格*/
        
        console.log(token);
        // 打印生成的token字符串
        //Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjAwMDEiLCJuYW1lIjoibGl5dWFuemhlI    iwiam9iIjoiZGV2ZWxvcGVyIiwiaWF0IjoxNTU3Mzk3ODYwLCJleHAiOjE1NTc0MDE0NjB9.fT4eKuvAbvH66QM    frSHEm1UmeHPedYOWYIr3rNwAPg8
        
        // res.send(token) 实际开发发送给前端
        
        resolve(token);
        
    });
    
}).then((token) => {

    
    //shiyong jwt-decode 对token 进行无密钥解析 
    console.log(jwt_decode(token));
    //输出结果:
    // { id: '0001', name: 'liyuanzhe', job: 'developer', 
    //   iat: 1557397860, exp: 1557401460 }
    // iat : 生效时间
    // exp :过期时间
    
    //前端拿到这个字符串后应当进行解析, 然后进行localstorage,sessionStorage存储,
    //发送网络请求时,再把token字符串再发给后端,
    
    
})
复制代码

后端对发送给前端的token进行有密钥解析

passport //token解析主插件 相当于各种passport策略的容器

passport-jwt // 密钥解析规则(策略)插件, 有密钥解析

接下来以这个为例:

// /*
// passport有策略(strategy)的概念. strategy是少量预约义的方法,
// 它们会在请求抵达真正的路由之前执行.假如你定义的strategy认定某个请求非法,
// 则该路由不会被执行, 而是返回401 Unauthorized.
// */

const express = require('express');
const server = express();

//使用body解析中间件
const bodyParser = require('body-parser');
server.use(bodyParser.urlencoded({ extended: false }));
server.use(bodyParser.json());
server.listen(8080);

const router = express.Router(); //引入路由 ,之后发起网络请求做判断

//引入passport插件
const passport = require('passport');

//对passpor进行初始化
server.use(passport.initialize());

// jwt策略函数
const JwtStrategy = require('passport-jwt').Strategy;

//  抽取jwt函数
const ExtractJwt = require('passport-jwt').ExtractJwt;

//设置策略选项 1. 密钥 2.抽取token的方法
let opts = {
    // 存入环境变量的混淆密钥
    secretOrKey: "hello world",
    // 定义从请求头的Authrization抽取token数据
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()
}

// 构造 策略对象
var jwtConfig = new JwtStrategy(opts, (jwt_payload, next) => {
    // jwt_payload 解析好的 token字符串,
    // 和 jwt-decode 解析的一样, 但是这个会进行密钥的判断
    // 如果密钥匹配失败, 直接结束返回401状态码
    console.log(jwt_payload)

    //这个在实战开发中会有和数据库中id查找
    // DB_User.findById(jwt_payload.id){
        // .then(user => {
            // return done(null, user)
        // }).catch(err => {
            // console.log(err)
        // })
    // }

    //为了测试我们就无脑下一步了
    next(null, jwt_payload) 

});

// 应用在passport中
passport.use(jwtConfig);



// passport.authenticate("加密算法策略", 验证条件,回调)
router.get('/testJWT', passport.authenticate("jwt", { session: false }), (req, res) => {
    res.json({ ok: 1 })
})
server.use('/test', router);
复制代码

测试:

数据:

{ id: '0001', name: 'liyuanzhe', job: 'developer'}

前端生成token :

Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJpZCI6IjAwMDEiLCJuYW1lIjoibGl5dWFuemhlIiwiam9iIjoiZGV2ZWxvcGVyIiwiaWF0IjoxNTU3NDA0NzE1LCJleHAiOjE1NTc0MDgzMTV9.jqwwdAH4qKFCX7t0xHJ0YXiprNmlSpM0sDc8PwoWSbc

使用jwt-decode 解析token:

{ id: '0001', name: 'liyuanzhe', job: 'developer', iat: 1557404715, exp: 1557408315 }

使用postman测试

输入有效的token:

解析jsonwebtoken(jwt)在nodejs中的使用。

输入过期的token:

解析jsonwebtoken(jwt)在nodejs中的使用。

总结:

server passport passport-jwt 三者之间的关系

三层嵌套use

// 创建解析规则部分

server.use ( 

    passport.use(
    
        new passport-jwt.Strategy(
            
            //策略选项
            {secretOrKey: "hello world",jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken()},
            
            //回调函数
            (jwt_payload, next)=>{
                
                next(null, jwt_payload)
                
            }
            
        
        )
        
    )

)

// ------> 使用部分
// passport.authenticate("jwt", 验证条件,回调)

router.get('/testJWT', passport.authenticate("jwt", { session: false }), (req, res) => {
    res.json({ ok: 1 })
})

server.use('/test', router);
复制代码

写博客也是一种学习方式,分享学习成果是一种快乐。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

An Introduction to the Analysis of Algorithms

An Introduction to the Analysis of Algorithms

Robert Sedgewick、Philippe Flajolet / Addison-Wesley Professional / 1995-12-10 / CAD 67.99

This book is a thorough overview of the primary techniques and models used in the mathematical analysis of algorithms. The first half of the book draws upon classical mathematical material from discre......一起来看看 《An Introduction to the Analysis of Algorithms》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

MD5 加密
MD5 加密

MD5 加密工具

RGB HSV 转换
RGB HSV 转换

RGB HSV 互转工具