使用 PHP 和服务帐户连接到受 IAP(身份识别代理)保护的服务

Connecting to IAP (Identity Aware Proxy) protected service with PHP and Service Account

如何通过服务帐户使用 PHP 连接到受 IAP 保护的服务?我已经无法获得 Authentication Bearer,所以我想我完全走错了路:

<?php
require_once 'vendor/autoload.php';

$scopes = ['https://www.googleapis.com/auth/iam'];

$client = new Google_Client;
$client->useApplicationDefaultCredentials();
$client->setScopes($scopes);
$client->setSubject('example@example.iam.gserviceaccount.com');
$client->setOpenidRealm('https://example.com');
$access_token = $client->getAccessToken();

var_dump($access_token);

任何关于从哪里开始以及如何开始的指示都将不胜感激。

你看到了吗https://cloud.google.com/iap/docs/authentication-howto ? Unfortunately we don't have sample code for PHP yet, but that explains the basic concepts. The "Robot Parade" section of https://cloudplatform.googleblog.com/2017/04/Getting-started-with-Cloud-Identity-Aware-Proxy.html也可能有帮助。

不幸的是,IAP 不支持用于身份验证的访问令牌,因此您将需要获得服务帐户签名的 JWT,并且它需要有一个特殊的 "target_audience" 声明。 $client->config['signing_key'] 设置了吗?如果是这样,您可以访问服务帐户的私钥,并且可以...查看 https://github.com/google/google-auth-library-php/blob/master/src/OAuth2.php#L417 如果您可以获得凭据对象,您可以执行类似的操作,添加 target_audience 声明.

如果您没有访问私钥,我认为只有当您运行在 GCE 上并使用服务帐户时才会出现这种情况来自元数据服务器,您必须使用 IAM signBlob API:https://cloud.google.com/iam/reference/rest/v1/projects.serviceAccounts/signBlob . This requires some tricky setup on the GCE instance, https://cloud.google.com/iap/docs/authentication-howto 对其进行记录。

抱歉,我知道这比应该的要复杂得多!我不是 PHP 专家,但我希望这至少能有所帮助。 -- Matthew,Identity-Aware Proxy 工程师