user authentication - login
stateless / session / cookie
ėīė ęģĩëķėė ėīėīė
ė§ęļęđė§ ėėąë postLogin ėŧĻíļëĄĪëŽ
import bcrypt from "bcrypt";
export const postLogin = async (req, res) => {
cont { username, password } = req.body;
const pageTitle = "Login";
const user = await User.findOne({ username });
if (!user) {
return res.render("login", { pageTitle, errorMessage: "ėėīëëĨž ė°ūė ė ėėĩëëĪ".});
}
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.render("login", { pageTitle, errorMessage: "ëđë°ëēíļę° íëĶ―ëëĪ."});
}
// ėĪė ëĄ ëĄę·ļėļ ëëëĄ íīėž íĻ
// (ėėą ėĪ)
return res.redirect("/");
};
ëĄę·ļėļė ėëí userę° ëęĩŽėļė§ë ėęģ ėëĪ.
userę° ėĪė ëĄ ëĄę·ļėļ ëëëĄ íë ĪëĐī ėļė
ęģž ėŋ íĪė ëíī ėėėž íëĪ.
ėëēę° ëļëžė°ė ė ėėēė ë°ęģ ėēëĶŽëĨž íī ėëĩė ë§ėđëĐī ėëēė ëļëžė°ė ë ėīė ëí ė ëģīëĨž ėė í ėėīëēëĶ°ëĪ.
ėīėēëž íëē ė°ęē°ėī ëëĪę° ëėīė§ë ęēė ëŽīėí(stateless)
ëžęģ íëĪ.
ë°ëžė ėëēę° ëę° ėėēíëė§ëĨž ė ė ėëëĄ íë ĪëĐī, userę° ėëēė ëŽīėļę°ëĨž ėėēí ëë§ëĪ userėęē ė ëģīëĨž ëĻęēĻėĪėž íëĪ.
ėīėēëž ëļëžė°ė ė ë°ąėë ę°ė ėīëĪ íëė íëė§ëĨž ęļ°ėĩíë ęēė ėļė
(session)
ėīëžęģ íëĪ.
ėīëĨž ėíī userę° ëĄę·ļėļ í ëë§ëĪ userėęē ėīëĪ í ėĪíļëĨž ėĢžęģ ę·ļ ëĪėëķí°ë userę° ėëēė ėėēė ëģīëž ëë§ëĪ ę·ļ í ėĪíļëĨž ę°ėī ëģīëīëëĄ íëĪ.
express-sessionė ėĪėđíëĐī, ėđ ėŽėīíļëĨž ë°ĐëŽļí ëë§ëĪ expressę° ėėė ę·ļ í ėĪíļ(ėļė id)ëĨž ë§ëĪėī ëļëžė°ė ėęē ëģīëīėĢžęģ , ėļė DBėë ę·ļ ėļė idė íĻęŧ ėļė objectëĨž ė ėĨíīėĪëĪ.
$ npm i express-session
ëĻžė , express-sessionė ėĪėđíëĪ.
import session from "express-session";
app.use(session({
secret: "Hello!",
resave: true,
saveUninitialized: true,
}));
server.js íīëėė express-sessionė import í í router ė―ë ėėė ėīęļ°ííīėĪëĪ.
secret ę°ė ëĪėė ėëŽīë ëŠĻëĨīë ëŽļėėīëĄ ë°ęŋ ęēėīëĪ.
resaveė saveUninitialized ėĩė
ė ė―ė ė°―ė ëŽ ëŽļęĩŽëĨž ė°ļęģ íī ėķę°íëĪ.
â íĩėŽ â
ėīė ëļëžė°ė ę° ėëēė ėėēė ëģīëīëĐī ėëēë ëļëžė°ė ėęē ėīëĪ í
ėĪíļ(ėļė
id)ëĨž ėĪëĪ.
ę·ļ ėīíëĄ ëļëžė°ė ë localhost:4000ė ëŠĻë urlė ėėēė ëģīëž ëë§ëĪ ėŋ íĪėė ėļė
idëĨž ę°ė ļė íĻęŧ ëģīëīėĪëĪ. (ėëĄ ëĪëĨļ ëļëžė°ė ë ėëĄ ëĪëĨļ ėŋ íĪëĨž ę°ė§ëĪ.)
ėīëĨž íĩíī ėëēë ėļė
DBėė íīëđ ėļė
idëĨž ę°ė§ ėļė
object, ėĶ userė ëí ė ëģīëĨž ė°ūė ė ėëĪ.
ėĶ, ėŋ íĪė ėë ėļė
idė ėļė
DBė ėë ėļė
idę° ę°ė
ėļė
ė ė°ūë ęēėīëĪ.
ėëēë ėīëĪ userę° ėīëĪ ëļëžė°ė ėė ėėēė ëģīëëė§ ė ė ėęģ , userė ëí ė ëģīëĨž ęļ°ėĩíęģ ėķę°í ė ėëĪ.
import bcrypt from "bcrypt";
export const postLogin = async (req, res) => {
cont { username, password } = req.body;
const pageTitle = "Login";
// user(username)ę° ėĄīėŽíëė§ íėļ
const user = await User.findOne({ username });
if (!user) {
return res.render("login", { pageTitle, errorMessage: "ėėīëëĨž ė°ūė ė ėėĩëëĪ".});
}
// userę° ė
ë Ĩí passwordę° passwordė íīė ę°ęģž ėžėđíëė§ íėļ
const ok = await bcrypt.compare(password, user.password);
if (!ok) {
return res.render("login", { pageTitle, errorMessage: "ëđë°ëēíļę° íëĶ―ëëĪ."});
}
// userė ëí ė ëģīëĨž ėļė
ė ėķę°íëĪ
req.session.loggedIn = true;
req.session.user = user;
// userėęē ëĄę·ļėļė ėąęģĩíėė ėë Īėž íëĪ
// ...
return res.redirect("/");
};
userėęē ëĄę·ļėļė ėąęģĩíėė ėëĶŽęļ° ėíī ėļė
ė ęļ°ë°íī íëĄ íļėëė ëīėĐėī íėëëëĄ í
íëĶŋė ėė íīėž íëĪ.
req.session.loggedInėī falseėž ë base.pug íėžėė Joinęģž Login ë§íŽëĨž ëģīėŽėĢžëëĄ íęģ , trueėž ë Joinęģž Logout ë§íŽëĨž ëģīėŽėĢžëëĄ íëĪ.
ę·ļëŽë, ėëė ę°ėī ėė íīëīĪė§ë§ ėëŽę° ë°ėíëĪ.
if req.session.loggedIn
li
a(href="/login") Login
ėīë í
íëĶŋėė ėļė
ė ė ę·ží ėę° ėęļ° ëëŽļė ėęļī ėëŽėīëĪ.
ėīëĨž ėīëŧęē ėė íīėĪėž í ęđ?