Back/Node.js

[Nodejs, GraphQL] Middleware(미들웨어) 만들기

그래프큐엘에서 미들웨어를 쓰고 싶었다.

 

일단 jwt-token을 활용한 미들웨어를 만들어봤다.

 

memberAuth.middleware.ts

import memberService from '../service/member.service';

const memberAuthMiddleWare = async (authorization: string) => {
  const verifyJwtMemberAuth = await memberService.verifyJwtToken(authorization);
  const memberInfo = await memberService.getMemberInfo(Number(verifyJwtMemberAuth.memberIdx));
  return memberInfo;
};

export default memberAuthMiddleWare;

 

memberService에는 유저와 관련된 로직들이 포함되어 있다.

 

memberService.verifyJwtToken에는 tokenType에 Bearer가 붙어있는지 검증하고, jwt를 활용해 인증하는 로직이 들어있다.

memberService.memberInfo는 해당 유저 정보가 있는지 조회한다.

 

 

apolloserver.ts

import { ApolloServer } from 'apollo-server';
import { ApolloServerPluginLandingPageGraphQLPlayground } from 'apollo-server-core';
import schema from '../gql/schema';
import memberAuthMiddleWare from '../middlewares/memberAuth.middleware';
import resolvers from '../gql/resolvers/member.resolvers';

const apolloServer = new ApolloServer({
  rootValue: resolvers,
  schema,
  cors: {
    allowedHeaders: '*',
    origin: '*',
    credentials: true,
  },
  introspection: true,
  plugins: [ApolloServerPluginLandingPageGraphQLPlayground()],
  context: async ({ req }) => {
    const authorization = req.headers.authorization;
    const memberInfo = await memberAuthMiddleWare(authorization);
    return memberInfo;
  },
});

export default apolloServer;

 

apolloserver에 context에서 middlewares를 만들 수 있다.

 

authorization을 만들어둔 유저를 검증하는 미들웨어로 넘겨서 memberInfo를 받아 온다.

 

실제 프로덕트에선 cors를 모두 허용이 아니라, 사용할 origin만 허용해주면 되겠다.

 

member.resolvers.ts

import { MemberInfo } from '../../types/memberInfo';
import memberService from '../../service/member.service';

const memberResolvers = {
  Query: {
    getFollowingList: async (_parent: any, _args: any, context: MemberInfo, _info: any) => {
      const result = await memberService.getFollowingList(context.memberId);
      return result;
    },
  },
};

export default memberResolvers;

any가 눈에 띈다.

 

아까 미들웨어에서 넘어온건 context에서 받아온다. 함수의 3번째 인자에서 받아온다.