koa2, the koa-passport,koa-session, is used to verify whether or not to log in to the specified page. By default, the user information is saved in session when logging in, and the user information is deleted. If you do not log in, jump to the login page.
passport.js
const passport = require("koa-passport")
// const mongoose = require("mongoose")
// const User = mongoose.model("User")
const User = require("../models/user")
const log4js = require("koa-log4")
const logger = log4js.getLogger("passport")
const LocalStrategy = require("passport-local").Strategy
const md5 = require("md5")
passport.use(new LocalStrategy(
/**
* @param username
* @param password
* @param done passport
*/
function (username, password, done) {
User.findOne({username: username},function (err,result) {
if (result !== null) {
if (result.password === md5(password)) {
return done(null, doPassword(result),"")
} else {
return done(null, false, "")
}
} else {
return done(null, false, "")
}
}).catch(function (err) {
logger.error(err.message)
return done(null, false, {message: err.message})
})
}
))
// serializeUser session
passport.serializeUser(function (user, done) {
done(null, user)
})
// deserializeUser mongodb
passport.deserializeUser(function (id, done) {
console.log(id)
User.findById(id, function (err, user) {
done(err, doPassword(user))
})
// done(null, user)
})
//,session
function doPassword(user) {
if(user) {
user.password = ""
return user
} else {
return null
}
}
module.exports = passport
app.js:
const config = require("./config/config")
const Koa = require("koa")
const app = new Koa()
const views = require("koa-views")
const json = require("koa-json")
const onerror = require("koa-onerror")
const bodyparser = require("koa-bodyparser")
const log4js = require("koa-log4")
const logger = log4js.getLogger("app")
const favicon = require("koa-favicon")
const session = require("koa-session")
// const passport = require("koa-passport")
const passport = require("./config/passport")
const CSRF = require("koa-csrf")
require("./config/db")
/**
* js
* @type {[type]}
*/
const fs = require("fs")
const path = require("path")
const models_path = path.join(__dirname, "/models")
/**
* modelsjsrequire
* @param {[type]} modelPath [description]
* @return {[type]} [description]
*/
var walk = function(modelPath) {
fs
.readdirSync(modelPath)
.forEach(function(file) {
var filePath = path.join(modelPath, "/" + file)
var stat = fs.statSync(filePath)
if (stat.isFile()) {
if (/(.*)\.(js|coffee)/.test(file)) {
require(filePath)
}
}
else if (stat.isDirectory()) {
walk(filePath)
}
})
}
walk(models_path)
// error handler
onerror(app)
// middlewares
app.use(bodyparser({
enableTypes: ["json", "form", "text"]
}))
app.use(json())
// app.use(logger())
// app.use(log4js.koaLogger(log4js.getLogger("http"), {level: "auto",format:":method :url"}))
app.use(favicon(config.root + "/public/favicon.ico"))
app.use(require("koa-static")(config.root + "/public"))
app.use(views(config.root + "/views", {
extension: "pug"
}))
// Sessions
app.keys = ["project management system"]
const CONFIG = {
key: "SESSIONID",
}
app.use(session(CONFIG, app))
//
/*app.use(ctx => {
// ignore favicon
if (ctx.path === "/favicon.ico") return
let n = ctx.session.views || 0;
ctx.session.views = PPn
ctx.body = n + " views"
})*/
// passport
app.use(passport.initialize())
app.use(passport.session())
// page utils
app.use(async (ctx, next) => {
ctx.state.page = {page: 1, size: 20}
if (ctx.request.query.page !== undefined) {
ctx.state.page.page = Number(ctx.request.query.page)
}
if (ctx.request.query.size !== undefined) {
ctx.state.page.size = Number(ctx.request.query.size)
}
logger.debug(ctx.state.page)
await next()
})
// add the CSRF middleware
app.use(new CSRF({
invalidSessionSecretMessage: "Invalid session secret",
invalidSessionSecretStatusCode: 403,
invalidTokenMessage: "Invalid CSRF token",
invalidTokenStatusCode: 403,
excludedMethods: [ "GET", "HEAD", "OPTIONS", "POST"],
disableQuery: false
}))
// logger
app.use(async (ctx, next) => {
const start = new Date()
await next()
const ms = new Date() - start
logger.debug(`${ctx.method} ${ctx.url} - ${ms}ms`)
})
// routes
const router = require("./config/router")()
app
.use(router.routes())
.use(router.allowedMethods())
// error-handling
app.on("error", (err, ctx) => {
logger.error("server error", err, ctx)
})
module.exports = app