Я использую Laravel Passport для предоставления доступа к некоторым частям моего API сторонним приложениям.
Но я также использую свой собственный API через собственное приложение Native Android от первого лица. Итак, я просмотрел весь интернет на предмет лучшей практики в этом случае, но застрял, чтобы прийти к выводу.
Вот возможности, которые я нашел:
Возможность № 01
Я могу следить за ходом предоставления пароля пользователя.
В этом случае мне нужно передать client_secret
и client_id
на сервер авторизации. Чтобы сохранить их в безопасности, я не могу написать их в исходном коде моего мобильного приложения (APK файлы декомпилируемы...).
Итак, у меня есть 2 варианта.
Возможность № 01 - Выбор А
Проксифицируйте через мой собственный сервер и введите секрет перед вызовом конечной точки oauth:
$proxy = Request::create('/oauth/token', 'post', [
'grant_type' => 'password',
'client_id' => 1,
'client_secret' => 'myownclientsecretishere',
'username' => $username,
'password' => $password
]);
$proxy->headers->set('Accept', 'application/json');
$response = app()->handle($proxy);
Возможность № 01 - Вариант Б
Введите секрет при вызове конечной точки oauth с помощью Middleware:
class InjectPasswordGrantSecret
{
public function handle($request, Closure $next)
{
$request->request->add([
'client_id' => 1,
'client_secret' => 'myownclientsecretishere'
]);
return $next($request);
}
}
Это рабочие примеры, но они также жадные в ресурсах. Я попытался использовать эталонный тест Apache на своей локальной машине, и я получил что-то вроде 9 запросов в секунду.
Возможность № 02
Я могу следовать Гранту личного доступа.
Этот не похож на стандарт в OAuth2, он позволяет нам создавать токен через любой пользовательский маршрут, вот так:
if (! auth()->attempt(compact('username', 'password'))) {
return error_response(__('auth.failed'));
}
$user = auth()->user();
$token = $user->createToken(null)->accessToken;
Используя Apache, я получаю лучший результат (примерно 30 запросов в секунду).
Но время жизни токена не настраивается по умолчанию и составляет 1 год (обратите внимание, что существуют обходные пути, позволяющие настроить это время жизни с помощью настраиваемого поставщика).
Мне действительно интересно, если это решение предназначено для использования в производственной среде.
Первоначально я использовал библиотеку tymon JWT, потому что у меня было только собственное приложение. Но теперь, когда мне нужно заставить его работать со сторонними и сторонними приложениями, я подумал, что OAuth2 (через Laravel Passport) будет хорошим решением...
Я надеюсь, что кто-то может помочь мне с этим и объяснить, что может быть хорошим решением, чтобы заставить его работать безопасно и [не медленно] на производственных серверах.