Аутентификация API
Введение
По умолчанию Laravel поставляется с простым решением для аутентификации API с помощью случайного токена, назначенного каждому пользователю вашего приложения. В вашем файле конфигурации config/auth.php
защита api
уже определена и использует драйвер token
. Этот драйвер отвечает за проверку токена API во входящем запросе и проверку его соответствия назначенному токену пользователя в базе данных.
Внимание: Хотя Laravel поставляется с простым средством проверки подлинности на основе токенов, настроятельно рекомендуется использовать Laravel Passport для надежных производственных приложений, которые предлагают аутентификацию с помощью API.
Настройка
Миграции базы данных
Перед использованием драйвера 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
во время регистрации. При использовании вспомогательной аутентификации, предоставляемой командой Artisan make:auth
, это можно сделать в методе create
контроллера RegisterController
:
use Illuminate\Support\Str;
use Illuminate\Support\Facades\Hash;
/**
* Создает новый экземпляр пользователя после регистрации.
*
* @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, вы можете установить для опции hash
вашей конфигурации защиты api
значение true
. Защита api
определяется в вашем файле конфигурации config/auth.php
:
'api' => [
'driver' => 'token',
'provider' => 'users',
'hash' => true,
],
Генерация хэшированных токенов
При использовании хешированных токенов API вы не должны генерировать свои токены API во время регистрации пользователя. Вместо этого вам потребуется реализовать собственную страницу управления токенами API в вашем приложении. Эта страница должна позволять пользователям инициализировать и обновлять свой токен API. Когда пользователь делает запрос на инициализацию или обновление своего токена, вы должны сохранить хешированную копию токена в базе данных и одноразово вывести текстовую копию токена клиенту в интерфейсе.
Например, метод контроллера, который инициализирует / обновляет токен для данного пользователя и возвращает токен в виде простого текста в виде ответа JSON, может выглядеть следующим образом:
<?php
namespace App\Http\Controllers;
use Illuminate\Support\Str;
use Illuminate\Http\Request;
class ApiTokenController extends Controller
{
/**
* Обновляет токен API аутентифицированного пользователя.
*
* @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];
}
}
Поскольку токены API в приведенном выше примере имеют достаточную энтропию, нецелесообразно создавать "радужные таблицы" для поиска исходного значения хешированного токена. Поэтому медленные методы хеширования, такие как
bcrypt
, не нужны.
Защита роутов
Laravel включает в себя гвард проверки подлинности, который автоматически проверяет токены API на входящих запросах. Вам нужно только указать промежуточное ПО auth:api
на любом маршруте, для которого требуется действительный токен доступа:
use Illuminate\Http\Request;
Route::middleware('auth:api')->get('/user', function(Request $request) {
return $request->user();
});
Передача токенов в запросах
Существует несколько способов передачи токена API в ваше приложение. Мы обсудим каждый из этих подходов при использовании библиотеки Guzzle HTTP, чтобы продемонстрировать их использование. Вы можете выбрать любой из этих подходов в зависимости от потребностей вашего приложения.
Строка запроса
Пользователи API вашего приложения могут указать свой токен в виде значения строки запроса api_token
:
$response = $client->request('GET', '/api/user?api_token='.$token);
Форма запроса
Пользователи API вашего приложения могут включить свой токен API в параметры формы запроса в виде api_token
:
$response = $client->request('POST', '/api/user', [
'headers' => [
'Accept' => 'application/json',
],
'form_params' => [
'api_token' => $token,
],
]);
Bearer токен
Пользователи API вашего приложения могут предоставить свой API-токен в качестве Bearer
токена в заголовке Authorization
запроса:
$response = $client->request('POST', '/api/user', [
'headers' => [
'Authorization' => 'Bearer '.$token,
'Accept' => 'application/json',
],
]);