[passport.js] passport 로그인

2020. 12. 23. 00:52라이브러리 & 프레임워크

반응형

passport를 쓰는 이유로는 여러 가지가 있지만, 그중 하나가 토큰을 확인 하기 위해서 입니다.

그래서 이번에 passport를 활용하여 토큰을 확인 하는 코드에 대해서 소개 해드리겠습니다.

 

 

※저는 config 폴더(디렉토리) 안에 passportConfig.js 설정 파일이 있습니다.※

 

먼저 패키지를 설치 해줍니다.

npm install passport passport-local passport-jwt

 

 

이제 설치한 패키지들을 require(요즘은 import 써요) 합니다.

 

const localStrategy = require("passport-local").Strategy;
const JWTstrategy = require("passport-jwt").Strategy;
const ExtractJWT = require("passport-jwt").ExtractJwt;

 

passport 에서는 Strategy(전략)이라는 용어를 쓰는데 처음에는 이 단어가 낯설었는데,

여러번 해보니 이제는 익숙해 지네요ㅎㅎ

passportConfig.js

passport.use(
  "login",	
  new localStrategy(
    {
      usernameField: "email",
      passwordField: "password",
      session: false,
    },
    async (email, password, done) => {     
    
        connection.query(		// connection은 mysql연동 관련 객체입니다.
          `CALL login('${email}')`,
          true,
          (err, results, fields) => {
            if (err) {
              console.log("err");
            }
            
            const match = results[0][0].password;

            bcrypt.compare(password, match).then((isMatch) => {
              if (!isMatch) {
                return done(null, false, { msg: "password wrong" });
              } else {
                const user = {
                  email,
                  password,
                };
                return done(null, user);		// done은 콜백함수입니다. 콜백 함수로 user의 정보가 넘어갑니다.
              }
            });
          }
        );
      } catch (err) {
        console.log(err);
        done(err);
      }
    }
  )
);

 

login.js

router.post("/", (req, res, next) => {
  try {
    passport.authenticate("login", (err, user, info) => {
      if (err) {
        console.log("err: ", err);
      }     
          pool.query(
            `CALL login('${email}')`,
            true,
            async (err, results, fields) => {
              if (err) {
                return res.status(201).json({ msg: "call login err" });
              }

              if (results[0].length === 0) {
                return res
                  .status(201)
                  .json({ msg: "이메일이 없습니다", result: "FAIL" });
              }

              const match = results[0][0].password;

              await bcrypt.compare(password, match).then((isMatch) => {
                if (!isMatch) {
                  return res.stauts(400).send({
                    msg: "비밀번호가 틀렸습니다.",
                    result: "FAIL",
                  });
                } else {
                  const token = jwt.sign({ email: email }, {
                    expiresIn: 3600,
                  });
                  return res.status(201).send({
                    msg: "로그인 성공",
                    result: "SUCCESS",
                    token: token,
                  });
                }
              });
            }
          );
        });
      }
    })(req, res, next);
  } catch (err) {
    console.log("catch err : ", err);
  }
});


광고를 많이 봐주시면
passport로 페이스북 구글 네이버 카카오 로그인 코드를 다 올리겠다

반응형