[NestJS/GraphiQL]Federation 구성 시 인증 헤드 처리

개요


NestJS에서 ApolloFederation 구조를 구축할 때
클라이언트 요청 헤더의 정보는 게이트웨이에서 온 것이다
모든 서비스에서 데이터를 가져오는 요청에 반영되지 않은 문제네.
(Federation 구조 및 Micro 서비스에 대한 자세한 내용은 생략됨)
Firebase Auth를 사용하여 게이트웨이 아래 서비스
Firebase에서 발행한 Bearer 토큰을 사용하여 사용자 인증을 하고 싶습니다.
위에서 말한 바와 같이, 게이트웨이와 서비스 사이의 헤더는 재건될 것이다
인증 정보가 누락되다.
@Injectable()
export class UsersGuard implements CanActivate {
  constructor(private readonly usersService: UsersService) {}
    return new Promise((res) => {
      const ctx = GqlExecutionContext.create(context);
      const { req } = ctx.getContext();
      const authToken = req.headers.authorization as string; <- ここが取れない
이 기사에서 클라이언트의 요청 첫 부분에 포함된 정보
망관에서 부하 서비스로 연결할 수 있도록 하기 위해서다.

전제 조건


관련 포장 버전만 발췌
"@apollo/gateway": "^0.48.1",
"@nestjs/apollo": "^10.0.5",
"@nestjs/common": "^8.0.0",
"@nestjs/core": "^8.0.0",
"@nestjs/graphql": "^10.0.5",
@nestjs/graphiql 10 계열을 이용합니다.글씨를 쓰는 방법과 9과는 매우 큰 차이가 있으니 주의해야 한다.
(업그레이드하려면 9->10 시스템 마이그레이션 가이드 참조)
https://docs.nestjs.com/graphql/federation

결론


Gateway의 GraphiQLModule.forRot에 전달된 설정에서 눈썹을 재구성하면 됩니다
import { IntrospectAndCompose, RemoteGraphQLDataSource } from '@apollo/gateway';
import { Module } from '@nestjs/common';
import { GraphQLModule } from '@nestjs/graphql';
import { ApolloGatewayDriver, ApolloGatewayDriverConfig } from '@nestjs/apollo';

@Module({
  imports: [
    GraphQLModule.forRoot<ApolloGatewayDriverConfig>({
      driver: ApolloGatewayDriver,
      server: {
        cors: true,
      },
      gateway: {
        supergraphSdl: new IntrospectAndCompose({
          subgraphs: [
            { name: 'users', url: `${process.env.USERS_URL}/graphql` },
          ],
        }),
	// ここから -----------
        buildService: ({ name, url }) => {
          return new RemoteGraphQLDataSource({
            url,
            willSendRequest({ request, context }) {
              if (Object.keys(context).length > 0) {
                request.http.headers.set(
                  'Authorization',
                  context['req']['headers']['authorization'],
                );
              }
            },
          });
	 // ----------- ここまで
        },
      },
    }),
  ],
})
export class AppModule {}
build 서비스에 전달된 함수의 매개 변수에name과 URL이 있습니다
이번 상황은요.
name:"users",url:${process.env.USERS_URL}/graphql.
데이터를 얻는 서비스에 따라 처리를 바꾸려면 이 정보를 사용해서 지점을 나누십시오.

총결산


ApolloFederation을 실현하고 싶지만 게이트웨이에서 인증하지 않음
부하의 서비스를 각각 인증하고 싶을 때
요청 헤더를 서비스에 보내는 방법을 소개했다.
NestJS+GraphiQL의 기술 스택에서
개발을 추진하는 사람들의 암시가 될 수 있다면 해피.
메시지를 생략해서 썼으니 문제나 지적사항이 있으면 환영합니다
이상

참조 링크


apol/gateway 문서
NestJS는 아니지만 참고로 보도된

좋은 웹페이지 즐겨찾기