一、安装
npm i koa-passport passport-local -s
二、注册策略
在passport.js里注册策略:
const passport = require('koa-passport')
const LocalStrategy = require('passport-local')
const UserModel = require('../../dbs/models/users')
passport.use(new LocalStrategy(async function (username, password, done) {
/**
* @param username 用户输入的用户名
* @param password 用户输入的密码
* @param done 验证验证完成后的回调函数,由passport调用
*/
let where = {
username
};
let result = await UserModel.findOne(where)
if (result != null) {
if (result.password === password) {
return done(null, result)
} else {
return done(null, false, '密码错误')
}
} else {
return done(null, false, '用户不存在')
}
}))
// serializeUser 在用户登录验证成功以后将会把用户的数据存储到 session 中
passport.serializeUser(function (user, done) {
done(null, user)
})
passport.deserializeUser(function (user, done) {
return done(null, user)
})
module.exports = passport;
三、挂载passport
在入口中挂载passport
import passport from './interface/utils/passport'
...
app.use(passport.initialize())
app.use(passport.session())
...
这时候passport策略配置完成。
四、调用策略
在定义登录接口的文件users.js里调用策略
import Router from'koa-router'
import Passport from'./utils/passport'
let router = new Router({
prefix: '/users'
})
//登录接口
router.post('/signin', async (ctx, next) => {
return Passport.authenticate('local', function(err, user, info, status) {
if (err) {
ctx.body = {
code: -1,
msg: err
}
} else {
if (user) {
console.log(user,1111)
ctx.body = {
code: 0,
msg: '登录成功',
user
}
return ctx.login(user)
} else {
ctx.body = {
code: 1,
msg: info
}
}
}
})(ctx, next)
})
//获取用户信息接口
router.get('/getUser', async (ctx) => {
if (ctx.isAuthenticated()) {
const {username, email} = ctx.session.passport.user
ctx.body={
user:username,
email
}
}else{
ctx.body={
user:'',
email:''
}
}
})
//退出接口
router.get('/exit', async (ctx, next) => {
await ctx.logout()
if (!ctx.isAuthenticated()) {
ctx.body = {
code: 0
}
} else {
ctx.body = {
code: -1
}
}
})
module.exports = router
passport.serializeUser函数定义序列化操作,调用ctx.login()会触发序列化操作
通过passport.deserializeUser函数定义反序列化操作,在session中如果存在passport:{user:'Susan'}会触发反序列化操作
通过passport.use(new LocalStrategy('local', ...)) 注册策略,调用passport.authenticate('local',...)调用策略
app.use(passport.initialize()) 会在ctx挂载以下方法
ctx.state.user 认证用户
ctx.login(user) 登录用户
ctx.logout() 用户退出登录
ctx.isAuthenticated() 判断是否认证