У меня есть скрипт на 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 (это проблемный случай)