You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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);
}

部署与客户端调用方法

  1. 在Apps Script编辑界面点击「部署」-「新建部署」,类型选择「Web App」,执行身份选择「我(你的账号)」,访问权限选择「任何人,甚至匿名用户」,完成部署后获取Web App的访问URL
  2. 客户端(包括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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 18:18:04