Laravel Passport:如何在请求时验证客户端 IP API
Laravel Passport: How to validate client IP when requesting API
我正在使用 Laravel Passport 作为我的 API 身份验证机制。一切都按预期工作,但我需要为每个请求添加额外的验证。
这个想法是验证客户端 IP 地址以及发送到服务器的 access_token。
知道我该怎么做吗?
更新: 我想检查身份验证中使用的 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.php class
<?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
});
我正在使用 Laravel Passport 作为我的 API 身份验证机制。一切都按预期工作,但我需要为每个请求添加额外的验证。 这个想法是验证客户端 IP 地址以及发送到服务器的 access_token。
知道我该怎么做吗?
更新: 我想检查身份验证中使用的 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.php class
<?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
});