验证HTTP请求的来源

时间:2019-04-11 15:18:04

标签: authentication cors restful-authentication

场景: 假设我有一个RESTful http(s)API,运行在公开IP +端口上的某个地方,现在我想创建一个与此API交互的简单前端。

约束:我想使用GitHub Pages来服务前端,我想将存储库公开。

问题:是否有一种方法可以设计API,以便仅从gh-pages网站发起的调用才能成功?也就是说,如果有人要分叉存储库并运行自己的前端版本,API会注意到该调用不是源自“官方” gh-pages网站吗?我真的很想知道我是否可以在API调用中提供某些东西,以证明该调用者正在从某个预定位置进行调用。

如果前端可以私有托管,那么我可以在两个服务器上都存储一个共享密钥,并使用该密钥进行身份验证,但是理想情况下,我希望能够通过GitHub页面托管此密钥(无需维护服务器)我的自我)。我可以以某种方式使用gh-pages网站将获得来自Github的适当证书的事实吗?还是该证书同样适用于所有gh-pages网站,因此对确定来源没有帮助?

我希望问题很清楚,任何输入将不胜感激!

2 个答案:

答案 0 :(得分:1)

gh-pages发出请求的假设是错误的。这些请求是从用户的ip浏览器发出的。任何用户都将从您自己的存储库或 fork 存储库中将网页的内容加载到浏览器中,但是对API的请求将通过用户的浏览器创建。

默认情况下,浏览器不允许在不同于html加载域的域上向api请求。因此,从https://pages.github.com/加载内容并请求您自己的私人服务器将失败,因为它将位于不同的域中(请参见CORS),但是有很多方法可以避免这种情况(请参见{{3} }。

因此,只要CORS对您足够(请参阅上面的链接如何启用对api的请求),您就不必担心。否则,您无能为力,只能授权客户。

答案 1 :(得分:0)

  

有没有一种方法可以设计API,以便仅从gh-pages网站发起的调用才能成功?

否。

您拥有的唯一信息是客户选择告诉您的信息。

客户端可能发送引荐来源标头。定制客户绝对可以撒谎。