使用 API 键查询 GraphQL 微服务?

Querying GraphQL Microservice with API key?

我在这两个微服务之上开发了两个 Netflix DGS GraphQL 微服务和 Apollo Gateway,使它们成为一个联合的 graphql。 我有一个客户端应用程序正在尝试查询这两个 graphql 微服务。并且这两个微服务都有一个唯一的 API 键。我们如何从客户端或 Apollo 服务器为多个微服务分配 API 键? 当客户端使用 API 键查询多个微服务时,服务器有可能忽略 API 键。是否有处理 API 密钥管理的最佳实践?

Apollo Gateway 具有 buildService 属性,您可以使用它来使用 willSendRequest.

等标准回调来修改请求行为

使用 willSendRequest 您可以匹配服务 url 并相应地附加 API 键:

class RequestHander extends RemoteGraphQLDataSource {
    willSendRequest({ request }: { request: GraphQLRequest }) {
        // if request.http.url matches url of a service which you
        // use, add api-key to headers, e.g.
        if (request.http.url === 'http://localhost:3001') {
            request.http.headers.set('api-key', <API_KEY>)
        }
    }
}

const main = () => {
    const gateway = new ApolloGateway({
        buildService: ({ url }) => new RequestHander({ url }),
        serviceList: [
            { name: 'service1', url: 'http://localhost:3001' },
            { name: 'service2', url: 'http://localhost:3002' },
        ],
    })

    const server = new ApolloServer({ gateway })

    void server.listen({ port: 3000 }).then(({ url }) => {
        logger.info(`Apollo Gateway ready at ${url}`)
    })
}

main()

通过这种方式,您可以创建一些地图,其中列出所有服务及其 api 键,然后您将能够匹配 url 和 api 键在 willSendRequest 回调中以一种简单的方式。