티스토리 뷰

안녕하세요 강정호입니다

 

오늘은 JWT 토큰을 사용하여 로그인 기능을 개발해보겠습니다.

 

참고 페이지 : 13akstjq.github.io/itsme-backend/2019/09/22/passport-jwt%EB%A1%9C-%EB%A1%9C%EA%B7%B8%EC%9D%B8-%ED%86%A0%EA%B7%BC%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0.html

Passport란?

Node Js를 위한 인증 미들웨어 입니다. 어플리케이션마다 각기 다른 인증 전략을 가지고 있는데, passport에서는 여러 인증 전략을 제공하고 있다.

 

API 문서 : www.passportjs.org/docs/downloads/html/

 

Documentation

Overview Passport is authentication middleware for Node. It is designed to serve a singular purpose: authenticate requests. When writing modules, encapsulation is a virtue, so Passport delegates all other functionality to the application. This separation o

www.passportjs.org

 

로그인 인증 프로세스

 

1. server.js 에서 authenticate 함수 호출

import "./env.js"
// graphql-yoga는 Graphql 서버를 쉽게 실행시켜 주는 도구
import { GraphQLServer } from "graphql-yoga";
import passport from "passport";
import logger from "morgan";
import schema from "./schema";
import {sendSecretMail} from "./utils";
import { authenticateJwt } from "./passport";


console.log(process.env.PORT);

const PORT = process.env.PORT || 4000;

// GraphQL 서버 객체 생성
const server = new GraphQLServer({ 
    schema , 
    context:  ({request}) => ({request})
 });

server.express.use(logger("dev"));

/* 서버 실행시 authenticateJwt 함수 호출 */
server.express.use(authenticateJwt);

server.start({port : PORT}, () => console.log(`Server running on port http://localhost:${PORT}`));

 

2. passport.js

import passport from "passport";
import { Strategy, ExtractJwt } from "passport-jwt";
import dotenv from "dotenv";
import path from "path";
import { prisma } from "../generated/prisma-client";
dotenv.config({path: path.resolve(__dirname, ".env") });


/** 역할 :  */
const jwtOptions = {
    jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey: process.env.JWT_SECRET

};

const verifyUser = async (payload, done) => {
    try{
        const user = await prisma.user({id: payload.id})
        if(user != null){
            return done(null, user);
        }else{
            return done(null, false);
        }
    }catch{
        return done(error, false);
    }
};

/** 서버 실행시 authenticateJwt 함수 호출됨 */
export const authenticateJwt = (req, res, next) =>
    passport.authenticate("jwt", {sessions: false}, (error, user) => {
        if(user){
            req.user = user;
        }
        next();
    })(req, res, next);


passport.use(new Strategy(jwtOptions, verifyUser));
passport.initialize();

passport.authenticate 함수

Json Web Token 방식을 인증 전략(Strategy)로 사용하기 때문에 authenticate 첫 인자로 "jwt"를 입력하였습니다.

카카오나 페이스북으로 인증을 하려면 인자값이 바뀝니다.

 

new JwtStrategy(options, verify)

 - options : 인증 요청 또는 검증시에 어떻게 토큰을 추출할 것인지 방법

 - verify : payload를 가지는 

 

댓글