Запрос микросервиса GraphQL с ключом API?

Я разработал два микросервиса Netflix DGS GraphQL и Apollo Gateway поверх этих двух микросервисов, чтобы сделать их федеративным graphql. У меня есть клиентское приложение, которое пытается запросить оба микросервиса graphql. И оба микросервиса имеют уникальный ключ API. Как мы назначаем ключ API для нескольких микросервисов либо с клиента, либо с сервера Apollo? Когда клиент запрашивает более одного микросервиса с ключом API, существует вероятность того, что сервер проигнорирует ключ API. Существуют ли какие-либо рекомендации по управлению ключами API?

1 ответ

Ворота Аполлона имеют свойство, которое вы можете использовать для изменения поведения запроса с помощью стандартных обратных вызовов, таких как .

С помощью вы можете сопоставить 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 в обратный вызов простым способом.

Другие вопросы по тегам