如何在Node.js中使用带外部认证的Trino编程客户端?
问题描述
我正在使用Trino与OpenSky(一个航班记录(ADSB)历史数据库)通信,作为OpenSky网络的贡献者,我拥有已获批的凭证。
OpenSky快速指南展示了如何通过CLI使用Trino:
trino --user=USER --password --server=https://trino.opensky-network.org --external-authentication --catalog "minio" --schema "osky"
执行该命令后可成功连接并在终端运行查询,但移除--external-authentication标志会导致凭证无效错误。
由于Trino客户端将运行在Node.js服务器后端,我需要使用编程客户端trino-client:
const trino: Trino = Trino.create({ server: "https://trino.opensky-network.org", catalog: 'minio', schema: 'osky', auth: new BasicAuth(process.env.OPENSKY_USERNAME as string, process.env.OPENSKY_PASSWORD as string), });
但此代码会触发相同的凭证无效错误,我判断原因是该编程客户端使用的是BasicAuth而非外部认证(CLI的外部认证会自动打开浏览器登录)。
请问是否可以使用带外部认证的Trino编程客户端?若可行,能否在Node.js的trino-client中实现,还是需要更换其他客户端?只要是编程式实现即可。
解决方案
Trino的外部认证本质是基于OAuth2/OpenID Connect的流程,CLI的--external-authentication是通过浏览器完成授权码流程获取令牌,再用令牌访问Trino。要在Node.js后端实现这个流程,有两种可行方式:
1. 扩展现有trino-client实现外部认证
官方Node.js trino-client本身不直接支持外部认证,但可以手动完成OAuth2授权流程,获取访问令牌后,通过自定义认证方式传入客户端:
- 步骤1:构造OpenSky Trino的授权URL,需提前确认OpenSky支持的OAuth2客户端配置(可参考CLI的隐含配置逻辑)
- 步骤2:在后端通过HTTP请求完成授权流程,无头服务器端推荐使用设备授权流,无需浏览器交互,更适配后端场景
- 步骤3:获取到
access_token后,自定义认证类,在请求时将令牌放在Authorization头的Bearer字段中
示例代码大致如下:
const { Trino, Auth } = require('trino-client'); class BearerAuth extends Auth { constructor(token) { super(); this.token = token; } async getAuthorizationHeader() { return `Bearer ${this.token}`; } } // 假设已通过OAuth2流程获取到有效accessToken const trino = Trino.create({ server: "https://trino.opensky-network.org", catalog: 'minio', schema: 'osky', auth: new BearerAuth(accessToken), });
2. 选择支持外部认证的第三方客户端
如果不想手动实现流程,可考虑:
- 通过Node.js的
child_process调用Trino CLI命令,在后端执行查询(适合简单场景) - 使用支持OAuth2流程的第三方Trino客户端库
不过最直接高效的还是手动实现Bearer令牌认证,因为外部认证最终都是通过Bearer令牌完成请求授权的。
内容的提问来源于stack exchange,提问作者M. Nicol
相关产品推荐
相关产品推荐

