Доступ к API реселлера Google с использованием учетных записей служб - PullRequest
0 голосов
/ 25 апреля 2018

У нас возникли проблемы с доступом к API реселлера с использованием служебных учетных записей.Пример с клиентскими секретами работает хорошо, но нам нужно было бы развернуть его в k8s (Kubernetes Engine) без необходимости регулярно обновлять сеанс oauth (особенно делать это один раз, поскольку это довольно сложно в контейнере Docker).

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

Мы попробовали две учетные записи, одна из которых была по умолчанию для вычислительной машины.и один, созданный непосредственно для нашего варианта использования.Оба получили область действия реселлера в G Suite.

    https://www.googleapis.com/auth/apps.order,
    https://www.googleapis.com/auth/admin.directory.user,
    https://www.googleapis.com/auth/siteverification,

Мы продолжаем получать "googleapi: Error 403: Authenticated user is not authorized to perform this action., insufficientPermissions" ошибок, хотя при использовании

    client, err = google.DefaultClient(ctx, reseller.AppsOrderScope)
    if err != nil {
        log.Fatal("creating oauth client failed", zap.Error(err))
    }
    subs, err := client.Subscriptions.List().Do()
    if err != nil {
        log.Fatal("listing subscriptions failed", zap.Error(err))
    }

я прочитал в посте на StackOverflow, что Reseller API требуетолицетворение пользователя, но поиск по этому вопросу в Google и репозитории oauth2 и client lib не привели к этому.Python делает это, как описано в сквозном руководстве

    credentials = ServiceAccountCredentials.from_json_keyfile_name(
        JSON_PRIVATE_KEY_FILE, 
    OAUTH2_SCOPES).create_delegated(RESELLER_ADMIN_USER)

, но для Go я не смог найти никакого документированного способа сделать это.

Ответы [ 2 ]

0 голосов
/ 02 мая 2018

Проблема была решена путем использования другого конфига и установки jwt.Subject, который, очевидно, выполняет олицетворение:

const envVar = "GOOGLE_APPLICATION_CREDENTIALS"
if filename := os.Getenv(envVar); filename != "" {
    serviceAccount, err := ioutil.ReadFile(filename)
    if err != nil {
        log.Fatal("creating oauth client failed", zap.Error(err))
    }
    config, err := google.JWTConfigFromJSON(serviceAccount,
        reseller.AppsOrderScope,
    )

    config.Subject = *impersonationUser // like user@google.com
    client = config.Client(ctx)
}
0 голосов
/ 26 апреля 2018

Здесь так мало моментов:

  • Реселлер API требует только олицетворения / делегирования всего домена при использовании учетной записи службы.Другими словами, сама учетная запись службы не имеет прав для прямого вызова API, но она может выдавать себя за пользователя-посредника (например, admin@reseller.example.com или тому подобное), который имеет права вызывать API-посредник.
  • Возможно, вы сможете использовать обычный трехсторонний OAuth вместо служебной учетной записи.Вам просто нужно убедиться, что вы запрашиваете автономный доступ, чтобы получить токен обновления с длительным сроком действия.
  • Олицетворение / делегирование всего домена несовместимо со стандартными учетными записями служб, встроенными в AppEngine и ComputeEngine.Вы должны использовать служебную учетную запись, созданную в своем проекте API.

Посмотрите, предоставит ли образцы, предоставленные Google , чтобы вы оказались там, где вам нужно.

...