使用 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 调用的主要内容,如果未能解决你的问题,请参考以下文章