Аутентификация мобильного приложения с использованием токена в Laravel
Вы используете Laravel в качестве серверной части своего мобильного приложения? Если да, то, вероятно, вы ищете простое решение для аутентификации вашего мобильного приложения. Многие пользователи могут использовать ваше мобильное приложение, и вы хотите выполнить аутентификацию, чтобы предоставлять контент своим мобильным пользователям. В этой статье мы изучаем, как выполнять аутентификацию на основе токенов в Laravel. Вы также можете использовать тот же подход для аутентификации REST API.
Мы собираемся интегрировать Laravel Sanctum – облегченную систему аутентификации. Вы можете рассматривать его как замену аутентификации на основе OAuth.
При использовании Sanctum токены API пользователя хранятся в базе данных. Этот токен должен быть отправлен как Bearer
токен через Authorization
заголовок из вашего мобильного приложения в конечные точки Laravel API. Эти токены обычно имеют очень долгий срок действия (годы).
При этом давайте посмотрим, как использовать Sanctum для аутентификации мобильных приложений.
Установите и настройте Laravel Sanctum
Для начала вам сначала нужно установить пакет Sanctum в ваше приложение Laravel. Установите его с помощью команды:
composer require laravel/sanctum
После этого опубликуйте файлы конфигурации и миграции Sanctum, выполнив следующую команду.
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
Затем запустите команду миграции, которая создаст personal_access_tokens
таблицу в вашей базе данных. Это таблица, в которой будут храниться все токены API.
php artisan migrate
По умолчанию для каждого запроса в Laravel требуется токен csrf. В случае отсутствия этого токена csrf Laravel не выполнит ваш запрос. Когда дело доходит до генерации токенов API с помощью Sanctum, нам нужно пропустить отправку токена csrf. Для этого добавьте sanctum/token
маршрут в $except
переменную app/Http/Middleware/VerifyCsrfToken.php
. Я создам этот sanctum/token
маршрут на следующих шагах.
<?php
...
class VerifyCsrfToken extends Middleware
{
/**
* The URIs that should be excluded from CSRF verification.
*
* @var array
*/
protected $except = [
'sanctum/token'
];
}
Для аутентификации нам нужно выдать токен пользователям. Итак, вы должны использовать HasApiTokens
черту модели User следующим образом.
<?php
namespace AppModels;
...
use LaravelSanctumHasApiTokens;
class User extends Authenticatable
{
use HasApiTokens, HasFactory, Notifiable;
...
}
Выдача токенов API для аутентификации
Чтобы отправить токен-носитель с заголовком авторизации в каждом запросе, необходимо сначала выпустить токен API. Я собираюсь создать метод, который генерирует токен API для каждого пользователя. Чтобы выпустить токен, вам потребуется отправить адрес электронной почты, пароль и устройство пользователя.
Добавьте указанный ниже маршрут в routes/web.php
Route::post('/sanctum/token', 'APITokenController@create_token');
Далее создайте контроллер APITokenController
командой:
php artisan make:controller APITokenController
Определите create_token()
метод во вновь созданном контроллере следующим образом.
<?php
namespace AppHttpControllers;
use AppModelsUser;
use IlluminateHttpRequest;
use IlluminateSupportFacadesHash;
use IlluminateValidationValidationException;
class APITokenController extends Controller
{
public function create_token(Request $request)
{
$request->validate([
'email' => 'required|email',
'password' => 'required',
'device_name' => 'required',
]);
$user = User::where('email', $request->input('email'))->first();
if (! $user ||! Hash::check($request->input('password'), $user->password)) {
return [
'error' => 'The provided credentials are incorrect.'
];
}
return $user->createToken($request->input('device_name'))->plainTextToken;
}
}
Приведенный выше код сначала проверяет учетные данные пользователя. Если учетные данные верны, в ответ он отправляет токен в текстовом формате. Здесь я получаю входные значения, учитывая, что они будут отправлены в объекте JSON.
Попробуйте отправить запрос POST с учетными данными пользователя, и вы должны получить токен в виде обычного текста. Этот токен API может храниться на мобильном устройстве и использоваться в заголовке при отправке запросов API.
В моем случае я использую расширение Rest Client для кода VS, и мой запрос sanctum/token
показан на снимке экрана ниже.
Перейдите в базу данных, и вы увидите, что ваш токен хранится в personal_access_tokens
таблице.
Sanctum будет создавать несколько токенов всякий раз, когда вы попадете в sanctum/token
маршрут с правильными учетными данными. Если вы хотите отозвать предыдущий токен, добавьте приведенный ниже оператор перед последним оператором возврата в приведенном выше коде.
// Revoke previous tokens...
$user->tokens()->delete();
return $user->createToken($request->input('device_name'))->plainTextToken;
Наконец, защитите маршруты, добавив auth:sanctum
промежуточное ПО следующим образом.
Route::middleware('auth:sanctum')->get('/products', function() {
// write a code
});
По промежуточного слоя проверяет, получен ли токен в заголовке авторизации. Если токен API правильный, то только он позволяет продолжить движение по маршруту.
Например, в коде VS вы можете отправить токен API как токен-носитель с заголовком авторизации, как показано ниже.
Надеюсь, вы понимаете, как интегрировать аутентификацию мобильного приложения с помощью токена в Laravel. Я хотел бы услышать ваши мысли и предложения в разделе комментариев ниже.
Статьи по Теме
- Как создать блог с Laravel
- Руководство по добавлению Google reCAPTCHA v3 на ваш сайт Laravel
- Как загрузить видео на YouTube в приложении Laravel