Привіт! Мене звати Таня Козельська і я Full-Stack Developer з семирічним досвідом. Зараз я працюю у компанії Grid Dynamics. Якщо ви колись, як і я, обрали чи збираєтесь обрати композицію для свого проєкту, яка складається з фреймворку Laravel, бази MongoDB і при цьому вам треба видавати токен для АРІ — ця стаття може стати у нагоді.
Як з’явилася проблема
Трошки загальної сухої інформації. Ну, про всяк випадок.
Laravel — це безкоштовний PHP вебфреймворк з відкритим кодом, призначений для розробки вебдодатків, що слідує за архітектурною схемою моделі-перегляду (MVC) та заснований на Symfony.
MongoDB — це нереляційна база даних документів, масштабована та гнучка, із запитами та індексацією.
Отже, почну розповідь з мого досвіду роботи. У недалекому 2018 році для одного зі своїх проєктів я обрала саме такий набір. Спочатку все було добре, адже Laravel має вбудований у свою структуру компонент Passport, який дозволяє легко аутентифікувати юзера, видавати токен, контролювати час сесії й все таке інше.
Та виявилося, що є невелика проблемка, і за замовчуванням Laravel не вміє працювати, використовуючи Passport і MongoDB.
Через те, що в моєму проєкті були досить об’ємні та різні за структурою дані, відмовлятися від бази мені не хотілося. Тому я почала шукати, що можна зробити з усім цим, і, як не дивно, виявилося, що я не одна така, і вже є люди, які зіткнулися з цією проблемою і створили спеціальну бібліотеку.
Бібліотека на GitHub
Назва бібліотеки — designmynight/laravel-mongodb-passport. Якщо знайдете її на GitHub, то там все дуже просто і детально описано:
- встановлюємо залежність через
composer
; - вказуємо в моделі юзера використання бібліотеки, а не стандартне розширення для роботи з базою;
- додаємо бібліотеку у файл конфігурації провайдерів.
На цьому все, далі можемо використовувати функцію createToken
. Все працює досить стабільно. Та є один момент — ця корисна бібліотека залежить від багатьох інших залежностей у composer
-файлі. І поки Laravel не оновилася до версії 7, все було гаразд. А після оновлення використання цієї бібліотеки стало просто неможливим.
Чомусь розробники designmynight вирішили не оновлювати свій код для нових версій фреймворку. Так часто буває з кастомними бібліотеками, скажете ви, і я цілком згодна, та на той момент я вже мала декілька проєктів, які використовують схожу базову структуру. І з цим треба було щось робити.
Спочатку я відстежувала репозиторій бібліотеки й думала: «Ну, окей, у мене Laravel 6, а вийшло лише ще одне оновлення, можна ще почекати». Можливо, все складеться добре і бібліотека почне підтримувати оновлення. Тим часом на GitHub все більше і більше з’являється коментарів про необхідне оновлення, і я одна з тих розробниць, хто чекає на апдейт.
З’являється fork від основної бранчі з коментарем: «Хей, гайз, все працює для нової версії». Я, звісно, випробовую це оновлення, з дивними махінаціями при оновленні composer
-файлу.
Все це виглядало так, ніби я намагаюся обдурити залежності і якимось дивом отримати завершення роботи команди composer update
.
Маю сказати, що я таки отримала бажаний результат, але стосувався він лише composer
. Попри успішне виконання, додаток нормально працювати не хотів, невідповідність версій залежностей наздогнала мене в роботі функцій логіну, того ж таки токену. Довелося повернутися і почекати ще трошки.
Нове розширення Laravel Sanctum
Вийшла Laravel 8, а оновлення бібліотеки так і не сталося. Я відставала вже на дві версії фреймворку. Я отримала час і дозвіл від клієнта на експерименти та почала шукати вихід самостійно, досліджуючи надри фреймворку та Passport.
Моя увага була спрямована на нове розширення Laravel Sanctum, яке з’явилося з 7-ої версії. За інформацією, вказаною у документації, з його допомогою можна створити легку систему аутентифікації для SPA (односторінкових додатків), мобільних додатків і простих API на основі токенів. Тож це виглядало як потрібна мені деталь для додатка. Але і тут я зіткнулася з тим самим — використанням MongoDB.
Мій досвід з 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 рік
If you have found a spelling error, please, notify us by selecting that text and pressing Ctrl+Enter.
Favbet Tech – це ІТ-компанія зі 100% українською ДНК, що створює досконалі сервіси для iGaming і Betting з використанням передових технологій та надає доступ до них. Favbet Tech розробляє інноваційне програмне забезпечення через складну багатокомпонентну платформу, яка здатна витримувати величезні навантаження та створювати унікальний досвід для гравців.
Цей матеріал – не редакційний, це – особиста думка його автора. Редакція може не поділяти цю думку.
Сообщить об опечатке
Текст, который будет отправлен нашим редакторам: