平时在有道云上做笔记,直接发到这里格式全乱了,有空整理,大家也可查看有道云链接:http://note.youdao.com/noteshare?id=89555d3b2cd4535a4221e0bfb0e14f60&sub=067B991951B34CE2AA9652B93889306C
用户登录流程:
- 点击登录按钮(自行验证),将用户名编码密码加密后发送到后台接口
this.$axios.post('users/signin',{ username:encodeURIComponent(this.username), password:cryptoJs.MD5(this.password).toString() }).then()
- 接口配置
import Passport from './utils/passport'
- 后台取出请求值后,返回一个passport鉴权验证方法,其具体验证策略的配置放在后面说。这个方法内通过判断err和user的的状态确认是否通过验证,通过后执行ctx.login(user)把登录信息写入session。
// 导入配置的策略 import Passport from './utils/passport' …… // 这里的return很重要,忘了写的话接口就不能返回任何东西 // 第1个参数是函数,其参数中的err是错误信息,验证通过时为null, // 第2个参数user在验证通过时返回被查询到的对象,而验证不通过时为false, // 第3个参数info是passport策略配置中done()的第三个参数,为自定义的信息 // 第4个参数暂不清楚 return Passport.authenticate('local',(err,user,info,status)=>{ console.log('authenticate:',err,user,info,status) if(err){ ctx.body={ code:-1, msg:err } }else{ if(user){ ctx.body={ code:0, msg:'登陆成功!' } // 这里写入session的参数user,对应passport策略配置中序列化和及反序列化函数的第一个参数。 return ctx.login(user) }else{ ctx.body={ code:1, msg:info } } } })(ctx,next)
- 必须在系统中(index.js)使用passport
import passport from './interface/utils/passport' …… // 在start之前调用这两行 app.use(passport.initialize()) app.use(passport.session())
- 登录成功后,前台跳转到首页,否则显示错误信息。
.then(({status,data})=>{ if(status===200){ if(data&&data.code===0){ location.href='/' }else{ this.error = data.msg } } })
passport策略配置
参考koa-passport学习笔记:https://www.jianshu.com/p/622561ec7be2
// 进行用户权鉴
import passport from 'koa-passport'
// 使用本地策略,其他策略还有github登录,微信登录等等
import LocalStrategy from 'passport-local'
import UserModel from '../../dbs/models/user'
// 定义登录策略的使用逻辑
passport.use(new LocalStrategy(async (username,password,done)=>{
const where = {username};
const result = await UserModel.findOne(where);
// console.log('result',result)
if(result){
if(result.password === password){
done(null,result)
}else{
done(null,false,'密码不正确')
}
}else{
done(null,false,'用户名不存在')
}
}))
// 序列化函数:在ctx.login(user)时调用,其参数会传给serializeUser作为第一个参数,
// 并在session中添加用户登录状态
passport.serializeUser((user,done) => {
done(null,user)
})
// 反序列化函数,自动解析用户请求中session中的信息,
// 第一个参数就是serializeUser存入session的数据,
// 如果在登录状态,则把这条数据添加在ctx.state.user中。
passport.deserializeUser((user,done)=>{
return done(null,user)
})
export default passport;