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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 03:51:06