如何使用 Apollo Federation 从网关到服务的请求中获取完整的详细信息

Posted

技术标签:

【中文标题】如何使用 Apollo Federation 从网关到服务的请求中获取完整的详细信息【英文标题】:How to get complete details from request coming from gateway to services using Apollo Federation 【发布时间】:2021-09-28 13:36:59 【问题描述】:

我正在尝试在 Apollo Federation 中实现 Auth0,我能够在其单个服务 (https://auth0.com/blog/developing-a-secure-api-with-nestjs-adding-authorization/#Set-Up-API-Authorization) 中实现它,但如果我尝试通过网关访问 API,则标头/有效负载不会传递给服务,因此它总是未经授权的。

如果 API 是通过单个服务访问的,则有效负载会被接收并从标头中正确解码并且工作正常,但如果通过网关,它不会级联到需要它的服务。

目前使用的是代码优先实现。我也试过镜像服务中使用的模块,但还是不行。

单个服务中的示例负载


  iss: 'issuer url here',
  sub: 'google-oauth2',
  aud: ['audience link'],
  iat: ,
  exp: ,
  azp: '',
  scope: '',
  permissions: [ 'sample:permission' ] 

在网关中导入

imports: [
ConfigModule.forRoot(),
GraphQLGatewayModule.forRoot(
            server: 
                cors: true,
            ,
            gateway: 
                serviceHealthCheck: true,
                serviceList: [
                    
                        name: 'service',
                        url: `$process.env.SERVICE_URL/graphql`,
                    ,
                ],
            ,
        ),
]

【问题讨论】:

【参考方案1】:

您可以使用 buildService 选项自定义内部请求中使用的标头:

server.ts

    const gateway = new ApolloGateway(
        buildService: ( url ) => new RequestHandler( url ),
        serviceList,
    )

RequestHandler 类扩展 RemoteGraphQLDataSource 的地方:

import  RemoteGraphQLDataSource  from '@apollo/gateway'
import type  GraphQLRequest  from 'apollo-server-core'
import type express from 'express'

export class RequestHandler extends RemoteGraphQLDataSource 
    willSendRequest( context, request :  context:  req: express.Request , request: GraphQLRequest ) 
        request.http?.headers.set('somethingFromOriginalRequestOrSomethingCustom', context.req.headers['something'])
    

【讨论】:

以上是关于如何使用 Apollo Federation 从网关到服务的请求中获取完整的详细信息的主要内容,如果未能解决你的问题,请参考以下文章

如何将 REST API 迁移到 GraphQL Apollo Federation

使用 apollo-federation 独立构建 GraphQL 服务

如何将 2 buildService(上传和标头)添加到 apollo federation?

Apollo Federation 是不是支持代码优先方法?

在 Apollo GraphQl Federation 中,如何在没有 @external 指令的情况下应用 @requires 逻辑?

@apollo/federation 包的替代品