1.什么是JWT以及JWT流程
2.后端实现
router.post('/login',async (ctx)=>{
try {
const {userName,userPwd} = ctx.request.body;
//返回指定字段有三种方式
//1.userId userName userEmail state role deptId roleList
//2.{'userId'}:1 1返回
//3. findOne().select('userId')
//先在数据库上找这个用户有没有
const res = await User.findOne({
userName,
userPwd
},'userId userName userEmail state role deptId roleList')
const data = res._doc;
//jwt 注册 数据 密钥 过期时间
const token = jwt.sign({
data
},'imooc',{expiresIn:'1h'})
if(res){
//返回token
data.token = token;
ctx.body = util.success(data,"登录成功")
}else{
ctx.body = util.fail("账号或密码不正确")
}
} catch (error) {
ctx.body = util.fail(error.msg)
}
})
// logger
app.use(async (ctx, next) => {
log4js.info(`get params:${JSON.stringify(ctx.request.query)}`)
log4js.info(`post params:${JSON.stringify(ctx.request.body)}`)
//在logger中 捕获jwt的异常 jwt是下一个中间件 等待jwt的结果
await next().catch((err)=>{
if(err.status == '401'){
ctx.status = 200;
ctx.body = util.fail('Token认证失败,请重新登录',util.CODE.AUTH_ERROR)
}else{
throw err;
}
})
})
//jwt校验 请求过来就会校验 unless是排除哪些接口
app.use(koaJwt({secret:'imooc'}).unless({
path:[/^\/api\/users\/login/]
}))
login(){
this.logining = true;
this.$refs.userForm.validate((valid)=>{
if(valid){
this.$api.login(this.user).then((res)=>{
this.logining =false;
//前端登录 保存返回的信息
this.$store.commit('saveUserInfo',res)
this.$router.replace('/welcome')
})
}else{
return false;
}
})
}
发送请求时在请求头加上token