所以。。。我有一个前端应用程序,它向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
}