如何使用Node.js OAuth2获取谷歌云平台(GCP)终端用户的项目列表
可行实现方案
方案1:直接调用BigQuery原生projects.list接口(推荐,无需额外API启用操作)
这个方案完全依赖你已经可用的BigQuery访问权限,不需要启用Resource Manager API,也不需要终端用户做额外操作,返回的是用户有权限访问且可正常使用BigQuery服务的项目列表,刚好匹配你后续用所选项目访问BigQuery的使用场景。
前置要求
- 你之前申请OAuth授权时已经添加了以下任意一个scope:
https://www.googleapis.com/auth/bigquery.readonly(只读权限足够)https://www.googleapis.com/auth/bigqueryhttps://www.googleapis.com/auth/cloud-platform
如果你之前的授权已经包含上述scope,可以直接调用,无需重新走授权流程。
代码实现(Node.js)
方式1:使用官方BigQuery客户端(推荐)
如果你已经引入了@google-cloud/bigquery依赖,可直接调用内置方法:
const { BigQuery } = require('@google-cloud/bigquery'); // 传入你已经兑换好凭证的OAuth2客户端实例 const bigquery = new BigQuery({ authClient: yourAuthorizedOAuth2Client }); async function listUserProjects() { const [projects] = await bigquery.getProjects(); // projects数组即为项目列表,每个元素包含id、projectId、friendlyName等字段 return projects.map(p => ({ id: p.id, projectId: p.projectId, name: p.friendlyName })); }
方式2:直接发HTTP请求(无需引入BigQuery依赖)
如果你不想额外引入BigQuery客户端,可直接用现有access token调用REST接口:
const fetch = require('node-fetch'); async function listUserProjects(accessToken) { const res = await fetch('https://bigquery.googleapis.com/bigquery/v2/projects', { headers: { Authorization: `Bearer ${accessToken}` } }); const data = await res.json(); return data.projects?.map(p => ({ id: p.id, projectId: p.projectReference?.projectId, name: p.friendlyName })) || []; }
方案2:使用Resource Manager API(可返回全量项目,无需终端用户启用API)
如果你需要返回用户名下所有的GCP项目(无论是否启用BigQuery服务),这里要先澄清一个常见误解:nodejs-resource-manager库要求启用Resource Manager API的对象是你作为开发者申请OAuth客户端ID的所属GCP项目,而非终端用户的个人项目,终端用户完全感知不到这个操作,不需要做任何额外配置。
你只需要在自己的开发者GCP项目中启用Resource Manager API,授权时添加https://www.googleapis.com/auth/cloudplatformprojects.readonly scope,即可直接调用接口拉取全量项目列表,无需终端用户操作。
内容的提问来源于stack exchange,提问作者Edward Louth
相关产品推荐
相关产品推荐

