Laravel Passport: как проверить IP клиента при запросе API - PullRequest
0 голосов
/ 05 декабря 2018

Я использую Laravel Passport в качестве своего механизма аутентификации API.Все работает, как и ожидалось, но мне нужно добавить дополнительную проверку для каждого запроса.Идея состоит в том, чтобы проверить IP-адрес клиента вместе с access_token, который отправляется на сервер.

Любая идея, как я могу сделать это?

ОБНОВЛЕНИЕ: Я хочупроверьте, совпадает ли IP-адрес, используемый при аутентификации (когда пользователь вошел в систему), с тем, который выполняет запросы.Если IP-адрес отличается, клиент должен снова войти в систему.

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

IP-адрес может быть проверен в любом месте, но если требуется получить, прежде чем Passport потребуется промежуточное программное обеспечение:

создать приложение / 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 add '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
});
0 голосов
/ 05 декабря 2018

Я предлагаю вам использовать промежуточное ПО, и в этом промежуточном ПО добавить новую переменную к информации о сеансе:

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

  return $next(...);
}

, после этого вы можете просто извлечь это значение из сеанса в любом месте кода и сравнить егос текущим значением $ request-> ip ().

...