token的生成与验证

写在前面,最近在写自己毕业的东西。由于采用的是前后端分离的写法。为了方便写使用的是跨域的模式。所以cookie、session就不好用了。所以记录一下token吧。夜太深了,就简单写一下用法吧(官方文档写的很全了)

使用场景:用户成功登陆之后,返回客户端相应数据的同时。生成token一并返回

1. 生成

安装第三方模块:npm install jsonwebtoken
导入的话就不用说了吧。

其实最主要的就是用到了jwt的sign方法。
sign(“规则”,“加密的名字(这个可随便)”,回调。(其中回调参数中的token即生成的))

代码如下:在验证密码正确之后。生成token,便返回到客户端

// @route  POST /admin
// @desc   返回的请求的json数据
// @access public
admin.post('/', async(req, res) => {
    // 预处理一下
    const { username, password } = req.body;
    console.log(req.body);


    if (username.trim() == '' || password.trim() == '') {
        res.send("输入的用户名或密码不能为空");

    }
    // 验证用户信息
    let user = await User.findOne({ username });
    if (user) {
        if (password == user.password) {
            // 创建jwt规则
            const rule = {
                id: user.id,
                name: user.name
            }
            jwt.sign(rule, "secret", { expiresIn: 3600 }, (err, token) => {
                if (err) throw err;

                res.json({
                    msg: 'success',
                    token: 'Bearer ' + token
                });

            });
            // res.json({ msg: "success" })
        } else {
            res.status(400).json({ msg: "用户名或密码错误" })
        }


    } else {

        res.status(400).send({ "msg": "用户名或密码错误" })
    }
});

查看该接口返回结果:
在这里插入图片描述

2. 验证

验证要用到俩个模块。
安装命令:1 npm install passport-jwt 2 npm install passport

  • passport需要对所有链接做处理,故先要在node的入门文件我的为app.js文件中导入并做如下处理。
    app.use(passport.initialize());
  • 新建passport.js(需在app.js导入)
  • 先来看一眼官方文档
    在这里插入图片描述
    passport.js仿照便可以了
    我的代码:
const JwtStrategy = require('passport-jwt').Strategy,
    ExtractJwt = require('passport-jwt').ExtractJwt;
const { User } = require('../model/adminUser');
const opts = {}
opts.jwtFromRequest = ExtractJwt.fromAuthHeaderAsBearerToken();

opts.secretOrKey = 'secret';
//向外暴露一个方法
module.exports = passport => {
    passport.use(new JwtStrategy(opts, async(jwt_payload, done) => {
        const user = await User.findById(jwt_payload.id);
        if (user) {
            return done(null, user);
        }else{
            return done(null,false);
        }
    }));
};

3. 写一个只有用token才能访问的接口测试一下吧

// @route  POST /admin/demo
// @desc   get
// @access priate

admin.get('/demo', passport.authenticate("jwt", { session: false }), (req, res) => {
    res.json({
        id: req.user.id,
        name: req.user.username
    });
});

验证接口
不拿token访问时:
在这里插入图片描述
拿了token时:
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值