Unetway

Laravel - API Authentication

 

Вступление

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

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

 

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

Подготовка базы данных

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

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

Как только миграция будет создана, запустите команду migrateArtisan.

 

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

Как только api_tokenстолбец будет добавлен в вашу usersтаблицу, вы готовы назначить случайные токены API каждому пользователю, который регистрируется в вашем приложении. Вы должны назначить эти токены при создании Userмодели для пользователя во время регистрации. При использовании лесов аутентификации, предоставленных командой Artisan, это может быть сделано в методе :make:authcreateRegisterController

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, вы можете установить hashопцию apiконфигурации вашей защиты на trueapiОхрана определяется в вашем файле конфигурации: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
{
    /**
     * 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 в ваше приложение. Мы обсудим каждый из этих подходов при использовании библиотеки 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,
    ],
]);

Жетон на предъявителя

Потребители API вашего приложения могут предоставить свой токен API в качестве Bearerтокена в Authorizationзаголовке запроса:

$response = $client->request('POST', '/api/user', [
    'headers' => [
        'Authorization' => 'Bearer '.$token,
        'Accept' => 'application/json',
    ],
]);