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



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

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

$user = Auth::user();
$token = $user->createToken('authToken')->accessToken;

但是在创建这个令牌时,我想以某种方式将用户的IP存储到同一个DB记录中,laravel将存储新创建的访问令牌(位于这个SQL表oauth_access_tokens中(。

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

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

附言:这个问题对我一点帮助都没有;Laravel Passport:如何在请求API 时验证客户端IP

通过IP地址验证

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

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

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

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

实现IP地址过滤器

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

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

  • 博客文章
  • 示例代码-请参阅Authorizer类

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

例如获取当前IP:

$currentIp = Request::ip();

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

会话:

$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
}

最新更新