Uncaught исключение 'Google_Service_Exception' с сообщением '{"error": "invalid_grant", "error_description": "Неверный адрес электронной почты или идентификатор пользователя"}' - PullRequest
0 голосов
/ 02 апреля 2019

У меня есть скрипт на python, который запрашивает журналы доступа Google BigQuery и извлекает записи, которых нет в списке IP-адресов / диапазонов «белого списка» (MySQL db). Для каждой записи в журнале, не входящей в белый список, я получаю имя пользователя (john@mygoogledomain.com), а затем с помощью служебной учетной записи (олицетворения учетной записи администратора) выводим токены доступа, назначенные этому пользователю для определенного пользователя. ID клиента. Цель состоит в том, чтобы иметь возможность одобрить / заблокировать на основе определенного действия, предпринятого пользователем.

Рабочий процесс, как показано ниже:

Python запрашивает журналы GBQ> Отправляет пользователям электронные письма о любых записях, не входящих в белый список, с просьбой утвердить / заблокировать (Да, это я, Нет, это не я)> В письмах электронной почты содержится ссылка на страницу php (Approve.php / reject.php)> IF: пользователь нажимает Approve.php, и его запись добавляется / подтверждается в белом списке db ELSE: пользователь нажимает reject.php, и я пытаюсь получить его токены, отфильтровать их по clientId и в конечном итоге удалить токен.

Функция списка токенов не работает для доменов, администратор которых (очевидно) не является (очевидно), поэтому сторонние домены, такие как gmail.com и т. Д., Не работают, и это нормально, у меня есть отдельный более ручной процесс для этих .

Но это также не работает для учетных записей служб, где домен @ .iam.gserviceaccount.com. Что я могу сделать здесь?

require_once '/var/www/html/gbq-audit/vendor/autoload.php';
putenv("GOOGLE_APPLICATION_CREDENTIALS=/path/to/svc/creds.json");

$query_user = $row["user"];         //$row["user"] is an email address
$admin = "admin" . substr($query_user, strpos($query_user, "@"), strlen($query_user)-strpos($query_user, "@"));
//$admin = "admin@mydomain.com";

$client = new Google_Client();
$client -> useApplicationDefaultCredentials();
$client -> setSubject($admin);
$client -> setScopes("https://www.googleapis.com/auth/admin.directory.user.security");

$dir_svc = new Google_Service_Directory($client);

$response = $dir_svc -> tokens -> listTokens($query_user);
foreach($response["items"] as $token) {
    if(strpos($token["displayText"], "specific app") || strpos($token["displayText"], "specific app")) {
        echo $token["userKey"] . ": " . $token["displayText"] . " - " . $token["clientId"] . "<br />";
        $scopes = $token["scopes"];
        foreach($scopes as $scope) {
            echo "     " . $scope . "<br />";
        }
    }
}

Мой код работает для: normal-user@mydomain.com (svc a / c делегирован как admin@mydomain.com)

Но не для: normal-user@gmail|hotmail|external.com (это ожидается / учтено) и
svc-user@project.iam.gserviceaccount.com (это проблемный случай)

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