使用 RESTful 服务保护跨域的 API 调用

Posted

技术标签:

【中文标题】使用 RESTful 服务保护跨域的 API 调用【英文标题】:Securing API calls from cross domain using RESTful service 【发布时间】:2017-06-04 00:37:03 【问题描述】:

我有一个预订网站,我从该网站向用户提供几行代码,并在其中将 API 密钥与代码一起添加到 div 中。用户需要在他们的网站中添加这些代码。然后我使用 ajax 调用从我的网站加载视图。我关心的是:如何使用公共和私有 API 密钥以及使用 codeIgniter 的宁静 Web 服务来确保这些调用的安全?

我提供给用户的代码看起来像

    <link rel="stylesheet" type="text/css" href="http://localhost/bookingpoints_com/apiTesting/styles/first.css" />
    <script src="http://localhost/bookingpoints_com/contents/scripts/jquery.js" ></script>
    <script src="http://localhost/bookingpoints_com/contents/scripts/apiused.js" ></script>
    <script src="http://localhost/bookingpoints_com/apiTesting/scripts/common.js" ></script>         
    <div id="api-data-reserve" name="Njc4ZDI5ZDZiN2RlYzIxMzM1N2U3ZWRkOGEwYjhlNThhZmZiNDNjNXRlc3QgY29kZTE=" data="Njc4ZDI5ZDZiN2RlYzIxMzM1N2U3ZWRkOGEwYjhlNThhZmZiNDNjNW1HVnZ3YVhMRVc=" sitekey="Njc4ZDI5ZDZiN2RlYzIxMzM1N2U3ZWRkOGEwYjhlNThhZmZiNDNjNQ=="></div>

通过这些代码行,我对我的站点进行 ajax 调用并在用户站点上呈现视图。我怎样才能让它像谷歌的客户端和密钥结构一样工作,使用纯 API 架构使用 RESTful 服务进行身份验证?

【问题讨论】:

***.com/questions/4850702/… 如果你想在 ajax 请求中使用 Codeigniter 和 API 密钥,那么考虑使用 Rest API 实现,例如:github.com/chriskacerguis/codeigniter-restserver @MicKri 我已经完成了它,但对如何使用我在 Rest API api 密钥中提供的 API 密钥而不是在每个查询中更新它感到困惑。 如果您想以安全的方式使用基于 API 密钥/令牌的身份验证,您需要深入研究该主题。这里有一个介绍:scotch.io/tutorials/… 【参考方案1】:

Ajax 请求可以通过创建 正确的标题。如果你想有一个基本的检查,看看是否 request 是一个可以使用的 Ajax 请求:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') //Request identified as ajax request , 但是你不应该基于你的 这张支票的安全。它将消除对页面的直接访问 如果这是你需要的。

但这还不够,您必须使用服务器端脚本(例如 php)来保护您的 Ajax 调用。例如,如果您的 AJAX 将密钥传递给 PHP 文件,请在 PHP 文件中编写代码以确保该密钥是正确的。

【讨论】:

【参考方案2】:

Facebook、Google 和其他大公司使用 iframe 提供此类服务。 以 facebook 为例,它为您提供脚本以输入代码,该代码在运行时将为特定视图创建一个 iframe。

您也不能进行跨站点 ajax 调用。只有从您的网站加载的 iframe 才能安全地加载页面。

现在有了密钥,您可以随时在脚本中提供公钥。 iframe href 将指向您的网站$_SERVER['http_referer'],您可以在其中确保 api 密钥已获得授权。除非您不打算发布任何私人机密数据,否则请勿使用私钥。

【讨论】:

【参考方案3】:

不久前我写了一篇关于保护 REST API 的文章,特别是那些被浏览器使用的 API。我建议看看https://www.moesif.com/blog/technical/restful-apis/Authorization-on-RESTful-APIs/

Auth0,一个身份验证提供者也有很多资源,除了以前使用过它们并且喜欢他们的产品之外,我没有任何隶属关系。

许多 API 都通过 JWT 保护,这很好,因为它们允许您在没有集中式身份验证服务器的情况下对 API 调用进行身份验证。它们基于公共/私有加密算法,其中两个密钥在数学上相关。密钥是在受信任的环境(例如您的服务器)中生成的,但任何人都可以验证它们来自他们所说的那个人。您可以设计其他身份验证令牌方案。

根据您的需要,任何客户端都可以访问密钥,因此您可以设计特定的权限模型以确保密钥具有最低权限(即它们不应该具有管理员权限等)

【讨论】:

以上是关于使用 RESTful 服务保护跨域的 API 调用的主要内容,如果未能解决你的问题,请参考以下文章

Web开发中怎么用RESTful做后端API

Web开发中怎么用RESTful做后端API

使用 JWT 保护用于验证客户端的 RESTful API

如何保护移动和 AJAX 调用的 JSON RESTful API?

来自网站客户端脚本的 WCF RESTful 服务跨域访问

vue跨域的问题,在开发环境下