无需客户端ID,Chrome扩展如何认证调用Google Cloud API获取项目名称?
问题
我开发了一款Chrome扩展,用来给Google Cloud Console页面里的项目编号(格式如123456789012)添加tooltip,显示对应的项目名称。目前采用类似Chrome官方OAuth集成的方案,替换成launchWebAuthFlow以兼容Microsoft Edge,但这套方案需要配置OAuth客户端ID,分享给其他用户时遇到两个棘手问题:
- 用我个人Google Cloud项目的客户端ID:用户登录会占用我的令牌授予速率配额,而且用户必须信任我的应用,这不符合我的预期。
- 让每位用户自行创建应用/客户端ID并修改扩展清单:使用门槛太高,普通用户很难操作。
既然用户已经登录Google Cloud Console,我认为应该可以利用浏览器中已有的Cookie进行认证,但逆向分析发现页面请求用的是Authorization:SAPISIDHASH头,相关资料只有10多年前的Stack Overflow内容,没找到可行的实现方案。想问有没有无需维护OAuth客户端ID的替代方法,比如利用现有Cookie或其他方式拉取项目编号与名称的对应关系?
解决方案
1. 复用Google Cloud Console页面已加载的项目数据
Google Cloud Console作为单页应用,本身会在页面加载或交互时拉取项目信息,你可以直接从页面中提取这些数据:
- 监听页面的
fetch/XHR请求,捕获Cloud Resource Manager API的请求(比如projects.list或projects.get接口),从返回结果中提取项目编号与名称的映射关系。 - 检查页面全局变量,很多SPA会将项目数据存在内存中,通过Content Script注入代码访问页面上下文的变量,直接获取已加载的项目列表。
2. 拦截并复用页面的认证头
既然页面请求使用SAPISIDHASH认证,你可以通过扩展拦截页面的请求,提取有效认证头后复用:
- 在扩展清单中声明
declarativeNetRequest和对应Google Cloud域名的host_permissions,配置规则拦截页面的API请求,提取Authorization:SAPISIDHASH头信息。 - 用这个认证头直接调用Cloud Resource Manager API获取项目名称,由于请求的域名和原页面一致,不会有跨域问题,也无需额外OAuth配置。
3. 借助Google Cloud SDK本地认证(面向技术用户)
如果用户安装了gcloud SDK,可引导他们启用本地代理,扩展通过本地接口获取认证令牌:
- 让用户运行
gcloud auth application-default login生成本地凭据,然后启动gcloud本地代理(默认端口8085)。你的扩展直接调用本地代理接口获取临时令牌,用这个令牌调用API,全程无需你维护客户端ID,认证完全在用户本地完成。
4. 解析页面DOM中的项目名称
很多Google Cloud Console页面会在DOM中显示项目名称,你可以通过DOM选择器提取并关联项目编号:
- 比如页面顶部的项目选择器、侧边栏的项目列表里都有项目名称,你可以定位这些元素,结合页面中的项目编号上下文(比如当前页面所属项目、列表中的项目项)建立编号与名称的映射。
内容的提问来源于stack exchange,提问作者sunspots
相关产品推荐
相关产品推荐

