Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.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/2/cmake/2.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
Laravel Passport:请求API时如何验证客户端IP_Laravel_Ip Address_Laravel Passport_Laravel 5.7 - Fatal编程技术网

Laravel Passport:请求API时如何验证客户端IP

Laravel Passport:请求API时如何验证客户端IP,laravel,ip-address,laravel-passport,laravel-5.7,Laravel,Ip Address,Laravel Passport,Laravel 5.7,我使用Laravel Passport作为API身份验证机制。一切正常,但我需要为每个请求添加额外的验证。 其思想是验证客户端IP地址以及发送到服务器的访问令牌 你知道我怎样才能做到这一点吗 更新:我想检查身份验证(用户登录时)中使用的IP是否与执行请求的IP相同。如果IP不同,客户端必须再次登录。我建议您使用中间件,并在该中间件中向会话信息添加一个新变量: public function handle(Request $request) { $request->session()-&

我使用Laravel Passport作为API身份验证机制。一切正常,但我需要为每个请求添加额外的验证。 其思想是验证客户端IP地址以及发送到服务器的访问令牌

你知道我怎样才能做到这一点吗


更新:我想检查身份验证(用户登录时)中使用的IP是否与执行请求的IP相同。如果IP不同,客户端必须再次登录。

我建议您使用中间件,并在该中间件中向会话信息添加一个新变量:

public function handle(Request $request)
{
  $request->session()->set('initial_ip', $request->ip());

  return $next(...);
}

之后,您可以从代码中的任何位置的会话中获取此值,并将其与当前的$request->ip()值进行比较。

可以在任何位置检查ip地址,但如果需要在Passport之前获取,则需要中间件:

创建app/Http/Middleware/IpMiddleware.phpclass

<?php
namespace App\Http\Middleware;

use Illuminate\Http\Request;

class IpMiddleware
{
    public function handle(Request $request, \Closure $next)
    {
        $ip = null;
        if (getenv('HTTP_CF_CONNECTING_IP')) {
            $ip = getenv('HTTP_CF_CONNECTING_IP');
        } else if (getenv('HTTP_CLIENT_IP')) {
            $ip = getenv('HTTP_CLIENT_IP');
        } else if (getenv('HTTP_X_FORWARDED_FOR')) {
            $ip = getenv('HTTP_X_FORWARDED_FOR');
        } else if (getenv('HTTP_X_FORWARDED')) {
            $ip = getenv('HTTP_X_FORWARDED');
        } else if (getenv('HTTP_FORWARDED_FOR')) {
            $ip = getenv('HTTP_FORWARDED_FOR');
        } else if (getenv('HTTP_FORWARDED')) {
            $ip = getenv('HTTP_FORWARDED');
        } else if (getenv('REMOTE_ADDR')) {
            $ip = getenv('REMOTE_ADDR');
        }
        if (!$ip || $ip === '::1') {
            $ip = $request->ip();
        }
        $ipAddress = \explode(',', $ip ?? '127.0.0.1')[0];
        return $next($request);
    }
}
routes/web.php中

Route::group(['middleware' => ['ip', 'auth:api']], function () {
    //your routes
});

验证IP格式还是验证每个会话的IP?我怀疑后者,但是想想wat,这意味着对于在手机上切换wifi/4g的用户:)验证每个会话的IP。我实际上想到了:)每当该令牌的IP发生变化时,用户必须再次登录:)想法:向用户的表中添加一个字段(last_login_IP),尝试登录成功后,清除用户的旧会话并更新ipvalue@raksaeng验证令牌时,如何/在何处覆盖passport auth方法以检查ip?感谢帮助。我最终选择@raksaeng的解决方案作为正确答案,因为它更详细。
Route::group(['middleware' => ['ip', 'auth:api']], function () {
    //your routes
});