이전 글 : [express] passport / local 전략을 사용한 로그인
local 전략을 사용해 인증을 받고 jwt토큰을 발급받았다면, 인가가 필요한 요청에 passport를 이용해 간단하게 추가할 수 있다.
역시나 먼저 jwt전략부터 작성해보자
const passportJWT = require("passport-jwt");
const JwtStrategy = passportJWT.Strategy;
const ExtractJwt = passportJWT.ExtractJwt;
import { User } from "../../db";
const jwtOptions = {
secretOrKey: process.env.JWT_SECRET_KEY || "jwt-secret-key",
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
};
const jwt = new JwtStrategy(jwtOptions, async (payload, done) => {
try {
const user = await User.findById(payload.user_id);
if (user) {
done(null, user);
} else {
done(null, false);
}
} catch (error) {
done(error, false);
}
});
module.exports = jwt;
가장 먼저 passportJWT 모듈을 불러오고, 해당 모듈에서 strategy와 extractJwt를 분리해서 선언해준다. 역할은 다음과 같다.
콜백함수가 하는 일은 로컬전략의 콜백과 매우 흡사하다. 단지 인증과정에서 유저를 찾는 값이 토큰을 생성할 때 사용한 payload의 담긴 정보라는것 정도.
그리고 찾은 유저를 done으로 다음으로 넘겨준다.
이제 전략을 구성했으니 전략을 사용할 미들웨어를 작성해 보자
const authenticateJWT = (req, res, next) => {
passport.authenticate("jwt", { session: false }, (err, user, info) => {
if (err) {
return next(err);
}
if (!user) {
return res.status(401).json({ message: "Unauthorized" });
}
req.currentUserId = user._id.toString();
next();
})(req, res, next);
};
module.exports = authenticateJWT;
전반적으로 local을 사용한 미들웨어와 크게 다르지 않다.
다만 해당 예제에선 다음 체인으로 넘겨줄 유저의 아이디를 req객체의 currentUserId로 정의해주고 있다.
이렇게 jwt전략을 이용한 간단한 passport 인가 미들웨어를 작성해보았다
다음은 OAuth를 통한 구글로그인 방법으로 돌아오겠읍니다