graphql-middleware 기반 쿼리접근 제한
npm install graphql-middleware graphql-shield
import ...
const PORT = process.env.PORT;
const executableSchema = makeExecutableSchema({ typeDefs, resolvers });
const schemaWithMiddleware = applyMiddleware(executableSchema, permissions);
const apollo = new ApolloServer({
typeDefs,
resolvers,
playground: false,
schema: schemaWithMiddleware,
보안상 미들웨어 추가부분만 업로드
applyMiddleware 부분에 스키마와 미들웨어를 추가
graphql-shield 를 사용하기에 규칙을 정의한 permissions 객체를 불러와서 추가
import { allow, deny, rule, shield } from "graphql-shield";
const isAuthenticated = rule()(async (parent, args, ctx, info) => {
// 유저인증 로직
});
export const permissions = shield({
// 쿼리
Query: {
"*": allow, // 모든요청 불허용
// users: and(isAuthenticated, isAdmin),
// me: isAuthenticated,
},
// 뮤테이션
Mutation: {
"*": allow, // 인증시 업데이트 가능
// createUser: isNotAlreadyRegistered,
},
});
보안상 공식문서 예제를 사용
permissions 에 규칙정의
isAuthenticated 에 유저 로직을 작성
graphql-middleware 는 실제 해석기(resolver) 호출전,후 에
미들웨어 함수를 실행시켜줌
현재는 쿼리에 무분별한 접근을 막는것이 목적이라고 생각하며
실제로 미들웨어를 작성하기보다 체계적으로 규칙을 정의하여 권한계층을 만드는
graphql-middleware 기반의 graphql-shield 라이브러리를 적용
const executableSchema = makeExecutableSchema({ typeDefs, resolvers });
정확히 이부분에서 Did you mean Upload or Float? 이러한 오류가나서
분명히 typeDefs 는 DocmentNode 라는 형식으로 들어가 있는데
계속 문제가 발생함 원인은 typeDefs의 upload 라는 type 이 들어가있었고
해석기가 해당타입을 인식하지 못한 문제같음.