Как я могу получить доступ к членам группы с служебной учетной записью?

Я пытаюсь использовать учетную запись службы для доступа к членам группы. Я убедился, что могу сделать это, используя обычный токен OAuth2 от имени пользователя, с вызовом https://www.googleapis.com/admin/directory/v1/groups/{group}/members и областью действия https://www.googleapis.com/auth/admin.directory.group.readonly.

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

Когда я запрашиваю список участников, я получаю эту ошибку:

{
 "error": {
  "errors": [
   {
    "domain": "global",
    "reason": "forbidden",
    "message": "Not Authorized to access this resource/api"
   }
  ],
  "code": 403,
  "message": "Not Authorized to access this resource/api"
 }
}

Что мне нужно сделать, чтобы авторизовать эту учетную запись службы для просмотра группы?


person Michal Migurski    schedule 10.06.2015    source источник
comment
Рекомендуется переформулировать вопрос в начале или в конце сообщения. Убедитесь, что у вас есть вопрос в сообщении вашего вопроса;)   -  person Jeremy Dicaire    schedule 10.06.2015
comment
учетная запись службы может быть запутанным термином. Вы имеете в виду учетную запись службы, которую вы создали в консоли API? Или это просто общая учетная запись пользователя?   -  person Emily    schedule 10.06.2015
comment
Да, я имею в виду учетную запись службы, созданную в консоли API.   -  person Michal Migurski    schedule 11.06.2015
comment
Авторизовали ли вы области для сервисного аккаунта в соответствии с документацией здесь: developers .google.com/admin-sdk/directory/v1/guides/delegation ? Учетная запись службы не должна нуждаться в членстве, поскольку вы предоставляете доступ к Admin SDK, который может просматривать сведения о членстве (так же, как доступ любой учетной записи суперадминистратора).   -  person miketreacy    schedule 11.06.2015
comment
У меня есть сейчас, но см. ниже: это не имело значения.   -  person Michal Migurski    schedule 11.06.2015


Ответы (2)


Вы можете выполнить шаги, описанные на следующей странице документации по API, чтобы создать учетную запись службы и выполнить делегирование полномочий на уровне домена. Помните, что вам нужен адрес электронной почты любого пользователя, который является членом группы (userEmail во фрагменте кода ниже), чтобы сервисный аккаунт мог действовать от их имени:

https://developers.google.com/admin-sdk/directory/v1/guides/delegation

Страница содержит примеры Java и Python для создания экземпляра объекта com.google.api.services.admin.directory.Directory с использованием учетной записи службы и закрытого ключа, созданных в Google Developers Console.

 GoogleCredential credential = new GoogleCredential.Builder()
  .setTransport(httpTransport)
  .setJsonFactory(jsonFactory)
  .setServiceAccountId(SERVICE_ACCOUNT_EMAIL)
  .setServiceAccountScopes(DirectoryScopes.ADMIN_DIRECTORY_USERS)
  .setServiceAccountUser(userEmail)
  .setServiceAccountPrivateKeyFromP12File(
      new java.io.File(SERVICE_ACCOUNT_PKCS12_FILE_PATH))
  .build();
person omerio    schedule 11.06.2015
comment
Выглядит многообещающе. Я добавил свой идентификатор клиента служебной учетной записи в разделе «Управление доступом клиента API», и теперь я думаю, что застрял на следующем шаге. Вот краткий пример кода, в котором используется содержимое ключа; первый вызов API G+ работает, поэтому я знаю, что ключ исправен, а второй по-прежнему не работает: .github.com/migurski/9b8e44da1536c5713e0a - person Michal Migurski; 11.06.2015
comment
Что такое client_email? это адрес электронной почты учетной записи службы или адрес электронной почты пользователя, от имени которого действует учетная запись службы - person omerio; 12.06.2015
comment
Это электронная почта сервисного аккаунта, выглядит как [email protected] - person Michal Migurski; 12.06.2015
comment
При использовании сервисной учетной записи вы действуете от имени кого-то, поэтому вам нужно как-то установить это - person omerio; 13.06.2015
comment
Ха, ладно. Я не вижу места для этого в API, с которым я работаю. Поскольку я пытаюсь использовать учетные записи служб, чтобы обойти необходимость работать от чьего-либо имени, как с OAuth, возможно, это в любом случае совершенно неправильный путь. Спасибо за вашу помощь! - person Michal Migurski; 15.06.2015

Предположим, что у вас есть следующее

from google.oauth2 import service_account
from googleapiclient.discovery import build

SCOPES = ["https://www.googleapis.com/auth/admin.directory.user", 
          "https://www.googleapis.com/auth/admin.directory.group"]

credentials = service_account.Credentials.from_service_account_file(
                PATH-TO-YOUR-SERVICE-ACCOUNT-FILE, 
                scopes=SCOPES, subject=ADMIN-EMAIL-ID)
service = build('admin', 'directory_v1', credentials=credentials)
group = "YOUR-GROUP-EMAIL-ID"
direct_members = service.members().list(groupKey=group).execute()["members"]
print(direct_members)

# Note that the above code would give only direct members.
# To get the direct members, set the `inclueDerivedMembership` 
# argument to True as below.
all_members = service.members().list(
              groupKey=group, inclueDerivedMembership=True).execute()["members"]
print(all_members)

Источником достоверности этого ответа является здесь.

person Abhishek Mishra    schedule 18.07.2020