0

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

1 回答 1

0

您可以使用 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'])
    }
}
于 2021-09-08T13:24:32.067 回答