ericnorris/gcp-auth-contrib

一个专注于速度和正确性的非官方Google Cloud Platform认证库。

v1.0.0 2020-09-26 22:38 UTC

This package is auto-updated.

Last update: 2024-09-27 09:36:41 UTC


README

CI status Coveralls.io coverage percentage Psalm type coverage percentage

gcp-auth-contrib是一个非官方的PHP库,用于认证Google Cloud Platform产品,它注重合理的默认设置、正确性和速度。

  • 安全地缓存所有认证I/O,以减少在Web服务器环境下运行PHP时的请求延迟。

  • 所有I/O都是懒惰的,通过在初始化期间不执行任何I/O来避免意外DoS元数据服务器(DoSing)

  • 支持开箱即用的服务账户模拟

  • 清晰地区分获取OAuth2访问令牌和OIDC身份令牌,以便轻松调用Cloud FunctionsCloud Run和类似产品。

  • 通过Psalm进行了完全类型化。

$fetcher = \ericnorris\GCPAuthContrib\OpinionatedDefaults::get()->makeCredentialsFetcher();

$storageClient = new \Google\Cloud\Storage\StorageClient([
    "credentialsFetcher" => $fetcher,
]);

// ...

安装

composer require ericnorris/gcp-auth-contrib

用法

以下示例都使用了OpinionatedDefaults类。默认设置如下:

  • 使用普通的Guzzle HTTP客户端。这意味着将抛出异常以处理HTTP错误,例如500s

  • 使用应用程序默认凭证模式来查找凭证。注意:如果您在Google Cloud Platform产品上运行代码,则无需提供服务账户密钥文件。使用此库(和合理的默认设置)将自动使用您正在运行的产品元数据服务器进行认证。

  • 使用Symfony内存和文件系统缓存来缓存认证I/O。访问和身份令牌在有效期内被缓存,在其他请求安全的情况下永久缓存。

如果这些默认设置对您不起作用,Credentials目录包含一系列灵活的类,您可以使用它们进行认证。强烈建议您使用CachedCredentials实例包装任何此类类,以避免不必要的I/O。

通过Google Cloud Platform API进行认证

Google Cloud Platform PHP库通常需要传递一个实现FetchAuthTokenInterface接口的类到其客户端的credentialscredentialsFetcher选项数组键。这取决于特定的客户端,请参阅您特定客户端的文档以了解使用哪个。

您可以通过调用OpinionatedDefaults类的makeCredentialsFetcher来获取兼容的FetchAuthTokenInterface接口。

$fetcher = \ericnorris\GCPAuthContrib\OpinionatedDefaults::get()->makeCredentialsFetcher();

// the StorageClient class takes the parameter as a "credentialsFetcher" option
$storageClient = new \Google\Cloud\Storage\StorageClient([
    "credentialsFetcher" => $fetcher,
]);

// the BigtableClient class takes the parameter as a "credentials" option
$bigtableClient = new \Google\Cloud\Bigtable\BigtableClient([
    "credentials" => $fetcher,
]);

// ...

通过Google Cloud Platform无服务器产品进行认证

调用认证的 Cloud Run 或 Cloud Function 服务需要 OIDC 身份令牌。该库中所有 Credentials 实例都提供了一个单独的 fetchIdentityToken(string $audience) 方法,专门为此目的。

注意: 这包括 AuthorizedUserCredentials!您可以使用用户的 OAuth 凭据(通过 gcloud auth application-default login 或自行进行 OAuth2 流程)来调用认证的无服务器产品。

$credentials = \ericnorris\GCPAuthContrib\OpinionatedDefaults::get()->makeCredentials();

$identityTokenResponse = $credentials->fetchIdentityToken("https://your-cloud-function-or-run-url-here");

$headers = [
    "Authorization: Bearer {$identityTokenResponse->getIdentityToken()}",
];

$curl = curl_init();

curl_setopt($curl, CURLOPT_URL, "https://your-cloud-function-or-run-url-here");
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);

// ...

模拟服务账户

您可以使用 服务账户模拟流程来模拟另一个 Google Cloud Platform 服务账户。假设运行以下代码的服务账户在虚构服务账户 other-account@some-project-id.iam.gserviceaccount.com 上具有 roles/iam.serviceAccountTokenCreator IAM 角色。

$fetcher = \ericnorris\GCPAuthContrib\OpinionatedDefaults::get()->makeImpersonatedCredentialsFetcher(
    "other-account@some-project-id.iam.gserviceaccount.com",
);

// calls will be authenticated using the other account's credentials
$storageClient = new \Google\Cloud\Storage\StorageClient([
    "credentialsFetcher" => $fetcher,
]);

// ...

确定项目ID

可能不支持所有凭证类型。

$credentials = \ericnorris\GCPAuthContrib\OpinionatedDefaults::get()->makeCredentials();

echo "project ID: {$credentials->fetchProjectID()}";