Учетная запись службы Google Диска и «Неавторизованный клиент или область в запросе»

У меня есть 3 учетных записи службы, которые используют диск sdk.

1, работает, 2 нет.

Ошибка, которая возвращается: «Ошибка обновления токена OAuth2, сообщение:« {«ошибка»: «unauthorized_client», «error_description»: «Неавторизованный клиент или область в запросе».} '"

Все 3 аккаунта зарегистрированы в консоли разработчика. Все 3 разрешены для доступа к API управляемого клиента в консоли Google Apps. Все 3 имеют область действия « https://www.googleapis.com/auth/drive.readonly ». Все 3 в драйвере имеют определенную папку, для которой он используется для «только для просмотра».

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

Например

http://www.somehost.com/oauth_client.php?type=googledrive_admin 

Сертификат p12 и пользовательские значения хранятся на сервере. Все файлы «ini» имеют одинаковую структуру значений, client_id, client_email, область и фильтр запросов. Во всех случаях единственным элементом, который изменяется между файлами, является client_id и client_email.

Мой код выглядит следующим образом:

  <?php include (__DIR__ . "/google-api-php-client/autoload.php"); google_api_php_client_autoload("Google_Auth_AssertionCredentials"); google_api_php_client_autoload("Google_Client"); google_api_php_client_autoload("Google_Service_Drive"); google_api_php_client_autoload("Google_Service_OAuth2"); $type = $_GET['type']; $path = __DIR__ . "/secure/"; $certificate = $path . $type . ".p12"; $ini_path = $path . $type . ".ini"; $ini = parse_ini_file($ini_path); $service_scope = $ini['scope']; $service_account_id = $ini['id']; $service_account_email = $ini['email']; $service_query = $ini['q']; $service_account_key = file_get_contents($certificate); $credentials = new Google_Auth_AssertionCredentials( $service_account_email, array($service_scope), $service_account_key ); $credentials -> sub = $service_account_email; $google_client = new Google_Client(); $google_client -> setAssertionCredentials($credentials); if ($google_client -> getAuth() -> isAccessTokenExpired()) { $google_client -> getAuth() -> refreshTokenWithAssertion(); **//FAILS HERE** } $drive = new Google_Service_Drive($google_client); $result = array(); $pageToken = NULL; do { try { $parameters = array(); if ($pageToken) { $parameters['pageToken'] = $pageToken; } $parameters['q'] = $service_query; $files = $drive -> files -> listFiles($parameters); $result = array_merge($result, $files -> getItems()); $pageToken = $files -> getNextPageToken(); } catch (Exception $e) { print "An error occurred: " . $e -> getMessage(); $pageToken = NULL; } } while ($pageToken); echo json_encode($result) . "\n"; ?> 

Каждый файл ini структурирован следующим образом

 id="35{code}.apps.googleusercontent.com" email="35{code}@developer.gserviceaccount.com" scope="https://www.googleapis.com/auth/drive.readonly" q="mimeType != 'application/vnd.google-apps.folder'" 

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

Спасибо за этот пост и ваш комментарий о « Разрешено путем удаления строки $credentials -> sub = $service_account_email; "

Я столкнулся с аналогичной проблемой здесь . По-видимому, $credentials -> sub = $service_account_email принимается только для первой / основной учетной записи службы, созданной в Google Developers Console. Кроме того, он также приведет к непредвиденным ошибкам с некоторыми областями OAuth2 (как то, что я столкнулся с таблицами Fusion).

Следовательно, вот общая рекомендация:

НЕ включайте $credentials -> sub = $service_account_email без необходимости.

Выполняйте это только при попытке выдачи себя за пользователя с разницей (при условии, что соответствующая настройка была правильно выполнена в консоли администратора Google Apps).

Несмотря на то, что в некоторых случаях это может не вызвать ошибки, есть некоторые неожиданные действия при включении адреса электронной почты самой учетной записи службы в заявку JWT как значение поля «sub».