그래프큐엘에서 미들웨어를 쓰고 싶었다.
일단 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번째 인자에서 받아온다.
'Back > Node.js' 카테고리의 다른 글
[NodeJs, Typescript] nodemailer 이메일 보내기 (0) | 2022.09.07 |
---|---|
[Nodejs, TypeScript] 도메인 로직 리팩토링 (0) | 2022.08.05 |
[NodeJs, GraphQL, Apollo, Express, Prisma, TypeScript] Setting (0) | 2022.07.27 |
[NestJs, Prisma] Prisma CRUD (0) | 2022.07.19 |
[Nodejs] Slack Message 슬렉 메시지 보내기 slack-freinds (0) | 2022.06.23 |