我想创建一个API,并对API使用者进行身份验证,我将提供API KEY,App-id和App-Secret。问题是我想知道http请求的来源,以便我可以知道发出que请求的主机是否是注册的主机。例如:www.someone.com有一个app-id:0001,app-secret:1200和api-key:458。如果此凭据用于发出A请求,我想知道请求者是否真的是www.someone.com
答案 0 :(得分:16)
通常,此标题应该可以完成。在此标题中包含域名
header("Access-Control-Allow-Origin: " . $_SERVER['HTTP_ORIGIN'] . "");
// use domain name instead of $_SERVER['HTTP_ORIGIN'] above
但如果您想查看更多信息,请使用以下代码段
$allowed = array('domain1', 'domain2', 'domain3');
if(isset($_SERVER['HTTP_ORIGIN']) && in_array($_SERVER['HTTP_ORIGIN'], $allowed)){
// SELECT credentials for this user account from database
if(isset($_GET['api_key'], $_GET['app_secret'])
&& $_GET['api_key'] == 'api_key_from_db'
&& $_GET['app_secret'] == 'app_secret_from_db'
){
// all fine
}else{
// not allowed
}
}else{
// not allowed
}
如果用户必须向您的服务传递更多数据,请使用POST
代替GET
答案 1 :(得分:4)
Laravel 5 :在请求方法控制器中:
$origin = request()->headers->get('origin');
答案 2 :(得分:3)
从技术上讲,origin
和referer
都不是必需的HTTP标头,所有这些答案都基于发送的特定浏览器标头,并且使系统基于客户端的不同行为是一个坏主意。
正确的答案是您不能可靠地获取每个请求的客户端来源,因为这不是HTTP规范的一部分。
答案 3 :(得分:2)
我认为你的意思是你想要访问" Origin"请求标头中的标头(而不是在响应标头中设置它)。
为此,最简单的方法是访问内置的 getallheaders()函数 - 这是 apache_request_headers () - N.B的别名。这是假设您使用PHP作为模块。
这会返回一个数组,因此Origin标题应该是这样的:
$request_headers = getallheaders();
$origin = $request_headers['Origin'];
如果你通过类似fastcgi之类的东西使用php,那么我相信它会在环境中提供 - 通常是大写的,并以" HTTP _"为前缀。所以它应该是$_SERVER['HTTP_ORIGIN']
。
希望能帮助其他人寻找这个:)
答案 4 :(得分:1)
使用var_dump
,您可以看到request
提供的所有内容。
var_dump($_REQUEST);
在var_dump
全球范围内执行server
。它包含大量有用的信息。
var_dump($_SERVER);
答案 5 :(得分:1)
使用$_SERVER['HTTP_REFERER']
。它是将用户代理引用到当前页面的页面地址(如果有)。这是由用户代理设置的。并非所有用户代理都会设置此功能,有些用户可以将HTTP_REFERER
修改为功能。
如需进一步限制,您可以执行以下操作。 example.com
应更改为您的域名。
IIS在网络配置中设置:
add name="Access-Control-Allow-Origin" value="http://www.example.com"
Apache在httpd.conf / apache.conf中设置
Header add Access-Control-Allow-Origin "http://www.example.com"
答案 6 :(得分:0)
在laravel 7中,这对我有用
request()-> headers-> get('referer');