flat design vector illustration concept of challenge
Привіт! Мене звати Таня Козельська і я Full-Stack Developer з семирічним досвідом. Зараз я працюю у компанії Grid Dynamics. Якщо ви колись, як і я, обрали чи збираєтесь обрати композицію для свого проєкту, яка складається з фреймворку Laravel, бази MongoDB і при цьому вам треба видавати токен для АРІ — ця стаття може стати у нагоді.
Трошки загальної сухої інформації. Ну, про всяк випадок.
Laravel — це безкоштовний PHP вебфреймворк з відкритим кодом, призначений для розробки вебдодатків, що слідує за архітектурною схемою моделі-перегляду (MVC) та заснований на Symfony.
MongoDB — це нереляційна база даних документів, масштабована та гнучка, із запитами та індексацією.
Отже, почну розповідь з мого досвіду роботи. У недалекому 2018 році для одного зі своїх проєктів я обрала саме такий набір. Спочатку все було добре, адже Laravel має вбудований у свою структуру компонент Passport, який дозволяє легко аутентифікувати юзера, видавати токен, контролювати час сесії й все таке інше.
Та виявилося, що є невелика проблемка, і за замовчуванням Laravel не вміє працювати, використовуючи Passport і MongoDB.
Через те, що в моєму проєкті були досить об’ємні та різні за структурою дані, відмовлятися від бази мені не хотілося. Тому я почала шукати, що можна зробити з усім цим, і, як не дивно, виявилося, що я не одна така, і вже є люди, які зіткнулися з цією проблемою і створили спеціальну бібліотеку.
Назва бібліотеки — designmynight/laravel-mongodb-passport. Якщо знайдете її на GitHub, то там все дуже просто і детально описано:
composer
; На цьому все, далі можемо використовувати функцію createToken
. Все працює досить стабільно. Та є один момент — ця корисна бібліотека залежить від багатьох інших залежностей у composer
-файлі. І поки Laravel не оновилася до версії 7, все було гаразд. А після оновлення використання цієї бібліотеки стало просто неможливим.
Чомусь розробники designmynight вирішили не оновлювати свій код для нових версій фреймворку. Так часто буває з кастомними бібліотеками, скажете ви, і я цілком згодна, та на той момент я вже мала декілька проєктів, які використовують схожу базову структуру. І з цим треба було щось робити.
Спочатку я відстежувала репозиторій бібліотеки й думала: «Ну, окей, у мене Laravel 6, а вийшло лише ще одне оновлення, можна ще почекати». Можливо, все складеться добре і бібліотека почне підтримувати оновлення. Тим часом на GitHub все більше і більше з’являється коментарів про необхідне оновлення, і я одна з тих розробниць, хто чекає на апдейт.
З’являється fork від основної бранчі з коментарем: «Хей, гайз, все працює для нової версії». Я, звісно, випробовую це оновлення, з дивними махінаціями при оновленні composer
-файлу.
Все це виглядало так, ніби я намагаюся обдурити залежності і якимось дивом отримати завершення роботи команди composer update
.
Маю сказати, що я таки отримала бажаний результат, але стосувався він лише composer
. Попри успішне виконання, додаток нормально працювати не хотів, невідповідність версій залежностей наздогнала мене в роботі функцій логіну, того ж таки токену. Довелося повернутися і почекати ще трошки.
Вийшла Laravel 8, а оновлення бібліотеки так і не сталося. Я відставала вже на дві версії фреймворку. Я отримала час і дозвіл від клієнта на експерименти та почала шукати вихід самостійно, досліджуючи надри фреймворку та Passport.
Моя увага була спрямована на нове розширення Laravel Sanctum, яке з’явилося з 7-ої версії. За інформацією, вказаною у документації, з його допомогою можна створити легку систему аутентифікації для SPA (односторінкових додатків), мобільних додатків і простих API на основі токенів. Тож це виглядало як потрібна мені деталь для додатка. Але і тут я зіткнулася з тим самим — використанням MongoDB.
Я вирішила все-таки спробувати заюзати цей механізм, при цьому мені потрібно було знайти файл, в який йшло підключення на стандартний модуль для роботи з базою даних і замінити його на модуль для роботи з MongoDB.
Отож, покроково це виглядає так:
1. Виконуємо базові команди, які вказані в документації Laravel Sanctum для composer:
composer require laravel/sanctum
2. Паблішимо провайдер-файл, який пізніше ми замінимо на власний:
php artisan vendor:publish --provider="LaravelSanctumSanctumServiceProvider"
3. В моделі юзера підключаємо все необхідне для роботи Sanctum:
use AppsanctumHasApiTokens; use AppAuthUser as Authenticatable;
Для моєї моделі це ось такі два файли та при цьому модель має наслідувати і юзати ці класи:
class User extends Authenticatable implements CanResetPasswordContract { use Notifiable, CanResetPassword, HasApiTokens;
Думаю, що з третього пункту вже зрозуміло, що потрібно створити свою директорію для Sanctum, в якій буде ще багато файлів. Також нам необхідний файл AuthUser.php
.
4. Файл AuthUser.php
містить у собі весь базовий код з ядра Laravel Sanctum, але для нас важливо те, що ми вказуємо тут модуль для роботи з базою MongoDB:
use JenssegersMongodbEloquentModel as Model; <?php namespace App; use IlluminateAuthAuthenticatable; use IlluminateAuthMustVerifyEmail; use IlluminateAuthPasswordsCanResetPassword; use IlluminateContractsAuthAccessAuthorizable as AuthorizableContract; use IlluminateContractsAuthAuthenticatable as AuthenticatableContract; use IlluminateContractsAuthCanResetPassword as CanResetPasswordContract; use JenssegersMongodbEloquentModel as Model; use IlluminateFoundationAuthAccessAuthorizable; class AuthUser extends Model implements AuthenticatableContract, AuthorizableContract, CanResetPasswordContract { use Authenticatable, Authorizable, CanResetPassword, MustVerifyEmail; }
5. Далі потрібно у директорію sanctum помістити такі файли:
Ці файли потрібні, оскільки кожен із них викликає інший, і якщо не змінити у них використання на кастомний файл, що використовує монгу, то нічого не вийде. Начиння цих файлів також можна взяти з базової структури фреймворку і нічого не міняти, окрім namespace
. У мене це: Appsanctum;
.
Винятком є файл PersonalAccessToken.php
. У ньому нам також треба вказати використання MongoDB.
6. Отож, тут ми підключаємо потрібний клас для PersonalAccessToken.php
:
<?php namespace Appsanctum; use JenssegersMongodbEloquentModel; use LaravelSanctumContractsHasAbilities; class PersonalAccessToken extends Model implements HasAbilities {
7. Якщо ви помітили, то в директорії sanctum є файл SanctumServiceProvider.php
, саме на нього треба змінити у файлі configapp.php
базовий провайдер для Sanctum.
На цьому налаштування і підготовка закінчуються і можна спокійно використовувати метод createToken
для створення і передачі токена юзеру по АРІ. У мене це виглядає так:
$user->createToken('app_name', base64_encode($user->_id))->plainTextToken;
Готово!
Сподіваюся, мій досвід був цікавим та корисним для вас. Успіху!
Читайте також: Майстер на всі руки: дорожня карта фулстек-розробника на 2022 рік
Блогер та розробник Джозеф Круз розповів, чому не варто писати ідеальний код та чому це…
Днями я завзято нила про щось ChatGPT (експериментую між сеансами з живим терапевтом). І от…
«Крутіть колесо, щоб отримати знижку до 50%!» «Натисніть тут, щоб відкрити таємничу пропозицію!» «Зареєструйтесь зараз,…
Дуже хочеться робити якісь десктопні апки. Сумую за часами коли всі програми були offline-first, і…
Надсилаючи криптовалюту, багато новачків ставлять запитання: як працюють комісії та чому вони відрізняються в різних…
Нова афера набирає обертів — ось детальний розбір того, як фальшиві потенційні роботодавці намагаються вкрасти…