로그인을 설정하기 위해
passport 라이브러리를 사용해보자.
passport와 poassport-local을 설치한다.
passport: sns 로그인을 한 번에 관리해주는 라이브러리
passport-local :사용자가 만드는 로그인을 관리해주는 라이브러리
(이 라이브러리를 사용해 email 로그인한다.)
back 루트 디렉토리에 passport 폴더만들기
index.js 패스포트 설정파일만들기
local.js 로컬설정파일 만들기.
app.js 에서 불러와서 설정하기.
app.js에서 모든 기본 설정을 한다.
index(passport)를 불러와 호출하면 기본 설정이 끝난다.
이 상태로 서버를 실행하면 app crashed 오류가 발생한다.
오류를 읽어보면 LocalStrategy는 유효한 콜백함수를 가지고 있어야 한다고.
아까 passport/local에서 빈칸으로 뒀으므로, 설정을 해주자.
/passport/local.js
passport.user(new LocalStrategy( { usernameField, passwordField }, 전략 함수 );
LocalStrategy는 두가지 인수를 갖는데, 첫번째는 객체, 두번째는 함수이다.
첫번째 인수가 req.body에 대한 설정.
usernameField는 아이디, passwordField는 비밀번호를 받는다.
두번째 인수에서는 로그인 하는 전략을 세운다.
전략이라고 해서 어려워 보이지만 사실 어려울 것이 없다.
가입된 이메일인지, 비밀번호가 맞는지와 같이 로그인에 필요한 항목들을 체크하는 곳이다.
로그인 전략함수를 자세히 살펴보자.
매개변수로 로그인에 필요한 정보와 done메서드를 가진다.
passport에서는 응답을 보내지 않고, done으로 결과를 판단해준다.
done(서버에러, 성공, 클라이언트 에러)
findOne 메서드가 비동기 함수이므로 await을 사용한다.
비동기(async)는 항상 서버에러가 발생할 수 있으므로 try catch를 사용하자.
try {
가입된 이메일이 있는지 판단하여,
user가 없다면, 클라이언트 에러를 반환한다..
return done(null, false, { reason: '존재하지 않는 사용자입니다.' });
await bcrypt.compare(password, user.password);
비밀번호를 암호화하여 DB에 저장했으므로,
로그인 시 입력받은 비밀번호도 암호화하여 비교한다.
(compare은 비동기함수이므로 await을 사용한다. 같으면 true, 다르면 false 반환.)
비밀번호를 바르게 입력했다면, 두번째 인수에 결과값을 반환한다.
return done(null, user);
비밀번호가 틀리면, 클라이언트 에러를 반환한다.
return done(null, false, { reason: '비밀번호가 틀렸습니다.' });
catch (error) {
서버에러가 발생한 것이므로 서버에러 반환.
return done(error);
}
passport 전략은 유저 로그인 할 때 실행해야한다.
그러므로 /user/login 라우터에서 설정을 해주자.
passport.authenticate('local', (서버에러, 성공, 클라이언트에러) => { 응답 });
authenticate 인수로 'local'과 함수를 가진다.
이 함수는 서버에러, 성공, 클라이언트에러를 받는다.
즉 passport의 done이 반환한 것을 받아온다.
라우터로 반환해주기 위해서는 기존 라우터 미들웨어를 확장해주면 된다.
(express의 대부분이 미들웨어다. 라우터도 미들웨어)
done으로 받아온 값들은 매개변수로 설정해줬다. (이름은 마음대로 지어줬다.)
서버에러가 난다면, next로 반환해주자.
클라이언트 에러가 발생하면, status 401로 반환하자.
에러가 없다면, req.login을 한다.
이 때 passport login을 한다.
passport가 로그인정보를 저장해줘야하는데 이때 세션이 사용된다.
세션은 따로 설정해야하는데 그건 다음포스팅에서.
에러가 없다면 return status(200).json(user);을 해준다.
Express :: 커스텀미들웨어 추가하기, next (0) | 2021.01.01 |
---|---|
Express :: passport, 쿠키랑 세션 설정하기 (feat.로그인) (0) | 2020.12.26 |
Express :: cors_서버에서 CORS 에러 해결하기 (0) | 2020.12.25 |
Express :: body-parser_서버 라우터 및 DB 연결하기 (회원가입) (0) | 2020.12.25 |
Express 라우터 분리하기 (0) | 2020.12.21 |
댓글 영역