token是后端给前端的一个二维码, 这个二维码通常是暗码, 前端拿着这个二维码到后端, 后端即可以经过这个二维码得知用户是否登陆过, 用户是谁等信息(具体什么信息,是后端在返回token时候设置的); 前端
nodejs里的插件: jsonwebtoken;使用方法:vue
app.post('/api/login', (req, res) =>{ const { userName,password} = req.body; login(userName, password,function(data){ if(data[0]){ bcrypt.compare(password, data[0].password).then(function(result) { if(result){ fs.readFile('./TOKEN/TOKEN_EV',(err,data)=>{ const serateKey = data.toString(); res.status(200).json({ userName, token: jwt.sign({ id: data[0].id}, serateKey) }) }) }else{ res.status(422).json({message:'密码不匹配'}) } }); }else{ res.status(422).json({message:'用户名不存在'}) } })
axios.interceptors.request.use( config => { if (localStorage.JWT_TOKEN) { // 判断是否存在token,若是存在的话,则每一个http header都加上token config.headers.Authorization = `token ${localStorage.JWT_TOKEN}`;//这个字符串里的token能够不写 } return config; }, err => { return Promise.reject(err); });
router.beforeEach(({name}, from, next) => { // 获取 JWT Token if (localStorage.getItem('JWT_TOKEN')) { // 若是用户在login页面 if (name === 'login') { next('/'); } else { next(); } } else { if (name === 'login') { next(); } else { next({name: 'login'}); } }
app.get('/api/profile', (req, res) => { //查看请求头信息 const token = req.headers.authorization.split(' ').pop(); //获取请求头的信息 fs.readFile('./TOKEN/TOKEN_EV', (err, result) => {//读取token的秘钥, 能够把这个秘钥文件存起来, 而后读取后引入,没必要每次都读取 if (!err) { jwt.verify(token, result, (err, decoded) => { const id = decoded.id; //这里根据id处理 Profile(id, (data) => {//这是业务层的东西, 读取数据库, 而后返回数据, 不用管 res.json(data[0]) }) }); } else { res.send(err) } }); })