• 카테고리

    질문 & 답변
  • 세부 분야

    풀스택

  • 해결 여부

    미해결

Strategy의 done에 대해 질문드립니다.

22.11.29 22:34 작성 조회수 233

0

local의 경우,

passport.use(
    new LocalStrategy(
      {
        usernameField: "email", // req.body.email
        passwordField: "password", // req.body.password
      },
      async (email, password, done) => {
        try {
          const exUser = await User.findOne({ where: { email } });
          if (exUser) {
            const result = await bcrypt.compare(password, exUser.password);
            if (result) {
              done(null, exUser);
            } else {
              done(null, false, { message: "비밀번호가 다릅니다." });
            }
          } else {
            done(null, false, { message: "가입되지 않은 회원입니다." });
          }
        } catch (e) {
          console.error(e);
          done(e);
        }
      }
    )
  );

에서 done이 실행되면,

authRouter.post("/login", (req, res, next) => {
  passport.authenticate("local", (err, user, info) => {
    if (err) {
      console.error(err);
      return next(err);
    }

    if (!user) {
      return res.redirect("/login");
    }

    return req.login(user, (err) => {
      if (err) {
        console.error(err);
        return next(err);
      }
      // 여기서 { id : 3, "connect.sid" : s%31241432525 }에 저장된 cookie를 브라우저로 보냄
      return res.redirect("/");
    });
  })(req, res, next);
});

passport.authenticate의 콜백함수로 이동한다고 이해했습니다.

 

oauth의 경우,

 passport.use(
    new KakaoStrategy(
      {
        clientID: process.env.KAKAO_ID,
        callbackURL: "/auth/kakao/callback",
      },
      async (accessToekn, refreshToken, profile, done) => {
        try {
          const exUser = await User.findOne({
            where: { snsId: profile.id, provider: "kakao" },
          });

          if (exUser) {
            done(null, exUser);
          } else {
            const newUser = await User.create({
              email: profile._json && profile._json.kakao_account_email,
              nick: profile.displayName,
              snsId: profile.id,
              provider: "kakao",
            });
            done(null, newUser);
          }
        } catch (e) {
          console.error(e);
          done(e);
        }
      }
    )
  );

에서 done이 실행되면 마찬가지로 done을

(err, user, info) => {} 와 같은 콜백방식으로 받아야 하지 않나요? 미들웨어 확장법을 사용하지 않고

authRouter.get(
  "/kakao/callback",
  passport.authenticate(
    "kakao",
    {
      failureRedirect: "/login",
    },
    (req, res) => {
      res.redirect("/");
    }
  )
);

방법이 가능한 이유가 궁금합니다.

답변 1

답변을 작성해보세요.

1

이게 설명하기가 좀 난감한데요. 애초에 그렇게 만들어졌기 때문입니다.

passport-kakao같은 것은 done이 호출되었을 때 에러가 없다면 (req, res) => {} 로 이동합니다. req.login같은 것은 passport-kakao 내부에서 처리해버렸기 때문입니다.