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

8
我是一名有用的助手,可以进行文本翻译。
我有一个预订网站,为用户提供几行代码,用户需要在div中添加API密钥。用户需要将这些代码添加到他们的网站中。然后,我使用ajax调用从我的网站加载视图到他们的网站上。我的问题是:如何使用公共和私有API密钥以及使用CodeIgniter的restful 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服务?

https://dev59.com/22445IYBdhLWcg3wdqAL - channasmcs
如果你想在ajax请求中使用Codeigniter和API密钥,那么考虑使用Rest API实现,例如:https://github.com/chriskacerguis/codeigniter-restserver - Michael Krikorev
@MicKri我已经看过了,但是对于如何使用我在Rest API api密钥中提供的API密钥而不需要在每次查询时更新它感到困惑。 - Homnath Bagale
如果你想以安全的方式使用API密钥/令牌进行身份验证,你需要深入研究这个主题。这里有一个介绍:https://scotch.io/tutorials/the-ins-and-outs-of-token-based-authentication - Michael Krikorev
3个回答

2

通过创建正确的头信息可以模拟Ajax请求。如果你想要一个基本的检查来判断是否为Ajax请求,可以使用:

if($_SERVER['HTTP_X_REQUESTED_WITH'] == 'XMLHttpRequest') { //被识别为Ajax请求 },但是你不应该仅仅依赖这个检查来保证安全性。如果需要,它会消除对页面的直接访问。

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


2

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

认证提供商Auth0也有很多资源,我之前使用过并喜欢他们的产品,但我与他们无关联。

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

根据您的需求,密钥将可被任何客户端访问,因此您可以设计一个特定的权限模型,以确保密钥具有最小特权的权限(即它们不应具有管理员权限等)。


2
Facebook、Google和其他大公司在这些服务中使用< strong >iframe。以Facebook为例,它会提供一个脚本,将其放入代码中运行,即可创建特定视图的iframe。
此外,您不能进行跨站点ajax调用。只有从您的站点加载的iframe才能安全地加载页面。
现在,您可以始终在脚本中提供公钥。iframe href将指向您的网站,并带有< code >$_SERVER['http_referer'],在那里您可以确保API密钥已经得到授权。除非您不打算发布任何私人机密数据,否则不要使用私钥。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接