이번 passport를 하여 로그인을 구현했다.
처음 passport를 이용한 로컬 로그인
passport.use(
new LocalStrategy(
{
usernameField: "email",
passwordField: "password",
},
async (email, password, done) => {
try {
const query = "select * from users where email = :email";
const isuser = await sequelize.query(query, {
replacements: {
email: email,
},
type: sequelize.QueryTypes.SELECT,
});
const users = isuser[0];
if (users) {
const salt = users.salt;
let inpw = crypto.createHash("sha512").update(password + salt).digest("hex");
if (inpw === users.password) {
done(null, users);
} else {
done(null, false, { message: "비밀번호가 일치하지 않습니다." });
}
} else {
done(null, false, { message: "가입되지 않은 회원입니다." });
}
} catch (error) {
console.error(error);
done(error);
}
}
)
);
이런식으로 passport 로컬로 로그인을 만들었다.
그리고 기본 passport의 세션을 이용한 로그인이 아닌
토큰을 이용한 로그인 시스템이니 토큰을 발급하는 부분
passport.authenticate(
"local",
(authError, user, info) => {
if (authError) {
console.error(authError);
return next(authError);
}
if (!user) {
return res.status(400).send({ result: "fail", msg: info.message });
}
return req.login(user,{ session: false }, (loginError) => {
if (loginError) {
console.error(loginError);
return next(loginError);
}
const token = jwt.sign(
{
id: user["userid"]
},
process.env.SECRET_KEY
);
const data = { user: user };
return res.status(200).send({
result: "success",
msg: "로그인 완료.",
token: token,
data: data,
});
});
}
)(req, res, next);
로컬로그인구현완료..!