如何在JavaScript中通过API Key发送Google Cloud SQL查询
核心认知纠正
首先需要明确:Google Cloud SQL 原生不支持直接通过API Key从公网客户端直接发起SQL查询,你设想的jdbc:google:mysql://<my-instance-ip>:3306/<my-database-name>?key=....的用法并不适用于公开客户端场景,该JDBC链接的API Key认证仅支持Google云内部的服务账号调用,不能直接暴露在前端或匿名访问的客户端侧。
适配你场景的可行实现方案
你当前的需求是匿名用户访问、基于Google Apps Script驱动,最合理的方式是增加一层中间代理层封装数据库操作,避免直接暴露Cloud SQL的访问权限,完全不需要用户登录Google账号即可使用:
- 你不需要让客户端直接连接Cloud SQL,而是在Apps Script中编写服务端逻辑完成数据库操作,再将Apps Script部署为支持匿名访问的Web App,客户端只需要调用这个Web App的接口获取数据即可
- 你可以自定义接口的校验Key作为访问凭证,完全符合你要求的API Key传参逻辑,不需要依赖Google官方的认证体系
服务端(Apps Script)示例代码
function doGet(e) { // 自定义API Key校验,和客户端约定的key放在请求参数中 const CUSTOM_API_KEY = "你自定义的访问校验密钥"; if (e.parameter.key !== CUSTOM_API_KEY) { return ContentService.createTextOutput(JSON.stringify({ code: 403, msg: "非法访问" })).setMimeType(ContentService.MimeType.JSON); } // 服务端内部建立Cloud SQL连接,所有数据库凭证仅保存在服务端,不对外暴露 const conn = Jdbc.getConnection( "jdbc:mysql://<你的Cloud SQL公网IP>:3306/<数据库名称>", "<数据库用户名>", "<数据库密码>" ); // 封装你需要的SQL操作,不要接收客户端传入的原生SQL语句,避免注入风险 const stmt = conn.createStatement(); const queryResult = stmt.executeQuery("SELECT * FROM <你要查询的表名> LIMIT 10"); // 处理查询结果转为JSON格式返回 const resultData = []; const columnCount = queryResult.getMetaData().getColumnCount(); while (queryResult.next()) { const row = {}; for (let i = 1; i <= columnCount; i++) { row[queryResult.getMetaData().getColumnName(i)] = queryResult.getString(i); } resultData.push(row); } // 释放数据库连接 queryResult.close(); stmt.close(); conn.close(); return ContentService.createTextOutput(JSON.stringify({ code: 200, data: resultData })).setMimeType(ContentService.MimeType.JSON); }
部署与客户端调用方法
- 在Apps Script编辑界面点击「部署」-「新建部署」,类型选择「Web App」,执行身份选择「我(你的账号)」,访问权限选择「任何人,甚至匿名用户」,完成部署后获取Web App的访问URL
- 客户端(包括Google Sheet内嵌脚本、公开站点JS)直接发起请求即可,不需要任何Google账号登录:
// 客户端调用示例 fetch("https://script.google.com/macros/s/<你的Web App部署ID>/exec?key=你自定义的访问校验密钥") .then(res => res.json()) .then(result => { console.log("查询结果:", result); })
注意事项
- 绝对不要将Cloud SQL的IP、用户名、密码等凭证写在客户端代码中,避免数据库被非法访问
- 中间层接口不要接收客户端传入的原生SQL语句,仅接收必要的业务参数,做好参数校验防止SQL注入
- 如需进一步提升安全性,可以在Cloud SQL的公网访问配置中,仅允许Google Apps Script的IP段访问数据库
内容的提问来源于stack exchange,提问作者Mor Sagmon
相关产品推荐
相关产品推荐

