使用PHP,你如何安全的身份验证的API调用,跨域,用以下标准:
一些背景:请在回答之前仔细阅读......
我的Web应用程序将通过下面的调用在客户端的网站上显示一个javascript小部件.因此,我们讨论的是对要提供的脚本进行跨域身份验证,但仅针对真正的客户端和仅针对给定的URL!
目前,CLIENT的网站可以通过单行javascript包含小部件.
示例client-website.com/page/with/my-widget
<head>
...
<script src="//ws.my-webappserver.com/little-widget/?key=api_key"></script>
...
</head>
Run Code Online (Sandbox Code Playgroud)
现在,实际上这不是直接调用javascript而是在我的远程服务器上的PHP脚本,它位于实际的javascript前面,用于进行一些身份验证.
上面调用背后的PHP脚本首先执行此操作:
这是简化的,但实质上服务器看起来像:
if ($_SERVER['HTTP_REFERER'] !== "http://client-website.com/page/with/my-widget")
&& $_REQUEST["Key"] == "the_long_api_key") {
header("Content-type: application/x-javascript");
echo file_get_contents($thewidgetJS_in_secret_location_on_server);
} else {
//pretend to be a 404 page not found or some funky thing like that
}
Run Code Online (Sandbox Code Playgroud)
***小部件只允许在某些网站/页面上运行
现在,问题出在这里:
还有一点障碍:我无法告诉客户将密钥粘贴在服务器上的php脚本中,因为它们可以运行任何服务器端语言!
那么如何才能使我的Web服务安全并且只能由给定的域/页访问?
任何帮助将非常感激!
ps:小部件上传到一种下拉框 - 所以安全性在这里是关键!
考虑这个类的安排 - 特别是神奇函数 __invoke:
class Barman {
public function __construct() {
// .. .constructor stuff - whatever
}
public function makeDrink() {
return "vodka martini, shaken";
}
}
class Bar {
private $arr_barmen = array();
public function __construct() {
$this->arr_barmen['john'] = new Barman();
}
public function __invoke($barman_id) {
echo "I have been invoked";
return $this->arr_barmen[$barman_id];
}
public function aBarFunc($param) {
return "yes it worked ," .$param;
}
}
class Foo {
public $myBar;
public function __construct() {
$this->myBar = new …Run Code Online (Sandbox Code Playgroud)