安装express-jwt
npm install express-jwt --save
npm install jsonwebtoken --save
配置jwt (app.js)
var expressJwt = require("express-jwt");
// jwt中间件
app.use(expressJwt({
credentialsRequired: false,//关键
secret: "yousecret"//加密密钥,可换
}).unless({
path: ["/api/login","/api/addUser","/api/test"]//添加不需要token验证的路由
}));
生成token
const jwt = require('jsonwebtoken')
//api/v1/login
app.post('/login', function (req, res) {
User.findOne({userName:req.body.username,password:req.body.password}).then(result => {
if(result){
// 注意默认情况 Token 必须以 Bearer+空格 开头
const token = 'Bearer ' + jwt.sign(
{
_id: user._id,
admin: user.role === 'admin'
},
'secret12345',
{
expiresIn: 3600 * 24 * 3
//or
//expiresIn: "10 days"
}
)
res.json({
status: 'ok',
token: token
})
} else {
res.json({
code: 250,
msg: '用户名或密码不正确'
})
};
})
}
vue前端路由守卫限制
// JWT 用户权限校验,判断 TOKEN 是否在 localStorage 当中
router.beforeEach(({name}, from, next) => {
// 获取 JWT Token
if (localStorage.getItem('token')) {
// 如果用户在login页面
if (name === 'login') {
next('/');
} else {
next();
}
} else {
router.push('/login')
}
});
vue组件内headers携带token方法 (一)
var that=this;
//获取课程列表
this.axios({
method:'get',
url:'http://localhost:3000/api/v1/courses',
headers:{
authorization:'Bearer '+window.localStorage.getItem('token')
}
}).then(result=>{
if(result.data.length>0){
that.courses=result.data;
}
})
vue组件内headers携带token方法 (二)设置axios拦截器
每次向后端请求携带 头信息
在 src/main.js 当中加上以下代码:
// http request 拦截器可选
axios.interceptors.request.use(
config => {
if (localStorage.token) { // 判断是否存在token,如果存在的话,则每个http header都加上token
config.headers.Authorization = `Bearer ${localStorage.token}`;
}
return config;
},
err => {
return Promise.reject(err);
});
axios.interceptors.response.use(
response => {
return response;
},
error => {
if (error.response.status === 401) {
//输出授权失败错误信息
} else {
//输出其他错误信息
}
return Promise.reject(error);
}
);