如何通过 https 从 localhost 调用 api

Posted

技术标签:

【中文标题】如何通过 https 从 localhost 调用 api【英文标题】:How to call api from localhost via https 【发布时间】:2018-02-05 01:20:32 【问题描述】:

我目前在一个开发 Web 应用程序的 2 人团队中。我正在开发客户端应用程序,而我的合作伙伴在一个单独的项目中开发后端。我的合作伙伴已将他的项目上传到我们的域 (https://api.example.com),并坚持只对后端的调用应通过 https。

当我开发我的客户端应用程序时,我通过 localhost 提供服务。问题是 localhost 默认通过 http 提供服务。我不知道如何通过 https 调用后端。

我正在通过 Angular 4 CLI 开发我的客户端应用程序。我曾尝试通过自签名证书通过https://localhost 为我的应用程序提供服务,但这样做时我遇到了可怕的问题,因为 Chrome 检测到的证书不是真实的。

所以我被困住了。通过 https 调用我们的开发服务器的最佳方式是什么?或者,我应该这样做吗?出于开发客户端应用程序的目的,合作伙伴是否应该向我提供不同的 api 端点?我们应该如何共同努力解决这个问题?

【问题讨论】:

您可以使用其他方式(例如 cURL)连接到 API 端点吗?如果您想从客户端代码发出 GET 请求,我不明白为什么您的开发服务器必须是 https。只需在客户端代码中使用 API 的完整地址,它应该可以工作 服务器只接受通过 https 的调用。当我调用服务器时:api.example.com/api/auth,chrome 会回复两条消息。第一个是 CORS 错误,指出“请求的资源上不存在 'Access-Control-Allow-Origin' 标头”。第二个是来自服务器的 401 未授权。我的合作伙伴是否应该更改服务器设置以使服务器接受这些请求?对安全有何影响? 所以我可以通过的唯一方法是如果我从 https 提供我的客户端应用程序。这是正确的方法吗?如果是这样,我如何让浏览器相信我的证书是有效的? 是的。 CORS 错误在您的服务器端。您需要使服务器能够接受来自其他站点的请求,即在这种情况下是您的开发服务器 那么开发服务器会是localhost:4200吗?还是我真的应该购买该网站所在的开发服务器,例如 dev.example.com? 【参考方案1】:

不,您可以继续使用 localhost:4200 作为您的开发服务器。只需在服务器端启用 CORS,在客户端代码中使用https://api.example.com,它应该可以工作。 AFAIK,您的问题是从外部客户端访问服务器,而不是 https

【讨论】:

是的,这是最好的选择。我与我的后端开发人员交谈,他终于启用了它。暂时消除了头痛。因此解决方案是让后端项目允许 CORS,但您仍然可以通过 https 进行 API 调用。这只是意味着我不必通过 https 托管我的客户端应用程序。【参考方案2】:

如果您在 chrome 上运行项目,有一个名为 ALLOW CROSS ORIGIN 的扩展程序,请下载该扩展程序并调用后端 API。

【讨论】:

这是一个 hack,只能少量使用。这是一个很好的尝试选择,但事实是我不得不与后端开发人员交谈,他们在 http 上打开了来自客户端的调用。 【参考方案3】:

另一种方法是使用 rec-la SLL 证书和域通过 HTTPS 公开本地页面。

https://<any hostname>.rec.la/ => https://localhost/

Rec-la on Github

【讨论】:

以上是关于如何通过 https 从 localhost 调用 api的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Axios 从 localhost VueJS 调用服务器?

如何通过Holer实现HTTP和HTTPS访问本机localhost WEB服务器

混合内容:从 https 页面调用来自 API 的 http 内容

如何从 angular localhost:4200 调用 spring security azure AD localhost:8080。天蓝色调用中的错误

从公网通过HTTP/HTTPS访问本机localhost网站

如何停止从 localhost 重定向到 https