写在前面,最近在写自己毕业的东西。由于采用的是前后端分离的写法。为了方便写使用的是跨域的模式。所以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时: