ru:https://highload.today/blogs/moya-istoriya-s-laravel-mongodb-i-vydachej-tokena-dlya-api-kak-ya-nauchilas-reshat-neprostye-zadachi/ ua:https://highload.today/uk/blogs/laravel-mongodb-ta-vidacha-tokena-dlya-api/
logo
Back-end      20/06/2022

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

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

Full-Stack Developer в Grid Dynamics

Привіт! Мене звати Таня Козельська і я 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
  • вказуємо в моделі юзера використання бібліотеки, а не стандартне розширення для роботи з базою;
  • Курс-професія "Motion Designer" від Skvot.
    Навчіться створювати 2D- та 3D-анімації у софтах After Effects, Cinema 4D та Octane Render. Протягом курсу ви створите 14 моушн-роликів, 2 з яких — для реального клієнта.
    Детальніше про курс
  • додаємо бібліотеку у файл конфігурації провайдерів.

На цьому все, далі можемо використовувати функцію createToken. Все працює досить стабільно. Та є один момент ця корисна бібліотека залежить від багатьох інших залежностей у composer-файлі. І поки Laravel не оновилася до версії 7, все було гаразд. А після оновлення використання цієї бібліотеки стало просто неможливим.

Чомусь розробники designmynight вирішили не оновлювати свій код для нових версій фреймворку. Так часто буває з кастомними бібліотеками, скажете ви, і я цілком згодна, та на той момент я вже мала декілька проєктів, які використовують схожу базову структуру. І з цим треба було щось робити.

Спочатку я відстежувала репозиторій бібліотеки й думала: «Ну, окей, у мене Laravel 6, а вийшло лише ще одне оновлення, можна ще почекати». Можливо, все складеться добре і бібліотека почне підтримувати оновлення. Тим часом на GitHub все більше і більше з’являється коментарів про необхідне оновлення, і я одна з тих розробниць, хто чекає на апдейт.

З’являється fork від основної бранчі з коментарем: «Хей, гайз, все працює для нової версії». Я, звісно, випробовую це оновлення, з дивними махінаціями при оновленні composer-файлу.

Все це виглядало так, ніби я намагаюся обдурити залежності і якимось дивом отримати завершення роботи команди composer update

Маю сказати, що я таки отримала бажаний результат, але стосувався він лише composer. Попри успішне виконання, додаток нормально працювати не хотів, невідповідність версій залежностей наздогнала мене в роботі функцій логіну, того ж таки токену. Довелося повернутися і почекати ще трошки.

Нове розширення Laravel Sanctum

Вийшла Laravel 8, а оновлення бібліотеки так і не сталося. Я відставала вже на дві версії фреймворку. Я отримала час і дозвіл від клієнта на експерименти та почала шукати вихід самостійно, досліджуючи надри фреймворку та Passport. 

Моя увага була спрямована на нове розширення Laravel Sanctum, яке з’явилося з 7-ої версії. За інформацією, вказаною у документації, з його допомогою можна створити легку систему аутентифікації для SPA (односторінкових додатків), мобільних додатків і простих API на основі токенів. Тож це виглядало як потрібна мені деталь для додатка. Але і тут я зіткнулася з тим самим — використанням MongoDB.

Онлайн-курс "PR Basis" від Skvot.
Дізнайся нюанси різних сфер і обрери свою.Як результат — матимеш стратегію бренду у своєму портфоліо та зможеш стартувати в піарі. Інсайтами ділиться лекторка, яка має 9+ років досвіду.
Детальніше про курс

Мій досвід з 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

Онлайн-курс "Тестування API" від robot_dreams.
Навчіться працювати з API на просунутому рівні та проводити навантажувальні тестування, щоб виявляти потенційні проблеми на ранніх етапах розробки.
Програма курсу і реєстрація

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;

Онлайн-курс "Архітектура високих навантажень" від robot_dreams.
Досвід та інсайти від інженера, який 12 років створює програмне забезпечення для Google.
Програма курсу і реєстрація

Готово!

Сподіваюся, мій досвід був цікавим та корисним для вас. Успіху! 

Читайте також: Майстер на всі руки: дорожня карта фулстек-розробника на 2022 рік

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

Онлайн-курс "Арт Менеджер" від Skvot.
Навчіться шукати фінансування та планувати бюджет, керувати командою, запускати артпроєкти та пітчити їх так, щоб великі компанії захотіли колабитися.
Детальніше про курс

Цей матеріал – не редакційний, це – особиста думка його автора. Редакція може не поділяти цю думку.

Топ-5 найпопулярніших блогерів березня

PHP Developer в ScrumLaunch
Всего просмотровВсього переглядів
2434
#1
Всего просмотровВсього переглядів
2434
Founder at Shallwe, Python Software Engineer (Django/React)
Всего просмотровВсього переглядів
113
#2
Всего просмотровВсього переглядів
113
Career Consultant в GoIT
Всего просмотровВсього переглядів
95
#3
Всего просмотровВсього переглядів
95
CEO & Founder в Trustee
Всего просмотровВсього переглядів
94
#4
Всего просмотровВсього переглядів
94
Рейтинг блогерів

Найбільш обговорювані статті

Топ текстів

Ваша жалоба отправлена модератору

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: