Рубріки: Back-end

Моя історія з Laravel, MongoDB та видачею токена для API: як я навчилася вирішувати непрості задачі

Тетяна Козельська

Привіт! Мене звати Таня Козельська і я 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 рік

Якщо ви знайшли помилку, будь ласка, виділіть фрагмент тексту та натисніть Ctrl+Enter.

Останні статті

Чому написання ідеального коду може призвести до вашого звільнення

Блогер та розробник Джозеф Круз розповів, чому не варто писати ідеальний код та чому це…

18.04.2025

ChatGPT, моторошна долина та трохи Фройда

Днями я завзято нила про щось ChatGPT (експериментую між сеансами з живим терапевтом). І от…

17.04.2025

Я прийшла за покупками, а не крутити колесо

«Крутіть колесо, щоб отримати знижку до 50%!» «Натисніть тут, щоб відкрити таємничу пропозицію!» «Зареєструйтесь зараз,…

16.04.2025

Майже навайбкодив десктопний монітор CI пайплайнів

Дуже хочеться робити якісь десктопні апки. Сумую за часами коли всі програми були offline-first, і…

15.04.2025

Як працюють транзакційні комісії в мережах Bitcoin і Ethereum

Надсилаючи криптовалюту, багато новачків ставлять запитання: як працюють комісії та чому вони відрізняються в різних…

14.04.2025

Обережно, тепер вас можуть обдурити на співбесіді з роботодавцем

Нова афера набирає обертів — ось детальний розбір того, як фальшиві потенційні роботодавці намагаються вкрасти…

11.04.2025