【发布时间】:2020-10-18 19:11:32
【问题描述】:
我正在开发一个 Laravel 应用程序,我正在为其他网站构建一些 API。但我试图让我的 API 的实现尽可能简单。我的期望是用户只会在 HTML 头中使用这个标签:
<script src="api.mydomain.com">
现在我在这个 URL 上有一个控制器,它为源 javascript 提供内容类型标头,但在它到达那里之前,路由器将首先执行我的身份验证中间件。假设它看起来像这样:
public static $users = [
'client1.com',
'client2.com',
'client3.com'
];
public function handle(Request $request, Closure $next)
{
$origin = "HERE I NEED THE ORIGIN URL"; // e.g. client4.com
if ( !in_array($origin, self::$users) ) {
abort(401);
}
return $next($request);
}
从代码中可以看出,我需要检索 $origin 变量。因此,如果网站 client1.com 将尝试插入我的 javascript,它将成功获取 javascript 代码。如果 client4.com 尝试访问它,它将收到 401 错误。
我发现了使用 $_SERVER['HTTP_REFERER'] 或 Laravel 的 $request->server('HTTP_REFERER') 的方法,但是这些数据可能是伪造的,对吧?
在最好的情况下,我想检索原始域,当不可用时(例如,来自私有 cURL 请求),我想获取 IP 地址。当然,我需要它是安全的——clients1/2/3 为我的 API 付费,其他人没有。
我该怎么做?或者有没有更好的原产地认证方法?
【问题讨论】:
-
看看this
-
@jewishmoses 是的,我想到了 CORS,但据我所知,您只能在此标头中定义一个域。我什至看到了一些网站,它们作为代理工作,可以克服 CORS 保护(我不知道他们是如何做到的)。
标签: php laravel api cross-domain