Когда я делаю запрос в Google, получая 400 Bad Request - PullRequest
2 голосов
/ 12 февраля 2020

Я пытаюсь получить список групп (списков рассылки) для определенного c пользователя. Ошибка получения.

Запрос

`GET /admin/directory/v1/groups HTTP/1.1
Host: www.googleapis.com
Content-length: 0
Authorization: Bearer ya29.Il-9B-9Z88RKqK73dr-NyeeJnCz0PqlPrMgxlr0JO6gc2q2jcROxsu7y6EaTHAlRkJatv5l3kd_PIPHrB7wXeMvfe0YTXupzupJ8-PUyrRcCIBE_qpPP8V7NoM0JJp`

Но я получаю ответ об ошибке, показанный ниже.

{
    "error": {
        "code": 400, 
        "message": "Bad Request", 
        "errors": [
            {
                "domain": "global", 
                "message": "Bad Request", 
                "reason": "badRequest"
            }
        ]
    }
}

Не только при получении групп, но и каждого API звонок от googleapis.com ведет себя так.

1 Ответ

0 голосов
/ 17 февраля 2020

У меня была такая же ошибка / путаница в использовании некоторых API Google.

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

Предполагая, что да, проблема заключается в том, что в дополнение к учетным данным учетной записи службы необходимо указать пользователю, что учетные данные Google будут impersonate при выполнении запроса. То есть делегирование всего домена позволяет вам вести себя так, как будто вы являетесь одним из реальных пользователей, насколько я понимаю.

Я не мог найти способ установить это с помощью API Google Base, кроме использования строитель напрямую. Вот пример:

  static GoogleCredential createCredential(HttpTransport transport, JsonFactory jsonFactory) throws Exception {
    final String credentialJsonPath = System.getProperty("user.home") + "/.config/gcloud/service-cred-from-console.json";
    try (InputStream credentialStream = new FileInputStream(credentialJsonPath)) {
      final GoogleCredential firstPassCred = GoogleCredential.fromStream(credentialStream, transport, jsonFactory);

      return new GoogleCredential.Builder()
          .setTransport(transport)
          .setJsonFactory(jsonFactory)
          .setServiceAccountId(firstPassCred.getServiceAccountId())
          .setServiceAccountProjectId(firstPassCred.getServiceAccountProjectId())
          .setServiceAccountPrivateKey(firstPassCred.getServiceAccountPrivateKey())
          .setServiceAccountPrivateKeyId(firstPassCred.getServiceAccountPrivateKeyId())
          // service accounts must act on behalf of an actual user and have scope
          .setServiceAccountScopes(Lists.newArrayList(GmailScopes.GMAIL_COMPOSE, GmailScopes.GMAIL_SETTINGS_SHARING))
          .setServiceAccountUser("a.real.gsuite.account@example.com")
          .build();
    }
  }

Важные части определяют ServiceAccountUser (которого вы олицетворяете) и ServiceAccountScope(s), который вы предполагаете для этого пользователя.

Я разместил пример gmail api gist . Вы можете запустить это через локальный прокси-сервер, например charles (и др.), Если хотите получить эквивалент. Последовательность вызова REST.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...