inflearn logo
강의

講義

知識共有

[リニューアル] Node.js教科書 - 基本からプロジェクト実習まで

カカオでログインする

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

364

kjkksu971673

投稿した質問数 49

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("/");
    }
  )
);

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

mongodb mysql nodejs Sequelize

回答 1

1

zerocho

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

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

리눅스 노드 설치시 패키지

0

159

0

socket.js 에서 referer로부터 roomId를 가져올 때

0

905

3

스트리밍 방식으로 대용량 파일 업로드 & 다운로드 관련 질문

0

2281

2

a[title] 질문드립니다

0

375

1

리뉴얼 강의 및 공부 방법

0

581

1

jwt decode

0

1128

1

node.js 교과서 3판 질문드립니다

0

391

1

passport와 jwt

0

432

1

리뉴얼 강의

0

418

2

혹시 Node.js 교과서 3판 이북은 언제 나오나요?

0

353

1

몽고디비 사용자도 MYSQL부분을 들어야 하나요???

0

481

1

sql 쿼리 로그는 어떤 모듈이 작성하나요?

0

505

2

nunjucks res.render('error'); 작동을 안합니다.

0

511

1

질문있습니다.

0

346

1

multer 한글 파일 업로드시 파일명이 깨져요.

1

3535

1

수업자료는 어디있나요?

0

366

1

질문 있습니디

0

235

1

multer 사용시 file 외 name값은 못받나용?

0

416

1

코드 중복 부분 질문드립니다.

0

298

1

api 만드는 이유 질문드립니다.

0

286

1

안녕하세요 fs 권한 관련 질문드립니다

0

448

1

시퀄라이즈 연결질문...

0

495

2

res.setHeader vs res.cookie

0

1786

3

실무에서의 에러처리에 대해 질문드립니다.

0

205

1