각종 sns로그인 일반로그인등을 한번에 관리해주는 passport login을 이용해 볼꺼다 현역에서는 다른거 쓰겟지만
npm i passport passport-local를 해준다.
여기서 passport-local은 일반 로그인시 사용하는것이다. 다른 sns는 좀있다가....
01. 세션로그인
이것을 다해줫다 라고 하면 일단 passport라는 폴더를 따로 만들고 설정을 해주는데
const passport = require("passport")
const local = require("./local")
const {User} = require("../models")
module.exports=()=>{
// 로그인 정보를 프론트에서 받음
passport.serializeUser((user,done)=>{
done(null,user.id)
})
// 위에 프론트에서 받은 정보를 db에서 뒤짐
passport.deserializeUser(async (id,done)=>{
try {
const user = await User.findOne({
where: {
id
}
})
done(null,user)
// 서버에러
} catch (error) {
console.error(error)
done(error)
}
})
local()
}
로그인 전후로 나누는 이유는 간단하게 인증이 된사람인지 아닌지를 판별하는것이라고 생각하면 된다.
아래 local()이라는게 있을텐데 이것은 일반로그인일때 데이터가 맞는지 아닌지 그거를 구분하기위한곳이다.
바로 이곳 !!!
const passport = require("passport")
const {Strategy:LocalStrategy} = require("passport-local")
const bcrypt = require("bcrypt")
const {User} = require("../models")
module.exports=()=>{
passport.use(new LocalStrategy({
// 아이디에 해당되는 칸
usernameField: "email",
// 비밀번호에 해당되는 칸
passwordField:"password"
}, async(email, password,done) => {
try {
const exUser = await User.findOne({
where: {
email,
}
})
if (!exUser) {
// 서버에러 , 성공유무 , 실패시 메시지
return done(null, false, {
reason: "존재하지 않는 이메일입니다."
})
}
// 비밀번호
const result = await bcrypt.compare(password, exUser.passport)
// 성공시
if (result) {
return done(null, exUser)
}
//아이디에 해당하는 비밀번호가 없을시
return done(null, false, {
reason: "비밀번호가 틀렸습니다."
})
} catch (error) {
// 서버에서 실패시
console.error(error)
return done(error)
}
}))
}
여기서는 로그인 할때 일단 db에서 프론트에서 준 이메일 즉 아이디가 있는지를 확인하고 없다면 메시지를 던져주고 그뒤로 그 아이디에 해당되는 비밀번호가 맞는지 확인을 하는데 여기서bcrypt.compare가 뭐냐고 하면 db에 있는 해시화 된 비밀번호와 유저가 준 비밀번호가 일치하는지를 확인 하는것이다.
자 이걸 api 쪽에다가 연결을 할껀데
// 로그인
router.post("/login", passport.authenticate("local"),(req,user,info))
ㄱreq,user,info 이름은 막지은거고 여기에 들어가는 데이터는 위에 있는 done(null,false,reason) 여기 괄호에 있는 데이터들이 들어간다. 고로 서버쪽에러, 사용자정보 ,클라이언트에러 라고 생각 하면 되고 문제는 여기서 서버에러 처리할때 next가 없어서 문제인데 미들웨확장을 시키면 된다고 한다.
// 로그인
router.post("/login", (req,res,next)=>{
passport.authenticate("local", (err, user, info) => {
if (err) {
console.error(err)
next(err)
}
})(req,res,next)
})
이런식으로 기존에 작성했던데 안에다가 넣으면 끝~ 확장은 끝낫고 또 해야할게 잇는데 각각 서버에서 실패시 클라이언트에서 실패시 패스포트에서 에러날시가 끝나면 마지막에 사용자에게 데이터를 넘겨주는것이다.
// 로그인
router.post("/login", (req,res,next)=>{
passport.authenticate("local", (err, user, info) => {
if (err) {
console.error(err)
return next(err)
}
if(info){
// 401인증되지 않는
return res.status(401).send(info.reason)
}
return req.login(user,async(loginErr)=>{
// 패스포트에서 에러 나면
if (loginErr){
console.error(loginErr)
return next(loginErr)
}
return res.json(user)
})
})(req,res,next)
})
세션로그인에 대해 공부를 해볼껀데 이거는 키를 서버에서 가지고 잇는거다 라고 생각하면된다.
app.js
app.use(cookieParser(process.env.COOKIE_SECET))
app.use(session({
saveUninitialized:false,
resave:false,
// 세션키라고 생각하자... 해킹당하면 ㅈ되는겨
secret: process.env.COOKIE_SECET
}))
app.use(passport.initialize())
app.use(passport.session())
02. 로그아웃
간단하게 코드만 넣어놓겟음.
// 로그아웃
router.post("/logout",(req,res)=>{
req.logout((err) => {
if (err) {
console.error(err)
return res.status(500).send("로그아웃 중 오류가 발생했습니다.")
}
req.session.destroy((err) => {
if (err) {
console.error(err)
return res.status(500).send("로그아웃 중 오류가 발생했습니다.")
}
res.send('로그아웃 하셨습니다');
})
});
})
'nodebird' 카테고리의 다른 글
이미지 올려보자잇 (1) | 2024.02.08 |
---|---|
게시물을 불러오장 (2) | 2024.02.07 |
cors (1) | 2024.01.28 |
회원가입 구현해보자.. (1) | 2024.01.27 |
넥스트에서의 에디터... (1) | 2024.01.25 |