Как пройти аутентификацию на федеративном сервисе GraphQL в GCP Cloud Run? - PullRequest
1 голос
/ 01 июля 2019

У меня есть ряд микросервисов в 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 })

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

1 Ответ

1 голос
/ 01 июля 2019

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

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

Когда вы авторизуетесь с помощью OAuth для учетных данных пользователя, вы можете получить три токена: токен доступа, токен обновления и токен идентификации в зависимости от того, что вы указали в параметре Scopes. Identity Token - это то, что вы используете в заголовке 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 для авторизации.

...