通过 SSH 隧道访问端点

Posted

技术标签:

【中文标题】通过 SSH 隧道访问端点【英文标题】:Accessing endpoint via SSH tunnel 【发布时间】:2020-01-28 05:24:57 【问题描述】:

我正在我的本地机器 (localhost) 上运行一个开发项目,它试图通过 SSH 隧道(React JS SPA)从服务器上的端点加载数据。

SSH 隧道建立良好,端点在 Postman 中使用简单的 GET 运行时返回正确的数据包。

但是当我尝试从我的应用程序访问数据时(尝试获取和 Axios)返回 200,但不幸的是总是返回一个空数组 - 而不是 1k 对象数组。

以下是 2 个简单的请求,其中 'localhost:8912' 是暴露和映射的端口 - 在 Postman 中有效。

获取:

fetch("http://localhost:8912/ENDPOINT/")
  .then(res => console.log(res))
  .catch(err => 
    console.log(err);
    return null;
  );

Axios:

axios
  .get("http://localhost:8912/ENDPOINT/")
  .then(data => console.log(data.data))
  .catch(err => 
    console.log(err);
    return null;
  );

结果几乎立即在浏览器中返回,但由于服务器端计算,在 Postman 中需要几秒钟。

欢迎提出任何建议。

【问题讨论】:

你的隧道必须隧道到 api,而不是前端应用程序 隧道未连接到前端应用程序,它已连接到 api,api 映射到该 localhost 端口并且在浏览器之外工作正常 - 即我可以达到所有端点从我的本地机器从 Postman 等内部和 api 在浏览器中返回 200,只是没有任何数据包 - 就好像 Promise 在返回数据之前完成 - 在浏览器之外不是这种情况。 localhost 替换为127.0.0.1 会发生什么? 【参考方案1】:

尝试将 localhost 替换为 127.0.0.1

这可能与浏览器与 Postman 中的地址解析有关。

【讨论】:

我不敢相信这真的奏效了——有时这很简单。谢谢@janniks【参考方案2】:

如果您没有代理,您可以将 axios 与另一个 npm 库结合使用 — tunnel 以建立 HTTPS-over-HTTP 隧道:

    import axios,  AxiosInstance  from 'axios';
    import * as tunnel from 'tunnel';
    const agent = tunnel.httpsOverHttp(
        proxy: 
            host: 'proxy.mycorp.com',
            port: 8000,
        ,
    );
    const axiosClient: AxiosInstance = axios.create(
        baseURL: 'https://some.api.com:443',  // here I specify port 443
        httpsAgent: agent,
    );

参考:https://janmolak.com/node-js-axios-behind-corporate-proxies-8b17a6f31f9d

【讨论】:

【参考方案3】:
fetch("http://localhost:8912/ENDPOINT/")
  .then(res => return res.json())
  .then(res => console.log(res))
  .catch(err => 
    console.log(err);
    return null;
  );

fetch 返回一个对象作为 Promise,其中包含各种信息,如标头、HTTP 状态等。

你有 res.json() 和其他各种可能性。 .json() 只会将正文作为带有 json 内容的承诺返回。

欲了解更多信息:https://developer.mozilla.org/en-US/docs/Web/API/Fetch_API/Using_Fetch

您可以按如下方式返回数据:

.arrayBuffer() .blob() .json() .text() .formData()

【讨论】:

以上是关于通过 SSH 隧道访问端点的主要内容,如果未能解决你的问题,请参考以下文章

SSH 通过隧道访问远程客户端

通过ssh隧道访问mysql时如何配置mybatis属性

通过 SSH 隧道访问 SQL Server

通过 SSH 隧道访问 Ezproxy

ssh隧道理解

使用 JSch 通过 SSH 隧道访问生产环境中的 JMX