PHP 调用 Google API 官方鉴权指南:google/auth 库 OAuth 2.0 与 Application Default Credentials 实战解析
后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载本篇技术指南围绕 CRMEB 开源商城仓库中引入的官方 PHP 鉴权库google/auth位于 crmeb/vendor/google/auth展开系统讲解如何在 PHP 项目中基于 OAuth 2.0 完成 Google API 的授权与认证涵盖 Application Default CredentialsADC默认凭证、服务账号 JSON 密钥、Cloud Run / IAP 的 ID Token 场景以及 JWT 校验等核心能力。读完本文你将掌握从凭证准备、环境变量配置到 Guzzle 中间件挂载、API 调用的完整实战链路并理解该库在源码层面的实现原理。库概览Google 官方 PHP 鉴权库及其在仓库中的定位google/authGoogle Auth Library for PHP是 Google 官方维护的 PHP 客户端鉴权库用于在 PHP 应用中通过 OAuth 2.0 协议完成对 Google API 的授权Authorization与认证Authentication遵循 Apache 2.0 开源协议。其典型应用场景是当应用调用 Google Cloud API如 Drive、GCS 等时需要在请求中携带访问令牌且调用身份与应用本身绑定、与最终用户无关。在当前仓库中该库作为 Composer 依赖被完整引入。从 crmeb/composer.lock 可以看到其锁定版本为v1.20.1以 PSR-4 规范将Google\Auth\命名空间映射到 crmeb/vendor/google/auth/src。库源码的依赖约束记录在 crmeb/vendor/google/auth/composer.json 中PHP^7.1||^8.0firebase/php-jwt~5.0JWT 编解码底层实现guzzlehttp/guzzle^6.2.1|^7.0HTTP 客户端guzzlehttp/psr7、psr/http-message、psr/cache值得一提的是CRMEB 自身的登录态令牌体系也基于 JWT项目封装的 crmeb/crmeb/utils/JwtAuth.php 直接使用Firebase\JWT\JWT的encode/decode方法配合应用app_key签发和校验 HS256 令牌。这意味着理解google/auth的令牌机制与理解项目自身鉴权体系在原理上是贯通的。通过 Composer 安装官方推荐的安装方式是使用 Composer。先安装 Composer已安装可跳过curl -sS https://getcomposer.org/installer | php随后执行以下命令安装最新稳定版composer.phar require google/auth安装完成后库即被放置于vendor/google/auth目录并通过 Composer 自动加载。在当前 CRMEB 仓库中crmeb/vendor/google/auth/autoload.php 就是该库的自动加载入口。Application Default Credentials默认凭证体系库的核心能力之一是对 Google 的Application Default CredentialsADC机制的 PHP 实现。ADC 提供了一种无需在每处代码显式指定密钥文件的简化获取凭证方式适合应用以固定身份和固定授权级别调用 Google API 的场景尤其适合构建在 Google Compute Engine 上的应用。从源码看ApplicationDefaultCredentials.php 的getCredentials()方法实现了完整的凭证查找优先级链读取GOOGLE_APPLICATION_CREDENTIALS环境变量指向的 JSON 密钥文件CredentialsLoader::fromEnv()若环境变量未设置则尝试读取已知路径下的默认凭证文件CredentialsLoader::fromWellKnownFile()若在 App Engine 标准环境上运行使用AppIdentityCredentials若在 GCE 上运行则通过元数据服务器获取GCECredentials全部失败时抛出DomainException。该查找逻辑的具体实现位于 CredentialsLoader.phpfromEnv()读取环境变量、校验文件存在性并json_decode解析fromWellKnownFile()则按操作系统约定查找默认路径——Windows 为%APPDATA%/gcloud/application_default_credentials.json其他系统为$HOME/.config/gcloud/application_default_credentials.json。下载服务账号凭证 JSON使用 ADC 的第一步是在 Google Developers Console 的APIs Services Credentials页面从Add credentials下拉框中选择Service account下载一份服务账号凭证 JSON 文件。注意该文件是这些凭证的唯一副本。它不应被提交进源代码仓库而应被安全存储。下载后将文件路径写入GOOGLE_APPLICATION_CREDENTIALS环境变量putenv(GOOGLE_APPLICATION_CREDENTIALS/path/to/my/credentials.json);PHP 的putenv()只是设置环境变量的方式之一也可以考虑使用.htaccess或 Apache 配置文件设置。启用需要调用的 API发起 API 调用前必须在 Google Developers Console 的APIs Auth APIs页面启用目标 API。以下文示例为例需要启用Drive API。调用 API 的完整示例完成凭证准备和环境变量设置后即可通过 Guzzle 中间件将令牌注入请求。以下代码列出当前用户的 Drive 文件use Google\Auth\ApplicationDefaultCredentials; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; // 指定应用凭证路径 putenv(GOOGLE_APPLICATION_CREDENTIALS/path/to/my/credentials.json); // 定义本次 API 调用所需的 scopes $scopes [https://www.googleapis.com/auth/drive.readonly]; // 创建中间件 $middleware ApplicationDefaultCredentials::getMiddleware($scopes); $stack HandlerStack::create(); $stack-push($middleware); // 创建 HTTP 客户端 $client new Client([ handler $stack, base_uri https://www.googleapis.com, auth google_auth // 对所有请求授权 ]); // 发起请求 $response $client-get(drive/v2/files); // 展示结果 print_r((string) $response-getBody());源码层面的google_auth机制auth google_auth是整条链路的触发开关。查看 AuthTokenMiddleware.php 的__invoke()实现可以看到中间件会检查每个请求的auth选项只有等于google_auth时才将Authorization: Bearer token头写入请求否则直接透传。getMiddleware()内部会先调用getCredentials()完成凭证解析再包装为AuthTokenMiddleware。此外若凭证携带配额项目quota project中间件还会写入X-Goog-User-Project请求头用于账单归属。Guzzle 5 兼容写法若项目仍使用 Guzzle 5需将上述创建中间件与创建 HTTP 客户端两步替换为以下写法// 创建 HTTP 客户端 $client new Client([ base_url https://www.googleapis.com, auth google_auth // 对所有请求授权 ]); // 创建 subscriber $subscriber ApplicationDefaultCredentials::getSubscriber($scopes); $client-getEmitter()-attach($subscriber);使用 ID TokenCloud Run 与 Cloud Identity-Aware ProxyIAP当应用运行在 Cloud Run 之后或通过 Cloud Identity-Aware ProxyIAP保护资源时需要获取ID Token来访问应用。此时应使用ApplicationDefaultCredentials的静态方法getIdTokenMiddleware。use Google\Auth\ApplicationDefaultCredentials; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; // 指定应用凭证路径 putenv(GOOGLE_APPLICATION_CREDENTIALS/path/to/my/credentials.json); // 指定 ID Token 的 audience // 可以是与 IAP 应用关联的 Client ID // 也可以是 Cloud Run 应用的 URL // $targetAudience IAP_CLIENT_ID.apps.googleusercontent.com; // $targetAudience https://service-1234-uc.a.run.app; $targetAudience YOUR_ID_TOKEN_AUDIENCE; // 创建中间件 $middleware ApplicationDefaultCredentials::getIdTokenMiddleware($targetAudience); $stack HandlerStack::create(); $stack-push($middleware); // 创建 HTTP 客户端 $client new Client([ handler $stack, auth google_auth, // Cloud Run、IAP 或自定义资源的 URL base_uri https://YOUR_PROTECTED_RESOURCE, ]); // 发起请求 $response $client-get(/); // 展示结果 print_r((string) $response-getBody());从实现看getIdTokenMiddleware内部经由getIdTokenCredentials()见 ApplicationDefaultCredentials.php解析凭证并校验 JSON 密钥中的type字段必须是service_accountauthorized_user终端用户凭证不支持签发 ID Token否则抛出InvalidArgumentException。权限前提请以 Google Cloud 官方文档为准此处仅为背景说明调用 Cloud Run 服务时服务账号需要具备Cloud Run InvokerIAM 权限调用 IAP 时需要将搭建受保护资源时使用的 Client ID 作为 target audience 传入。使用 Proxy-Authorization 请求头场景如果应用部署在 Google Cloud IAP 等代理之后且应用的业务逻辑已经占用了Authorization请求头可将 ID Token 改放入Proxy-Authorization: Bearer请求头。IAP 会校验该头中的 ID Token 并放行请求同时将Authorization头原样传递给应用而不处理其内容。此时使用ApplicationDefaultCredentials::getProxyIdTokenMiddlewareuse Google\Auth\ApplicationDefaultCredentials; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; // 指定应用凭证路径 putenv(GOOGLE_APPLICATION_CREDENTIALS/path/to/my/credentials.json); // 指定 ID Token 的 audience可以是与 IAP 应用关联的 Client ID // $targetAudience IAP_CLIENT_ID.apps.googleusercontent.com; $targetAudience YOUR_ID_TOKEN_AUDIENCE; // 创建中间件 $middleware ApplicationDefaultCredentials::getProxyIdTokenMiddleware($targetAudience); $stack HandlerStack::create(); $stack-push($middleware); // 创建 HTTP 客户端 $client new Client([ handler $stack, auth [username, pass], // 由应用自行处理的 auth 选项 proxy_auth google_auth, ]); // 发起请求 $response $client-get(/); // 展示结果 print_r((string) $response-getBody());注意此处开关为proxy_auth google_auth中间件对应实现为Google\Auth\Middleware\ProxyAuthTokenMiddleware在 src/Middleware 目录中它与普通AuthTokenMiddleware的区别在于将 ID Token 写入Proxy-Authorization头而非Authorization头。指定 JSON Key 调用绕开环境变量若不想依赖GOOGLE_APPLICATION_CREDENTIALS环境变量而是显式指定某一 JSON 密钥可以使用CredentialsLoader::makeCredentials手动加载凭证use Google\Auth\CredentialsLoader; use Google\Auth\Middleware\AuthTokenMiddleware; use GuzzleHttp\Client; use GuzzleHttp\HandlerStack; // 定义 Google Application Credentials 数组 $jsonKey [key value]; // 定义本次 API 调用所需的 scopes $scopes [https://www.googleapis.com/auth/drive.readonly]; // 加载凭证 $creds CredentialsLoader::makeCredentials($scopes, $jsonKey); // 可选令牌缓存 // $creds new FetchAuthTokenCache($creds, $cacheConfig, $cache); // 创建中间件 $middleware new AuthTokenMiddleware($creds); $stack HandlerStack::create(); $stack-push($middleware); // 创建 HTTP 客户端 $client new Client([ handler $stack, base_uri https://www.googleapis.com, auth google_auth // 对所有请求授权 ]); // 发起请求 $response $client-get(drive/v2/files); // 展示结果 print_r((string) $response-getBody());从 CredentialsLoader.php 的实现可见makeCredentials()依据 JSON 密钥中的type字段决定凭证类型service_account生成ServiceAccountCredentialsauthorized_user生成UserRefreshCredentials其余值抛出InvalidArgumentException。凭证类均位于 crmeb/vendor/google/auth/src/Credentials 目录。JWT 校验验证 Google ID Token常规校验当使用 Google ID Token 认证用户时使用Google\Auth\AccessToken类进行校验use Google\Auth\AccessToken; $auth new AccessToken(); $auth-verify($idToken);IAP 场景下的校验若应用运行在 Google Identity-Aware ProxyIAP之后需要校验来自 IAP 服务器的 ID Token 时应指定 IAP 专用的证书 URL。原因是 IAP 使用与 Google 身份服务不同的密钥对 ID Token 签名use Google\Auth\AccessToken; $auth new AccessToken(); $auth-verify($idToken, [ certsLocation AccessToken::IAP_CERT_URL ]);查看 AccessToken.php 可确认两个关键常量默认证书地址FEDERATED_SIGNON_CERT_URL https://www.googleapis.com/oauth2/v3/certs以及 IAP 专用证书地址IAP_CERT_URL https://www.gstatic.com/iap/verify/public_key-jwk和IAP_ISSUER。verify()方法支持audience、issuer、certsLocation、cacheKey、throwException等配置项底层依赖firebase/php-jwt完成签名校验与过期检测并提供基于 PSR-6 的证书缓存默认使用MemoryCacheItemPool。结合 CRMEB 项目的实践视角依赖现状从 crmeb/composer.lock 可见google/auth以v1.20.1版本随 Composer 依赖树安装作为 Google 云相关 SDK 的传递依赖引入完整源码与文档均保留在 crmeb/vendor/google/auth。JWT 原理贯通本库通过firebase/php-jwt完成令牌的签发与校验CRMEB 项目自身的用户/管理员登录令牌同样基于Firebase\JWT\JWT实现见 crmeb/crmeb/utils/JwtAuth.php并设置了 60 秒leeway容差。理解本库有助于把握项目整体鉴权链路中 JWT 的编解码与密钥管理方式。适用前提若要真正调用 Google API需要具备 Google Cloud 项目、服务账号凭证并启用对应 API若仅运行 CRMEB 商城本身则无需使用本库项目自身的鉴权体系已由内置中间件与 JWT 工具类完成。总结google/auth提供了从 ADC 自动发现、服务账号密钥加载、Guzzle 中间件注入到 ID Token 获取与 JWT 校验的一站式 PHP 鉴权能力。掌握凭证查找优先级链 google_auth触发开关 中间件注入这条主线即可在任意 PHP 项目中稳定、安全地接入 Google API而理解其基于firebase/php-jwt的底层令牌机制也能帮助你更好地理解像 CRMEB 这样依赖 JWT 构建鉴权体系的 PHP 应用的内部原理。赞分享后端电商前端【免费下载链接】CRMEBCRMEB开源商城免费开源多语言商城系统Tp6框架商城系统可商用包含小程序商城、H5商城、公众号商城、PC商城、App支持分销、拼团、砍价、秒杀、优惠券、积分、会员等级、小程序直播、页面DIY前后端分离方便二开更有详细使用文档、接口文档、数据字典、二开文档/视频教程欢迎大家提出宝贵意见和建议项目地址https://gitcode.com/gh_mirrors/cr/CRMEB点击查看免费下载相关推荐google-api-python-client 的 OAuth 2.0 授权完整指南从 Flow 到 Credentials 的实战全解google api python client 的 OAuth 2.0 授权完整指南从 Flow 到 Credentials 的实战全解 导读 本文以官方仓后端google-api-php-client 服务账号 OAuth 2.0Server to Server授权实战指南google api php client 服务账号 OAuth 2.0Server to Server授权实战指南 服务账号Service Accoun后端使用 google-api-nodejs-client 运行 Google Glass Mirror API 示例OAuth 2.0 授权实战使用 google api nodejs client 运行 Google Glass Mirror API 示例OAuth 2.0 授权实战 导读 本文围绕后端创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

STM32F1 HAL驱动包拆解:从目录结构到调试实战

STM32F1 HAL驱动包拆解:从目录结构到调试实战

简介:这份资源是面向STM32F1XX系列开发者的HAL库驱动压缩包,专为Keil MDK 5工程设计,可在不依赖STM32CubeMX的情况下搭建HAL库开发环境,适合嵌入式入门及中高级开发者快速接入外设驱动。压缩包共137个文件,含76个.h头文…

2026/10/15 15:27:16 阅读更多 →
Moonlight V+ for PC 多平台安装指南:Windows、macOS、Linux 与 Steam Link 一站配齐

Moonlight V+ for PC 多平台安装指南:Windows、macOS、Linux 与 Steam Link 一站配齐

【免费下载链接】moonlight-qt GameStream client for PCs (Windows, Mac, Linux, and Steam Link) 项目地址: https://gitcode.com/gh_mirrors/moo/moonlight-qt 点击查看 免费下载 Moonlight V for PC 是一款面向 Windows、macOS、Linux 和 Steam Link 的游戏串流…

2026/10/15 15:26:14 阅读更多 →
STM32驱动DHT11温湿度传感器:单总线时序与底层驱动实战

STM32驱动DHT11温湿度传感器:单总线时序与底层驱动实战

搞完STM32基础外设之后,最想做的事往往不是继续点灯,而是找一个真实又便宜的外部传感器,把学到的GPIO、定时器、串口串起来。DHT11温湿度传感器正好满足这个需求:几块钱一片,带单总线时序,有校验和&#xf…

2026/10/15 15:26:14 阅读更多 →

最新新闻

串口与CAN双通道工业通信实战:硬件设计到C#STM32协同调试

串口与CAN双通道工业通信实战:硬件设计到C#STM32协同调试

1. 为什么串口CAN组合仍是工业现场最稳的通讯底座在某高校自动化实验室调试一套电机驱动监控系统时,我遇到一个典型场景:上位机(Windows PC)需要实时读取下位机(STM32F4系列主控板)采集的电流、温度、转速三…

2026/10/15 16:06:27 阅读更多 →
字符编码转换全解析:从BOM识别到批量工具实现

字符编码转换全解析:从BOM识别到批量工具实现

简介:面向PHP开发者的字符编码转换类,支持ANSI、Unicode(含Little Endian与Big Endian)、UTF-8及UTF-8BOM五种格式互转,可有效规避多来源文本在页面展示、文件读写中的乱码问题。类中封装了编码自动检测、字符串转换以…

2026/10/15 16:06:27 阅读更多 →
NVIDIA驱动升级导致SDDM黑屏:EGL库路径与Xorg配置修复指南

NVIDIA驱动升级导致SDDM黑屏:EGL库路径与Xorg配置修复指南

1. 黑屏现场还原:不是显卡坏了,是登录管理器“隐身”了那天早上按惯常流程开机,主机风扇转得挺欢,显示器也亮着——但画面是纯黑的。键盘灯正常,Caps Lock能切换,鼠标指针在漆黑背景上滑动自如,…

2026/10/15 16:06:27 阅读更多 →
瑞芯微RK平台摄像头排障全链路指南|资深工程师排障笔记,干货收藏备用-上

瑞芯微RK平台摄像头排障全链路指南|资深工程师排障笔记,干货收藏备用-上

本文基于触觉智能RK3576开发板Purple Pi OH2演示,为大家整理一套摄像头异常排障全链路指南!上篇主要讲解排查链路和录像花屏条纹常见问题环节。开篇相机问题的本质是:数据流走到哪一段断了、或哪一段处理不对。本文把摄像头链路从头到尾讲透—…

2026/10/15 16:06:27 阅读更多 →
Qt RTSP播放器实战:FFmpeg解码与多线程优化

Qt RTSP播放器实战:FFmpeg解码与多线程优化

简介:本资源面向具备一定C与Qt基础的开发者,提供一套基于Qt、RTSP协议与FFmpeg库实现的视频流播放器完整工程,可用于远程监控、视频会议、在线教育等需要多路实时视频播放的场景。工程重点实现三通道视频流同时播放与截图功能,通过…

2026/10/15 16:06:27 阅读更多 →
光学工程师笔试题深度解析:从Zemax实操到公差分析的能力地图

光学工程师笔试题深度解析:从Zemax实操到公差分析的能力地图

简介:这是一份面向光学工程师求职者与光学相关专业学生的笔试真题文档,聚焦光学基础理论与工程应用能力的综合考查。内容涵盖图解法求像、填空题与计算题三大板块:图解法要求判断成像方向、标注理想光学系统基点位置与焦距;填空题…

2026/10/15 16:05:26 阅读更多 →

日新闻

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

Docker Compose 容器化部署 ChirpStack LoRaWAN 网络服务器实战

1. 为什么选择容器化方式部署 LoRa 网络服务LoRa 物联网项目落地时,网络服务器是整个链路的核心枢纽。它负责接收网关上报的数据包、完成去重与解密、再把有效载荷分发给上层应用。早期大家习惯把网络服务器直接装在物理机上,依赖一堆系统库和特定版本的…

2026/10/15 0:00:46 阅读更多 →
共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

共享LLM服务下的跨模型自动扩缩容:Kubernetes实战与避坑指南

1. 共享推理服务里,扩缩容到底难在哪做过大模型推理服务部署的人,大概都经历过这样的场景:一个团队共用一套推理集群,A 业务跑的是 7B 的小模型,B 业务跑的是 72B 的大模型,C 业务白天流量高、晚上几乎归零…

2026/10/15 0:00:46 阅读更多 →
Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

Systemd 启动阶段根文件系统只读之谜:fstab 与 remount-fs 服务深度解析

1. 引子:一次内核恐慌引发的追查先从一个真实场景说起。某次我给一台老旧的嵌入式设备折腾系统裁减,为了把启动时间压进两秒以内,我手贱地把一串自认为“没用”的 systemd 服务给 disable 了,其中就包括systemd-remount-fs.servic…

2026/10/15 0:00:46 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/14 3:30:28 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/14 16:30:29 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/15 13:48:15 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/14 22:45:47 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 9:49:14 阅读更多 →