我正在尝试服务一个公共网站从谷歌云SQL数据库(MySQL)。
因为它是一个公共网站,我发现我唯一的方法是使用API密钥,并将其添加到请求中,如下:...?key=FHkdvfio.....
如果我理解正确,云SQL数据库的终点应该看起来像这样:
jdbc:google:mysql://<my-instance-ip>:3306/<my-database-name>?key=....
我找不到的是一个如何使用这个API Key从JavaScript实际发送SQL查询的例子。
我使用JavaScript的原因是因为web客户端实际上是Google Apps Script驱动的Google Sheet,它的前光标JavaScript语言。
因为它是一个公共的,匿名的网站,我不能使用任何谷歌提供的库的应用程序脚本或连接/认证方法,因为最终用户是未知的,也没有识别或登录到任何已知的谷歌帐户从任何已知的IP地址。因此,API Key方法。
谁能告诉我正确的方向?总之;你不应该这样做,因为这是一种不安全的做法,并且MySQL数据库引擎不支持API密钥。您通常不希望允许公共访问甚至连接到您的数据库,因为它可能暴露安全风险。
通常,网站通过使用对后端服务器的API调用来处理此问题,这些调用以某种方式进行了身份验证。您可以通过托管您自己的服务(可能在Cloud Functions或Cloud Run中)来复制此模式,该服务对请求进行身份验证并执行实例所需的查询。
或者,考虑使用具有此功能的托管服务(可能是Firestore)。Firestore也将"按使用量付费",这意味着它的成本将随着你的流量而增加。我假定您正在遵循本文档在云SQL中使用API Key。请注意,该文档中提到的API Key是用于发送到Cloud SQL管理API的请求,Cloud SQL管理API是用于Cloud SQL实例管理的API,而不是用于访问存储在Cloud SQL数据库中的数据。您可以参考本文档了解更多有关Cloud SQL Admin API的信息。
如本文所述,建议使用Jdbc.getCloudSqlConnection(url)
连接Cloud SQL MySQL实例。url
应该有jdbc:google:mysql://subname
的形式,其中subname
是在Google云平台控制台的Cloud SQL实例概述页面上列出的实例连接名称,其格式为:PROJECT-ID:REGION:INSTANCE-ID
,而不是<my-instance-ip>:3306/<my-database-name>
。
为了访问Cloud SQL实例中的数据库,您需要提供适当的用户名和密码。您可以参考这里提到的示例代码。