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



我正在尝试在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`,
},
],
},
}),
]

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

服务器.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'])
}
}

最新更新