Как пройти аутентификацию в федеративной службе GraphQL в GCP Cloud Run?

У меня есть ряд микросервисов в GCP Cloud Run, на каждом из которых размещена федеративная служба Apollo GraphQL. Затем у меня есть последний контейнер, который действует как федеративный шлюз GraphQL для остальных сервисов.

Это отлично работает, когда для контейнеров включен общий доступ, но я не могу заставить сервер шлюза аутентифицироваться в отношении двух других служб.

Я попытался использовать Apollo RemoteGraphQLDataSource и реализовать метод willSendRequest для установки необходимых заголовков.

Я также попытался добавить роль инициатора облачного запуска к роли службы, от имени которой работает шлюз.

const servicex = new RemoteGraphQLDataSource({
  url: serviceurl,
  willSendRequest({ request, context }) {
    request.http.headers.set(
      "Authorization",
      "Bearer ${TOKEN}"
    );
  }
});


const gateway = new ApolloGateway({
  serviceList: [
    servicex
  ]
});

const { schema, executor } = await gateway.load();

const server = new ApolloServer({ schema, executor })

Я ожидаю, что сервер шлюза сможет аутентифицироваться против других микросервисов.


person Kieran Taylor    schedule 01.07.2019    source источник
comment
Я только что обнаружил, что обратный вызов willSendRequest запускается только тогда, когда внешняя служба вызывает службу, а не при первоначальной выборке федеративных служб. Открытая проблема подробно описана здесь: github.com/apollographql/apollo-server/issues/2852   -  person Kieran Taylor    schedule 01.07.2019


Ответы (1)


Для авторизации Cloud Run требуется токен удостоверения OAuth 2.0 в authorization: bearer TOKEN HTTP-заголовке. Распространенной ошибкой является использование токена доступа.

Если вы не указали новую учетную запись службы в команде развертывания, Cloud Run использует учетную запись службы Compute Engine по умолчанию в качестве своего удостоверения. Это означает, что вам необходимо указать адрес электронной почты учетной записи службы для role/run.Invoker.

Когда вы авторизуетесь с помощью OAuth для учетных данных пользователя, вы можете получить три токена: токен доступа, токен обновления и токен удостоверения в зависимости от того, что вы указали в параметре Scopes. Идентификационный токен - это то, что вы используете в заголовке авторизации HTTP.

Когда вы авторизуете сервис для обслуживания с использованием удостоверения учетной записи службы, вызовите сервер метаданных Cloud Run, чтобы создать для вас токен. Эта конечная точка вернет токен идентификации. Используйте возвращенный токен в заголовке авторизации HTTP.

http://metadata/computeMetadata/v1/instance/service-accounts/default/identity?audience=<ususally-the-url-of-the-cloud-run-service-you-are-calling>

Возвращенный токен - это подписанный JWT, который вы можете декодировать. Типичная кодировка base64 для header.payload.signature. Полезные данные содержат адрес электронной почты учетной записи службы, и этот адрес электронной почты используется прокси-сервером Cloud Run для авторизации.

person John Hanley    schedule 01.07.2019