จากบทความที่แล้ว ได้แนะนำการเขียนสคริปต์ JavaScript เพื่อทำระบบ Authentication แบบพื้นฐาน ด้วยมอดูล Passport สำหรับในบทความนี้จะขอแนะนำการเขียนสคิปต์ทำระบบ Authentication ทำงานร่วมกับฐานข้อมูล Mongo โดยเราจะเก็บข้อมูลสมาชิกไว้ใน Collection users
ซึ่งขอยกตัวอย่างข้อมูล db.users.find()
{
_id:OjectId("5daa74efb50ece2f98643d35"),
username:"anakin",
password:"1234",
fname:"Anakin",
lname:"Skywalker"
}
{
_id:OjectId("5daa748b1a5fc22f98b6db32"),
username:"bhurisub",
password:"1234",
fname:"Bhurisub",
lname:"Dejpipatpracha"
}
เราจะนำเอาสคริปต์ในบทความที่ผ่านมาปรับปรุง โดยเริ่มจากติดตั้งมอดูลเพิ่มเติม
npm i mongodb
สคริปต์ views/home.ejs ปรับปรุงหน้าหลักสมาชิก
...
...
<div class="container">
<div class="row">
<h1>:: Home ::</h1>
</div>
<div class="row">
Login Ok.<br/><br/>
_id = <%=_id%> <br/>
Username = <%=username%> <br/>
Name = <%=fname%> <%=lname%> <br/><br/>
</div>
<div class="row">
<a href='./logout'>Logout</a>
</div>
</div>
...
...
สร้างสคริปต์ config.js สำหรับติดต่อฐานข้อมูล Mongo
const MongoClient = require('mongodb').MongoClient
const url = 'mongodb://localhost:27017'
const dbName = 'webphuket'
module.exports = new Promise((resolve, reject)=>{
MongoClient.connect(url, { useNewUrlParser: true,useUnifiedTopology: true },(err, client) => {
if (err) throw err
const mongo = client.db(dbName)
console.log("Connected successfully to server")
resolve(mongo)
})
})
สคริปต์ index.js (ปรับปรุง)
const express = require('express')
const app = express()
app.use(express.static(__dirname + '/public'))
app.set('view engine', 'ejs')
const MongoObjectID = require('mongodb').ObjectID
const mongo = require('./config')
const passport = require('passport')
const LocalStrategy = require('passport-local').Strategy
const bodyParser = require('body-parser')
const cookieParser = require('cookie-parser')
app.use(bodyParser.urlencoded({ extended: false }))
app.use(bodyParser.json())
app.use(cookieParser())
const session = require('express-session')
app.use(session({ secret: 'I am Anakin.', resave: true, saveUninitialized: true }))
app.use(passport.initialize())
app.use(passport.session())
passport.use(new LocalStrategy((username, password, done) => {
mongo.then((db) => {
query = { username : username }
db.collection('users').findOne(query,(err, user) => {
if (err) return done(err)
if (!user) {
console.log('Incorrect username.')
return done(null, false, { message: 'Incorrect username.' })
} else if (user.password == password ) {
console.log('Correct password.')
return done(null, user)
} else {
console.log('Incorrect password.')
return done(null, false, { message: 'Incorrect password.' })
}
})
})
}))
passport.serializeUser((user, done) => {
console.log('SerializeUser')
done(null, user._id)
})
passport.deserializeUser((id, done) => {
mongo.then((db) => {
query = { _id : new MongoObjectID.ObjectID(id) }
db.collection('users').findOne(query,(err, user) => {
if (err) return done(err)
console.log('DeserializeUser')
done(null, user)
})
})
})
app.get('/', (req, res) => {
res.render('login')
})
app.get('/login', (req, res) => {
res.render('login')
})
app.post('/login', passport.authenticate('local', {
successRedirect: '/home',
failureRedirect: '/'
}))
function isLoggedIn(req, res, next) {
if (req.isAuthenticated()) {
return next()
} else {
res.redirect('/')
}
}
app.get('/home',isLoggedIn,(req,res) => {
res.render('home',req.user)
})
app.get('/logout',(req,res) => {
req.logout()
res.redirect('/')
})
app.listen(3000, () => {
console.log('Server Started on localhost:3000...')
})
เรียกใช้ ObjectID เก็บไว้ในตัวแปร MongoObjectID และเรียกใช้การติดต่อฐานข้อมูล Mongo เก็บไว้ในตัวแปร mongo
const MongoObjectID = require('mongodb').ObjectID
const mongo = require('./config')
กำหนดการตรวจสอบสมาชิกในฐานข้อมูล Mongo เรียกแสดงข้อมูลใน collection ชื่อ users ที่ username ตามที่ผู้ใช้ป้อนมาจากฟอร์ม หากค้นหาข้อมูลได้แล้วก็จะเก็บไว้ใน user
จากนั้นตรวจสอบ user ว่ามีข้อมูลหรือไม่ หากไม่มีแสดงว่าผู้ใช้ป้อน Username ที่ไม่มีอยู่ใน Collection
และหากรหัสผ่านที่ดึงมาจาก collection ตรงกับรหัสผ่านที่ผู้ใช้ป้อน และหากไม่ถูกตอ้งก็แสดงว่า รหัสผ่านของ Username ดังกล่าวไม่ตรงกับที่อยู่ในฐานข้อมูล
passport.use(new LocalStrategy((username, password, done) => {
mongo.then((db) => {
query = { username : username }
db.collection('users').findOne(query,(err, user) => {
if (err) return done(err)
if (!user) {
console.log('Incorrect username.')
return done(null, false, { message: 'Incorrect username.' })
} else if (user.password == password ) {
console.log('Incorrect password.')
return done(null, user)
} else {
console.log('Incorrect password.')
return done(null, false, { message: 'Incorrect password.' })
}
})
})
}))
สำหรับในการเก็บข้อมูลใน Session เราจะเก็บเฉพาะ _id ของ Username เท่านั้น
passport.serializeUser((user, done) => {
console.log('SerializeUser')
done(null, user._id)
})
หลังจากนั้นนำ id ที่เก็บไว้ Seesion ไปใช้อ้างอิงเพื่อดึงข้อมูลสมาชิกใน collection users เก็บไว้ในตัวแปร user
passport.deserializeUser((id, done) => {
mongo.then((db) => {
query = { _id : new MongoObjectID.ObjectID(id) }
db.collection('users').findOne(query,(err, user) => {
if (err) return done(err)
console.log('DeserializeUser')
done(null, user)
})
})
})
ขอจบบทความนี้เพียงเท่านี้ ครับ ;)
Top comments (0)