nuxt全栈仿美团官网07——登录

平时在有道云上做笔记,直接发到这里格式全乱了,有空整理,大家也可查看有道云链接:http://note.youdao.com/noteshare?id=89555d3b2cd4535a4221e0bfb0e14f60&sub=067B991951B34CE2AA9652B93889306C

用户登录流程:

 

  1. 点击登录按钮(自行验证),将用户名编码密码加密后发送到后台接口

this.$axios.post('users/signin',{ username:encodeURIComponent(this.username), password:cryptoJs.MD5(this.password).toString() }).then()

  1. 接口配置

import Passport from './utils/passport'

  1. 后台取出请求值后,返回一个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)

  1. 必须在系统中(index.js)使用passport

import passport from './interface/utils/passport' …… // 在start之前调用这两行 app.use(passport.initialize()) app.use(passport.session())

  1. 登录成功后,前台跳转到首页,否则显示错误信息。

.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;

 

上一篇:单点登录 - API 认证系统 Passport(二)


下一篇:电商(10)