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

问题描述

所以...我有一个前端应用程序,该应用程序将请求发送到我在laravel中编写的API。

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

$user = Auth::user();
$token = $user->createtoken('authToken')->accesstoken;

但是在创建此令牌时,我想以某种方式将用户的IP存储到同一数据库记录中,laravel将存储新创建的访问令牌(位于此sqloauth_access_tokens中)。

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

是否有可能在创建访问令牌后不以任何方式更新数据库记录或没有创建新表的情况下将我的IP存储在其中,或者我必须自己编程整个访问令牌并实现该IP我也要验证吗?

P.S。这个问题根本对我没有帮助-> Laravel Passport: How to validate client IP when requesting API

解决方法

通过IP地址验证

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

您可以使用一种有趣的软件模式。

首次收到访问令牌时的构建索赔

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

安装IP地址过滤器

在随后的每个API请求中,快速查找声明。然后运行过滤器类以将原始IP与当前请求进行比较。

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

,

每个通过身份验证的用户都有一个会话,因此您可以将IP保存到会话中,并在以后进行检查。

例如获取当前IP:

$currentIp = Request::ip();

稍后,您可以获取另一个请求的IP,并将其与上一个保存的请求进行比较。

Sessions

$old_ip = session('ip',null);
$current_ip = Request::ip();
if ($old_ip == null) {
  session(['ip' => $current_ip]);
} else if ($old_ip != $current_ip) {
  Auth::logout(); // rest in peace
}