消息为“ {{error“:” invalid_grant“,” error_description“:”无效的电子邮件或用户ID“}'的未捕获异常'Google_Service_Exception'

时间:2019-04-02 15:23:55

标签: php access-token google-admin-sdk service-accounts google-directory-api

我有一个python脚本,可查询Google BigQuery访问日志并提取“列入白名单”(MySQL db)IP地址/范围列表中不存在的条目。对于每个未列入白名单的日志条目,我将获取用户的登录名(john@mygoogledomain.com),并使用服务帐户(模拟管理员帐户)从中获取该用户的登录令牌,以列出分配给该用户的特定访问令牌clientId。目的是能够根据用户采取的某些操作来批准/阻止。

工作流程如下:

Python查询GBQ日志>向用户发送有关任何未列入白名单的条目的电子邮件,要求他们批准/阻止(是,这是我,不是,这不是我)>电子邮件包含指向php页面的链接(approve.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(将vc A / c委派为admin@mydomain.com)

但由于以下原因而失败: normal-user@gmail|hotmail|external.com(这是预期的/原因),并且
svc-user@project.iam.gserviceaccount.com(这是有问题的情况)

0 个答案:

没有答案