一、koa+passport+mongoose的初應用配置
- 在
koa
創建的工程項目中,通過 npm i mongoose koa-passport passport-local
命令下載對應的工具
- 創建
users.js
文件,引入 mongoose
,Schema
是用於定義一些數據表操作,而module
是與表操作的相關行爲,model
關聯 Schema
,對外暴露 UserSchema
模型,代碼如下所示:
import mongoose from 'mongoose'
const Schema = mongoose.Schema
const UserSchema = new Schema({
username: {
type: String,
unique: true,
require: true
},
password: {
type: String,
require: true
},
email: {
type: String,
require: true
}
})
export default mongoose.model('User', UserSchema)
- 創建
passport.js
文件,引入 koa-passport
、passport-local
和 users
,代碼如下所示:
import passport from 'koa-passport'
import LocalStrategy from 'passport-local'
import UserModel from '../../dbs/models/users'
Passport
是Node.js
的Express
兼容身份驗證中間件,Passport
的唯一目的是對請求進行身份驗證,它通過一組稱爲策略的可擴展插件來完成。我們向Passport
提供身份驗證請求,而Passport
提供鉤子來控制身份驗證成功或失敗時發生的情況。Passport
使用策略的概念來驗證請求。策略的範圍包括驗證用戶名和密碼憑據,使用OAuth
委託的身份驗證或使用OpenID
的聯合身份驗證。在passport
中使用 LocalStrateg
進行身份驗證,根據用戶名進行查找。查詢結果不爲空,當密碼相等時驗證通過,否則驗證失敗,查詢結果爲空時也提示用戶不存在,代碼如下所示:
passport.use(new LocalStrategy(async function (username, password, done) {
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, '用戶不存在')
}
}))
Passport
將維持持久的登錄會話。爲了使持久會話正常工作,必須將經過身份驗證的用戶序列化到該會話,並在發出後續請求時將其反序列化。所以只需序列化用戶ID
,然後在反序列化時按ID
查找用戶,存 session
。通過passport.serializeUser
進行序列化,通過passport.deserializeUser
進行反序列化,最後對外暴露,代碼如下所示:
passport.serializeUser(function (user, done) {
done(null, user)
})
passport.deserializeUser(function (user, done) {
return done(null, user)
})
export default passport