|
app.use(cookieSession({ |
|
name: 'session', |
|
keys: ['key1', 'key2'], |
|
maxAge: 3 * 24 * 60 * 60 * 1000 // 3day |
|
})) |
ลองเปลี่ยนจาก keys ไปใช้ secret แทนก็ได้ครับ และก็ไม่ควร Commit ขึ้นมา ควรเก็บไว้เป็นความลับ ศึกษาเรื่องการใช้ .env และวิธีการทำให้ไม่สนใจการเปลี่ยนแปลงไฟล์นี้จากการเติมลงไฟล์ .gitignore ครับ อ้างอิงจาก https://expressjs.com/en/resources/middleware/cookie-session.html#secret
นอกจากนี้แล้วควรตั้งค่า sameSite secure httpOnly เข้าไปด้วย โดย sameSite ช่วยป้องกันละเมิด Cookie จากเว็บภายนอก ส่วนของ secure ใช้ตอนเราทำ https และ httpOnly ควรเปิดเพื่อป้องกันไม่ให้ JavaScript เข้าถึง ให้เข้าถึงข้อมูล Cookie ผ่าน Http เท่านั้น
และอันที่จริงผมแนะนำศึกษา https://expressjs.com/en/resources/middleware/session.html และใช้แทนตัว cookie-session มันดีตรงที่มี rolling ช่วยให้ต่ออายุ User ไม่อย่างงั้นนึกภาพดู ครบ 3 วันพอดี User จะหลุดจากการใช้งาน ถ้าเขาใช้วันที่ 3 พอดี จู่ๆเขาจะ Logout เองครับเพราะเราไม่ได้ต่ออายุ หรือมีโค้ดต่ออายุแล้วผมก็ไม่แน่ใจนะ
|
user_.getAccountData(auth_token.id).then(result=>{ |
|
if(result!=='error - account not found!'){ |
|
res.status(400).render('home',{account: auth_token,data: result}); |
|
}else{ |
|
req.session = null; |
|
res.redirect('/'); |
|
} |
|
}); |
แนะนำให้ใช้ Async/Await แทนนะครับ ลองศึกษาที่ https://javascript.info/async-await
สรุปโดยรวมอีก เห็นใช้ Firestore อย่าลืมศึกษา https://firebase.google.com/docs/firestore/security/get-started เรื่องนี้ถ้าเราพลาด อย่างเปิดให้ allow read; allow write; ทั้งคู่ละก็ ใครๆก็จะเข้ามาดัดแปลงข้อมูลเราได้ตลอด ดังนั้นการจะใช้ Firestore ในการบันทึกข้อมูล อาจจะผิด Concept ไปพอสมควร เพราะเราต้องมาดูว่า Firebase คือ BaaS เป็นการให้บริการ Backend ที่เราไม่ต้องมีโค้ด Express.js แบบนี้ครับ สิ่งที่เรากำลังทำจะกลายเป็นเพิ่มงาน เพราะบริการ Firebase เน้นเรียบง่าย และใส่ Logic ลงใน Frontend ทั้งหมด จากนั้นอะไรที่เป็นเงื่อนไขพิเศษจะทำเป็น Cloud Function เล็กๆแทน ก็แนะนำว่าใช้ฐานข้อมูลปกติอย่าง PostgreSQL, MySQL, MongoDB สักตัวแทนจะดีกว่าครับ อีกทั้งเห็นใช้ Firebase Auth แต่มีการเรียกใช้ Passport.js ซ้ำเลยไม่แน่ใจว่าอย่างไร? เพราะปกติ Firebase Auth ตัวเดียวก็น่าจะพอแล้ว น่าจะไม่ต้องใช้ Passport.js ซ้ำอีกครั้ง เพราะอย่างที่บอกมันคือ BaaS มันจะจบในตัวเดียวได้สำหรับระบบหลังบ้าน
cashbag/server.js
Lines 24 to 28 in 8b24d25
ลองเปลี่ยนจาก
keysไปใช้secretแทนก็ได้ครับ และก็ไม่ควร Commit ขึ้นมา ควรเก็บไว้เป็นความลับ ศึกษาเรื่องการใช้.envและวิธีการทำให้ไม่สนใจการเปลี่ยนแปลงไฟล์นี้จากการเติมลงไฟล์.gitignoreครับ อ้างอิงจาก https://expressjs.com/en/resources/middleware/cookie-session.html#secretนอกจากนี้แล้วควรตั้งค่า
sameSitesecurehttpOnlyเข้าไปด้วย โดยsameSiteช่วยป้องกันละเมิด Cookie จากเว็บภายนอก ส่วนของsecureใช้ตอนเราทำ https และhttpOnlyควรเปิดเพื่อป้องกันไม่ให้ JavaScript เข้าถึง ให้เข้าถึงข้อมูล Cookie ผ่าน Http เท่านั้นและอันที่จริงผมแนะนำศึกษา https://expressjs.com/en/resources/middleware/session.html และใช้แทนตัว cookie-session มันดีตรงที่มี
rollingช่วยให้ต่ออายุ User ไม่อย่างงั้นนึกภาพดู ครบ 3 วันพอดี User จะหลุดจากการใช้งาน ถ้าเขาใช้วันที่ 3 พอดี จู่ๆเขาจะ Logout เองครับเพราะเราไม่ได้ต่ออายุ หรือมีโค้ดต่ออายุแล้วผมก็ไม่แน่ใจนะcashbag/server.js
Lines 84 to 91 in 8b24d25
แนะนำให้ใช้ Async/Await แทนนะครับ ลองศึกษาที่ https://javascript.info/async-await
สรุปโดยรวมอีก เห็นใช้ Firestore อย่าลืมศึกษา https://firebase.google.com/docs/firestore/security/get-started เรื่องนี้ถ้าเราพลาด อย่างเปิดให้
allow read; allow write;ทั้งคู่ละก็ ใครๆก็จะเข้ามาดัดแปลงข้อมูลเราได้ตลอด ดังนั้นการจะใช้ Firestore ในการบันทึกข้อมูล อาจจะผิด Concept ไปพอสมควร เพราะเราต้องมาดูว่า Firebase คือ BaaS เป็นการให้บริการ Backend ที่เราไม่ต้องมีโค้ด Express.js แบบนี้ครับ สิ่งที่เรากำลังทำจะกลายเป็นเพิ่มงาน เพราะบริการ Firebase เน้นเรียบง่าย และใส่ Logic ลงใน Frontend ทั้งหมด จากนั้นอะไรที่เป็นเงื่อนไขพิเศษจะทำเป็น Cloud Function เล็กๆแทน ก็แนะนำว่าใช้ฐานข้อมูลปกติอย่าง PostgreSQL, MySQL, MongoDB สักตัวแทนจะดีกว่าครับ อีกทั้งเห็นใช้ Firebase Auth แต่มีการเรียกใช้ Passport.js ซ้ำเลยไม่แน่ใจว่าอย่างไร? เพราะปกติ Firebase Auth ตัวเดียวก็น่าจะพอแล้ว น่าจะไม่ต้องใช้ Passport.js ซ้ำอีกครั้ง เพราะอย่างที่บอกมันคือ BaaS มันจะจบในตัวเดียวได้สำหรับระบบหลังบ้าน