代码之家  ›  专栏  ›  技术社区  ›  Ricky

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

  •  0
  • Ricky  · 技术社区  · 6 年前

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

    你知道我该怎么做吗?

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

    2 回复  |  直到 6 年前
        1
  •  1
  •   raksa    6 年前

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

    创造 app/http/中间件/ipmiddleware.php

    <?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);
        }
    }
    

    在里面 app/http/kernel.php应用程序 添加 'IP'=>\app\http\middleware\ip middleware::class,

    protected $routeMiddleware = [
        'ip' => \App\Http\Middleware\IpMiddleware::class,
    ];
    

    在里面 routes/web.php

    Route::group(['middleware' => ['ip', 'auth:api']], function () {
        //your routes
    });
    
        2
  •  1
  •   Fatemeh Majd    6 年前

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

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

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

    推荐文章