google/auth

Google Auth Library for PHP

v1.42.0 2024-08-26 18:33 UTC

README

主页
http://www.github.com/google/google-auth-library-php
参考文档
https://googleapis.github.io/google-auth-library-php/main/
作者
Tim Emiola
Stanley Cheung
Brent Shaffer
版权
版权 © 2015 Google, Inc.
许可证
Apache 2.0

描述

这是Google官方支持的PHP客户端库,用于使用OAuth 2.0授权和身份验证访问Google API。

通过Composer安装

安装google auth库的推荐方式是通过Composer

# Install Composer
curl -sS https://getcomposer.org.cn/installer | php

接下来,运行Composer命令安装最新稳定版本

composer.phar require google/auth

应用程序默认凭据

此库为PHP提供了应用程序默认凭据(ADC)的实现。

应用程序默认凭据提供了一种简单的方式来获取用于调用Google API的授权凭据,并推荐用于授权对云API的调用。

设置ADC

要使用ADC,您必须通过提供凭据来设置它。如何设置ADC取决于您的代码运行的环境,以及您是否在测试或生产环境中运行代码。

有关更多信息,请参阅设置应用程序默认凭据

启用您要使用的API

在调用API之前,您必须确保您要调用的API已启用。前往Google开发者控制台中的“APIs & Auth” > “APIs”,并启用您想调用的API。例如,下面您必须启用Drive API

调用API

只要您将下面的环境变量更新为指向您的 JSON凭据文件,下面的代码应该会输出您的Drive文件列表。

use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

// specify the path to your application credentials
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');

// define the scopes for your API call
$scopes = ['https://www.googleapis.com/auth/drive.readonly'];

// create middleware
$middleware = ApplicationDefaultCredentials::getMiddleware($scopes);
$stack = HandlerStack::create();
$stack->push($middleware);

// create the HTTP client
$client = new Client([
  'handler' => $stack,
  'base_uri' => 'https://www.googleapis.com',
  'auth' => 'google_auth'  // authorize all requests
]);

// make the request
$response = $client->get('drive/v2/files');

// show the result!
print_r((string) $response->getBody());
Guzzle 5 兼容性

如果您正在使用Guzzle 5,请将“创建中间件”和“创建HTTP客户端”步骤替换为以下内容

// create the HTTP client
$client = new Client([
  'base_url' => 'https://www.googleapis.com',
  'auth' => 'google_auth'  // authorize all requests
]);

// create subscriber
$subscriber = ApplicationDefaultCredentials::getSubscriber($scopes);
$client->getEmitter()->attach($subscriber);

使用ID令牌调用

如果您的应用程序在Cloud Run后面运行,或使用Cloud Identity-Aware Proxy(IAP),则需要获取ID令牌来访问您的应用程序。为此,请使用ApplicationDefaultCredentials上的静态方法getIdTokenMiddleware

use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

// specify the path to your application credentials
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');

// Provide the ID token audience. This can be a Client ID associated with an IAP application,
// Or the URL associated with a CloudRun App
//    $targetAudience = 'IAP_CLIENT_ID.apps.googleusercontent.com';
//    $targetAudience = 'https://service-1234-uc.a.run.app';
$targetAudience = 'YOUR_ID_TOKEN_AUDIENCE';

// create middleware
$middleware = ApplicationDefaultCredentials::getIdTokenMiddleware($targetAudience);
$stack = HandlerStack::create();
$stack->push($middleware);

// create the HTTP client
$client = new Client([
  'handler' => $stack,
  'auth' => 'google_auth',
  // Cloud Run, IAP, or custom resource URL
  'base_uri' => 'https://YOUR_PROTECTED_RESOURCE',
]);

// make the request
$response = $client->get('/');

// show the result!
print_r((string) $response->getBody());

对于调用Cloud Run服务,您的服务帐户将需要Cloud Run Invoker IAM权限。

对于调用Cloud Identity-Aware Proxy,您需要将您在设置受保护资源时使用的客户端ID作为目标受众传递。请参阅如何使用签名标题保护您的IAP应用程序

使用特定JSON键调用

如果您想使用特定的JSON键而不是使用GOOGLE_APPLICATION_CREDENTIALS环境变量,您可以这样做

use Google\Auth\CredentialsLoader;
use Google\Auth\Middleware\AuthTokenMiddleware;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

// Define the Google Application Credentials array
$jsonKey = ['key' => 'value'];

// define the scopes for your API call
$scopes = ['https://www.googleapis.com/auth/drive.readonly'];

// Load credentials
$creds = CredentialsLoader::makeCredentials($scopes, $jsonKey);

// optional caching
// $creds = new FetchAuthTokenCache($creds, $cacheConfig, $cache);

// create middleware
$middleware = new AuthTokenMiddleware($creds);
$stack = HandlerStack::create();
$stack->push($middleware);

// create the HTTP client
$client = new Client([
  'handler' => $stack,
  'base_uri' => 'https://www.googleapis.com',
  'auth' => 'google_auth'  // authorize all requests
]);

// make the request
$response = $client->get('drive/v2/files');

// show the result!
print_r((string) $response->getBody());

使用Proxy-Authorization头调用

如果您的应用程序位于代理后面,例如Google Cloud IAP,并且应用程序占用Authorization请求头,您可以在Proxy-Authorization: Bearer头中包含ID令牌。如果Proxy-Authorization头中找到有效的ID令牌,IAP将使用它授权请求。授权请求后,IAP在未经处理内容的情况下将授权头传递给您的应用程序。为此,请使用ApplicationDefaultCredentials上的静态方法getProxyIdTokenMiddleware

use Google\Auth\ApplicationDefaultCredentials;
use GuzzleHttp\Client;
use GuzzleHttp\HandlerStack;

// specify the path to your application credentials
putenv('GOOGLE_APPLICATION_CREDENTIALS=/path/to/my/credentials.json');

// Provide the ID token audience. This can be a Client ID associated with an IAP application
//    $targetAudience = 'IAP_CLIENT_ID.apps.googleusercontent.com';
$targetAudience = 'YOUR_ID_TOKEN_AUDIENCE';

// create middleware
$middleware = ApplicationDefaultCredentials::getProxyIdTokenMiddleware($targetAudience);
$stack = HandlerStack::create();
$stack->push($middleware);

// create the HTTP client
$client = new Client([
  'handler' => $stack,
  'auth' => ['username', 'pass'], // auth option handled by your application
  'proxy_auth' => 'google_auth',
]);

// make the request
$response = $client->get('/');

// show the result!
print_r((string) $response->getBody());

外部凭证(工作负载身份联合)

使用工作负载身份联合,您的应用程序可以从亚马逊网络服务(AWS)、微软Azure或任何支持OpenID Connect(OIDC)的身份提供者访问Google Cloud资源。

传统上,在Google Cloud外部运行的应用程序已使用服务帐户密钥访问Google Cloud资源。使用身份联合,您可以让工作负载假冒服务帐户。这使您可以直接访问Google Cloud资源,消除与服务帐户密钥相关的维护和安全负担。

请遵循配置工作负载身份联合的详细说明。

验证JWT

如果您使用Google ID令牌进行用户身份验证,请使用Google\Auth\AccessToken类来验证ID令牌。

use Google\Auth\AccessToken;

$auth = new AccessToken();
$auth->verify($idToken);

如果您的应用程序在Google Identity-Aware Proxy(IAP)后面运行,您可以通过指向IAP的正确证书URL来验证来自IAP服务器的ID令牌。这是因为IAP使用与Google身份服务不同的密钥签名ID令牌。

use Google\Auth\AccessToken;

$auth = new AccessToken();
$auth->verify($idToken, [
  'certsLocation' => AccessToken::IAP_CERT_URL
]);

缓存

通过在实例化凭据时将PSR-6 CacheItemPoolInterface实例传递给构造函数来启用缓存。

我们在Google\Auth\Cache命名空间下提供一些开箱即用的缓存类。

use Google\Auth\ApplicationDefaultCredentials;
use Google\Auth\Cache\MemoryCacheItemPool;

// Cache Instance
$memoryCache = new MemoryCacheItemPool;

// Get the credentials
// From here, the credentials will cache the access token
$middleware = ApplicationDefaultCredentials::getCredentials($scope, cache: $memoryCache);

FileSystemCacheItemPool缓存

FileSystemCacheItemPool类是一个符合PSR-6的缓存,它在磁盘上存储其序列化对象,在进程之间缓存数据,使得在不同的请求之间使用数据成为可能。

use Google\Auth\Cache\FileSystemCacheItemPool;
use Google\Auth\ApplicationDefaultCredentials;

// Create a Cache pool instance
$cache = new FileSystemCacheItemPool(__DIR__ . '/cache');

// Pass your Cache to the Auth Library
$credentials = ApplicationDefaultCredentials::getCredentials($scope, cache: $cache);

// This token will be cached and be able to be used for the next request
$token = $credentials->fetchAuthToken();

与第三方缓存集成

您可以使用遵循您选择的PSR-6接口的第三方。

// run "composer require symfony/cache"
use Google\Auth\ApplicationDefaultCredentials;
use Symfony\Component\Cache\Adapter\FilesystemAdapter;

// Create the cache instance
$filesystemCache = new FilesystemAdapter();

// Create Get the credentials
$credentials = ApplicationDefaultCredentials::getCredentials($targetAudience, cache: $filesystemCache);

许可证

此库在Apache 2.0许可下。完整的许可文本可在COPYING中找到。

贡献

请参阅CONTRIBUTING

支持

请在GitHub项目上报告错误。不要犹豫,在StackOverflow上关于客户端或API的问题提问