Из коробки, в Laravel включено простое решение, страж аутентификации основанный на
токене пользователя. Мы же вам рекомендуем использовать
Паспорт Laravel для надёжных и производитлеьных
приложений, которые предлагают API аутентификацию.
API Аутентификация
Содержание:
Введение
По умолчанию, Ларавел включает в себя просто решения для API аутентификации, через случайный токен
присоединённый к каждому пользователю приложения. В вашем файле конфигурации config/auth.php
,
страж api
уже определён и использует драйвер token
. Драйвер проверяет
токен для входящего запроса и верефицирует, что он соответсвует пользовательскому токену из
базы данных.
Конфигурация
Миграции базы данных
Перед использованием драйвера token
, вам необхдимо создать
миграцию, котоая добавит колонку
api_token
для вашей таблицы users
:
Schema::table('users', function ($table) {
$table->string('api_token', 80)->after('password')
->unique()
->nullable()
->default(null);
});
После создания миграции, выпоните команду Artisan migrate
.
Генерация токенов
После добавления колонки api_token
в вашу таблицу users
,
вы готовы присоединить случайный API токен для каждого пользователя, который зарегистрирован в
вашем приложжении. Вы должны добавить эти токены, в момент создания модели User
для пользователя в течение регистрации. При использовании встроенной заготовки аутентификации,
это можно сдлеать в методе create
для RegisterController
:
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
/**
* Create a new user instance after a valid registration.
*
* @param array $data
* @return \App\User
*/
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => Hash::make($data['password']),
'api_token' => Str::random(60),
]);
}
Хэширование токенов
В приведённом выше примере, API хранятся в вашей базе данных как обычный текст.
Если вы хотите захешировать ваш API токен используя SHA-256, вы можете установить
значение true
для опции hash
вашего api
стража,
который определён в вашем файле конфигурации config/auth.php
:
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => true,
],
Генерация захешированных токенов
При использовании захешированных API токенов, вам не стоит генерировать API токены в время регистрации пользователя. Вместо этого, стоит сделать собственную страницу управления токенами для вашего приложения. Эта страница должна позволить пользователям инициализировать и обновлять их API токены. Когда пользователь делает запрос, чтобы инициализировать или обновить их токены, вы должны сохранить захешированную копию токена в базе данных и вернуть копию токена в виде обычного текста для одноразового отображения.
Например, метод контроллера, который инициализирует или обновляет токен для данного пользователя и возвращает токен в виде обычного текста как JSON ответ выгляд следующим образом:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
class ApiTokenController extends Controller
{
/**
* Update the authenticated user's API token.
*
* @param \Illuminate\Http\Request $request
* @return array
*/
public function update(Request $request)
{
$token = Str::random(60);
$request->user()->forceFill([
'api_token' => hash('sha256', $token),
])->save();
return ['token' => $token];
}
}
Защита маршрутов
Laravel включает
стража аутентификации,
который автоматически проводит валидацию API токенов для входящих запросов. Вам лишь необходимо
указать посредника auth:api
для любого маршрута, для которого требуется действительный
токен маршрута:
use Illuminate\Http\Request;
Route::middleware('auth:api')->get('/user', function(Request $request) {
return $request->user();
});
Передача токенов в запросах
Есть несколько путей передачи токена API в ваше приложение. Мы обсудим каждый из этих подходов, на примере использования библиотеки HTTP Guzzle в качестве демонстрации. Вы можете выбрать любой из подходов для вашего приложения.
Строка запроса
Пользователи API вашего приложения могут указать их токен какapi_token
значение строки запроса:
$response = $client->request('GET', '/api/user?api_token='.$token);
Параметр запроса
Пользователи API вашего приложения могут включить токен в параметры запроса форты как
api_token
:
$response = $client->request('POST', '/api/user', [
'headers' => [
'Accept' => 'application/json',
],
'form_params' => [
'api_token' => $token,
],
]);
Токен предъявителя
Пользователи API вашего приложения могут предоставить их API токен как
Bearer
(предъвителя) токен в Authorization
заголовке запроса:
$response = $client->request('POST', '/api/user', [
'headers' => [
'Authorization' => 'Bearer '.$token,
'Accept' => 'application/json',
],
]);