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

时间:2018-12-05 12:15:04

标签: laravel ip-address laravel-passport laravel-5.7

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

有什么主意我能做到吗?

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

2 个答案:

答案 0 :(得分:1)

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

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

  return $next(...);
}

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

答案 1 :(得分:1)

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

创建 app / Http / Middleware / 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 \ IpMiddleware :: class,

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

routes/web.php

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