Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/254.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何存储用户';将IP与他的访问令牌放在一起,然后在laravel API中验证他的令牌时将其与当前IP进行比较?_Php_Laravel_Api_Oauth 2.0_Laravel Passport - Fatal编程技术网

Php 如何存储用户';将IP与他的访问令牌放在一起,然后在laravel API中验证他的令牌时将其与当前IP进行比较?

Php 如何存储用户';将IP与他的访问令牌放在一起,然后在laravel API中验证他的令牌时将其与当前IP进行比较?,php,laravel,api,oauth-2.0,laravel-passport,Php,Laravel,Api,Oauth 2.0,Laravel Passport,所以。。。我有一个前端应用程序,它向API发送请求,我正在用laravel编写 这是过于简化的laravel方法,用于创建访问令牌 $user = Auth::user(); $token = $user->createToken('authToken')->accessToken; 但是在创建这个令牌时,我想以某种方式将用户的IP存储到同一个DB记录中,laravel将存储新创建的访问令牌(位于这个SQL表中) 当用户请求一些“敏感”数据时,服务器应将用户当前发送这些请求的IP地

所以。。。我有一个前端应用程序,它向API发送请求,我正在用laravel编写

这是过于简化的laravel方法,用于创建访问令牌

$user = Auth::user();
$token = $user->createToken('authToken')->accessToken;
但是在创建这个令牌时,我想以某种方式将用户的IP存储到同一个DB记录中,laravel将存储新创建的访问令牌(位于这个SQL表中)

当用户请求一些“敏感”数据时,服务器应将用户当前发送这些请求的IP地址与创建其访问令牌的IP地址进行比较

在创建访问令牌后,如果不更新DB记录或不创建新表,我是否可以将这些IP存储到数据库中,或者我是否必须自己编程整个访问令牌,并自己实现IP验证


另外,这个问题对我一点帮助都没有->

每个经过身份验证的用户都有一个会话,所以您可以将IP保存到会话,稍后再检查

例如,获取当前IP:

$currentIp=Request::ip();
稍后,您可以获取另一个请求的IP,并将其与上次保存的请求进行比较

:

$old_ip=会话('ip',空);
$current_ip=Request::ip();
如果($old_ip==null){
会话(['ip'=>$current_ip]);
}else if($old_ip!=$current_ip){
Auth::logout();//安息吧
}

通过IP地址验证

我不得不说我同意rjdown的观点,我自己不会这么做。有IP白名单的标准解决方案

不过,您可以使用一种有趣的软件模式

首次收到访问令牌时生成声明

将IP地址视为一种声明,然后将其包含在API的声明对象中。当然,它不是高度安全/数字验证的声明,例如令牌的用户id。然后将声明缓存在内存中

实施IP地址筛选器

在每个后续API请求中,快速查找声明。然后运行一个筛选器类来比较原始请求和当前请求的IP

有关此设计模式的更多信息


我建议不要这样做。来自同一用户的连续请求可能来自不同的IP地址,这有很多合理的原因。@是的,但另一方面,它更安全,如果用户想从另一个IP地址“请求”,那么他可以再次登录并创建新的访问令牌。在这种情况下,再次登录没有帮助,因为他们的下一个请求可能会再次更改IP。一次又一次。一次又一次。这可能会影响移动用户、使用某些VPN和代理的用户,以及使用多个连接的某些网络设置。如果您将服务置于某种形式的负载平衡或CDN之后,也可能会导致问题。当然,如果您想处理这些问题的所有支持请求,这取决于您:我担心这不会起作用,因为我使用laravel纯粹用于REST API,并且没有在其中设置会话case@SenTisso等待一秒钟=)REST表示不存储状态。。。那么,您将如何存储旧IP?@SenTisso您无论如何都需要某种存储。当我们说
session
时,我们指的是
storage
,所以实际上session可以是任何类型的存储:数据库、内存数据库、Redis、纯文本文件、其他选项