API Аутентификация

Содержание:


Введение

По умолчанию, Ларавел включает в себя просто решения для API аутентификации, через случайный токен присоединённый к каждому пользователю приложения. В вашем файле конфигурации config/auth.php, страж api уже определён и использует драйвер token. Драйвер проверяет токен для входящего запроса и верефицирует, что он соответсвует пользовательскому токену из базы данных.

Из коробки, в Laravel включено простое решение, страж аутентификации основанный на токене пользователя. Мы же вам рекомендуем использовать Паспорт Laravel для надёжных и производитлеьных приложений, которые предлагают API аутентификацию.

Конфигурация

Миграции базы данных

Перед использованием драйвера token, вам необхдимо создать миграцию, котоая добавит колонку api_token для вашей таблицы users:

Schema::table('users', function ($table) {
    $table->string('api_token', 80)->after('password')
                        ->unique()
                        ->nullable()
                        ->default(null);
});

После создания миграции, выпоните команду Artisan migrate.

Если вы хотите выбрать другое имя для колонки, убедитесь в том, что обновили вашу API конфигурацию и опцию storage_key внутри файла config/auth.php.

Генерация токенов

После добавления колонки 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];
    }
}
В силу того, что API токены в примере выше имеют достаточную энтропию, не целесообразно создавать "радужные таблицы" чтобы искать оригинальное значение захэшированного токена. Как следствие, медленные метод хэширования такие как bcrypt ненужны.

Защита маршрутов

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',
    ],
]);