[인스타클론코딩] [Server].10 - 토큰(JWT)사용해보기
by 한만섭
- TOC
passport의 흐름
1. server.js 에서 authenticateJwt호출하기
- authenticateJwt는 토큰인증을 하는 함수입니다.
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 토큰값"}
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;
}
}
}
}
Subscribe via RSS