Пример GCP IAP Java, возвращающий ComputeEngineCredentials вместо ServiceAccountCredentials

Контекст

У меня есть несколько сервисов в гибкой среде Google AppEngine, которые общаются через API, и пока я использую IAP для управления доступом пользователей. Я должен программно аутентифицировать каждую службу с помощью токена Bearer JWT.

Проблема

В моем приложении Java я использую код, который Google предоставляет для аутентификации служб IAP, который вы можете найти здесь: https://cloud.google.com/iap/docs/authentication-howto#iap_make_request-java

Проблема в этом блоке кода:

GoogleCredentials credentials =
    GoogleCredentials.getApplicationDefault().createScoped(Collections.singleton(IAM_SCOPE));
// service account credentials are required to sign the jwt token
if (credentials == null || !(credentials instanceof ServiceAccountCredentials)) {
  throw new Exception("Google credentials : service accounts credentials expected");
}
return (ServiceAccountCredentials) credentials;

Метод createScoped возвращает ComputeEngineCredentials, в то время как код ожидает объект ответа ServiceAccountCredentials.

Все предложения приветствуются. Заранее спасибо за самое большое сообщество.

Это происходит потому, что я запускаю свою службу Java в гибкой среде: github.com/googleapis/google-auth-library-java/blob/master/… Но тогда как мы можем аутентифицироваться в гибкой среде Java?

Mehdi Benmoha 01.10.2018 18:22

Я думаю, что единственный способ - использовать файл учетной записи службы json ...

Mehdi Benmoha 01.10.2018 18:40

Я столкнулся с той же проблемой. Я могу получить правильные данные ServiceAccountCredentials, если у меня установлена ​​переменная среды, указывающая на локальный файл учетных данных json для учетной записи службы, которую я пытаюсь олицетворять (даже если это учетная запись службы по умолчанию для вычислительного движка). Это происходит в экземпляре вычислительного механизма. Удалось ли вам решить проблему?

Vee6 14.08.2019 14:03

Я не пытался олицетворять аутентификацию, я просто пытался аутентифицироваться без предоставления файла JSON

Mehdi Benmoha 23.08.2019 16:49
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
4
368
1

Ответы 1

На самом деле вы не упоминаете характер проблемы, с которой столкнулись. Учетная запись службы гибкой среды App Engine автоматически создается в проекте GCP. Вы пытаетесь создать учетную запись службы гибкой среды App Engine, которая является отдельной учетной записью службы из Учетная запись службы App Engine по умолчанию. "Вернуть (ServiceAccountCredentials) учетные данные;" оператор использует приведение для возврата ServiceAccountCredentials; все должно быть хорошо.

Строка: GoogleCredentials.getApplicationDefault (). CreateScoped (Collections.singleton (IAM_SCOPE) создает объект GoogleCredentials, для успешного выполнения не требуется файл учетной записи службы JSON.

Вы видели мой комментарий? DefaultCredentialsProvider.java:L195 Есть тест только для стандарта AppEngine

Mehdi Benmoha 02.10.2018 15:28

Также перед отливкой проводится проверка объекта ServiceAccountCredentials. Таким образом, он всегда будет генерировать исключение "Google credentials : service accounts credentials expected"

Mehdi Benmoha 02.10.2018 15:31

Да, учетная запись службы по умолчанию создается автоматически, но она бесполезна в гибкой среде Java. Строка, которую вы заметили, возвращает ComputeEngineCredentials, потому что учетная запись службы по умолчанию не может быть использована (т. Е. Переменная среды не установлена)

Mehdi Benmoha 05.10.2018 11:25

Можно установить переменные среды. Для получения дополнительной информации вы можете взглянуть на «Определение переменных среды» подраздел на странице «Файл конфигурации app.yaml».

George 09.10.2018 00:21

Да, я знаю, но если я установлю их вручную, я не смогу использовать учетную запись службы по умолчанию (предполагается, что путь к файлу автоматически обрабатывается с помощью gcp). Как и для других языков, мне не нужно устанавливать env var для использования учетных данных по умолчанию.

Mehdi Benmoha 09.10.2018 14:10

Чтобы создать ключи для своих учетных записей служб, включая учетную запись службы по умолчанию для приложения App Engine, используйте страницу «Учетные записи служб» в консоли GCP, чтобы просмотреть и изменить свои учетные записи служб. Вы можете найти соответствующие подробности в документации «Контроль доступа» страница.

George 11.10.2018 23:08

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