• TOC

passport의 흐름


1. server.js 에서 authenticateJwt호출하기

  • authenticateJwt는 토큰인증을 하는 함수입니다.

image


2. passport.js

import passport from "passport";
import {Strategy , ExtractJwt} from 'passport-jwt';
import { prisma } from "../generated/prisma-client";

const JWTOptions = {
    jwtFromRequest  : ExtractJwt.fromAuthHeaderAsBearerToken(),
    secretOrKey : process.env.JWT_SECRET  // .env파일에 있음.
}

const verifyUser = async(payload, done) =>{
    try{
        const user = await prisma.user({id : payload.id}); //payload의 id 가 있는 유저인지 확인
        if(user !== null){
            return done(null,user);
        }else {
            return done(null,false);
        }
    }catch{
        return done(err,false);
    }
};

// 1. server에서 호출하는 함수
export const authenticateJwt = (req,res,next) =>{
    passport.authenticate("jwt",{session : false},(error,user)=> { // 콜백함수
        if(user){ //유저가 있다면 request에 user를 넣어줍니다.
            req.user = user;
        }
        next();
    })(req,res,next);
}
passport.use(new Strategy(JWTOptions,verifyUser)); // 2. 만들어놓은 option과 유저확인 함수로 토큰을 인증함.
passport.initialize();

3. request 사용하기

위까지 했을 경우 request에 user가 들어가 있습니다. 그 request를 포함한 server를 만들어주는 코드가 아래코드입니다.

const server = new GraphQLServer({schema, context : ({request})=>({request})});

4. http Header

{"Authorization":"Bearer 토큰값"}

image


5. request사용하기

아래와 같이 args 다음에 {request}로 사용할 수 있습니다.

import {generateSecret , sendSecretMail} from "../../../utils";
import { prisma } from '../../../../generated/prisma-client';
export default {
    Mutation : {
        requestSecret : async(_,args,{request}) =>{
            console.log(request);
            const {email} = args;
            const loginSecret = generateSecret();
            console.log(loginSecret);
            try{
                throw Error();
                await sendSecretMail(email,loginSecret);
                await prisma.updateUser({data : {loginSecret},where : {email}});
                return true;
            }catch{
                return false;
            }

        }
    }
}