Проблемы с аутентификацией сервисного аккаунта для API реселлера Google с использованием библиотеки nodejs

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

  code: 403,
  errors: [
    {
      domain: 'global',
      reason: 'insufficientPermissions',
      message: 'Authenticated user is not authorized to perform this action.'
    }
  ]

Моя конфигурация выглядит так:

    const OAUTH2_SCOPES = [
      "https://www.googleapis.com/auth/admin.directory.user",
      "https://www.googleapis.com/auth/apps.order",
      "https://www.googleapis.com/auth/siteverification",
      "https://www.googleapis.com/auth/cloud-platform",
    ];

   const authJWT = new google.auth.JWT({
      keyFile: JSON_PRIVATE_KEY_FILE,
      scopes: OAUTH2_SCOPES,
      subject: RESELLER_ADMIN_USER,
      email: "gsuite-reseller@some-cool-name-because-why-not.iam.gserviceaccount.com",
    });

Используя базовый google fu, я нашел этот thread, из чего следует, что моя проблема связана с олицетворением. Поэтому я обменялся адресом электронной почты в свойстве subject с адресом электронной почты моей учетной записи, для которой указаны права владельца. Я также дал права владельца служебной учетной записи, потому что в этот момент я совершенно невежественен. К сожалению, это только изменило сообщение об ошибке на:

status: 401,
statusText: 'Unauthorized'

Кто-нибудь знает, что пошло не так? 401 указывает на отсутствие учетных данных. Должен ли я также указать свои личные учетные данные электронной почты в дополнение к учетным записям службы? Если да, то где? Я не нашел ничего многообещающего в объекте google.auth.JWT.options.


person Gh05d    schedule 13.07.2020    source источник
comment
Вы предоставили сервисному аккаунту необходимые области действия в консоли администратора-›Безопасность ›Контроль API, как объясняется здесь? Вы включили делегирование на уровне домена для созданной вами учетной записи службы? Достаточно ли областей в вашем коде для запроса, который вы пытаетесь реализовать? Было бы полезно увидеть ваш код!   -  person ziganotschka    schedule 13.07.2020
comment
Я разместил области здесь в переменной OAUTH2_SCOPES. Я добавил широкие области домена. В моем коде сейчас не так много всего. Я только пытаюсь вызвать API через google.reseller({ version: "v1", auth: authJWT });.   -  person Gh05d    schedule 13.07.2020
comment
Если вы хотите использовать учетную запись службы, которая выдает себя за пользователя, вам НЕОБХОДИМО включить делегирование на уровне домена. Что касается областей действия, убедитесь, что вы авторизовали их в консоли администратора, а не вставили в код. Почему вы вообще хотите использовать сервисный аккаунт?   -  person ziganotschka    schedule 13.07.2020
comment
Я не активировал делегирование всего домена, так как не хочу, чтобы каждый созданный пользователь проходил ручную авторизацию.   -  person Gh05d    schedule 13.07.2020
comment
Я проверил, и области находятся в консоли администратора. Я хочу использовать учетную запись службы, поскольку мы хотим перепродавать gsuite с помощью нашего бэкэнда, поэтому запросы будут передаваться от сервера к серверу. Я думал, что это был точный вариант использования.   -  person Gh05d    schedule 13.07.2020


Ответы (1)


Зачем нужно делегирование на уровне домена?

  • Когда вы используете учетную запись службы и включаете делегирование на уровне домена, это означает, что вы разрешаете учетной записи службы выдавать себя за пользователя и действовать от его имени.
  • Если вы используете учетную запись службы без олицетворения, учетная запись службы может выполнять только те операции, для которых она авторизована, например. он может получить доступ к файлам на вашем Диске или получить доступ к вашему календарю, но только если вы явно поделились ими с учетной записью службы!
  • Для выполнения запросов, для которых учетная запись службы не авторизована, вам необходимо сделать так, чтобы учетная запись службы олицетворяла пользователя домена, имеющего необходимую авторизацию, то есть вам нужно олицетворять пользователя
  • Однако, чтобы олицетворять пользователя, вам необходимо явно предоставить учетной записи службы разрешение действовать от имени пользователя — это называется делегированием на уровне домена.
  • Включение делегирования на уровне домена не заставит каждого созданного пользователя проходить авторизацию вручную или повлияет на любое другое поведение, не связанное с служебной учетной записью.
  • единственное, что делает domain-wide delegation, — это позволяет сервисному аккаунту представлять пользователя
  • Без включения делегирования на уровне домена олицетворение пользователя не будет авторизовано, и установка subject вызовет ошибку.

Ссылки:

person ziganotschka    schedule 13.07.2020
comment
Это выглядит хорошо для производства. Но есть ли способ сделать это в среде разработки? Потому что сейчас скрипт работает локально на моей машине, а не на сервере, работающем под авторизованным доменом. - person Gh05d; 13.07.2020
comment
Я не понимаю, почему вы не можете протестировать код в среде разработки, если вы загрузили копию JSON_PRIVATE_KEY_FILE и сохранили ее по пути, указанному в вашем коде. - person ziganotschka; 13.07.2020
comment
Что ж, я попробовал это с авторизованным доменом и делегированием всего домена, но все равно получаю ошибку 401. Я проверил ключевой файл, и идентификатор правильный. Введенный адрес электронной почты также имеет права владельца. - person Gh05d; 13.07.2020
comment
Извините за повторный вопрос, но указали ли вы необходимые области здесь? А также включить API в облачной консоли? Google сообщает об ошибке 401: если вы видите это для сервисного аккаунта , убедитесь, что вы успешно выполнили все шаги на странице служебной учетной записи. Убедитесь, что вы правильно выполнили все эти шаги. - person ziganotschka; 13.07.2020
comment
Чем больше вы спрашиваете, тем лучше :-) Я активировал все необходимые API через console.developers.google.com /apis, а также учетная запись службы, указанная как имеющая доступ. Я выполнил все шаги, описанные в этом документе, за исключением назначения пользователя учетной записи службы. Не удалось найти его с помощью редактирования, поэтому, возможно, мне придется создать новую учетную запись службы. - person Gh05d; 14.07.2020
comment
Похоже, что создание новой учетной записи и добавление в нее моего пользователя сделали свое дело. В очередной раз благодарим за помощь. Ты обалденный :-) - person Gh05d; 14.07.2020