Когда дело доходит до аутентификации в Laravel, есть много вариантов. Но что мы должны использовать, когда дело доходит до аутентификации вашего API?
Традиционно мы опирались на что-то вроде веб-токенов JSON для нашей аутентификации API, аналогично аутентификации на основе сеансов. Вы меняете свои учетные данные на что-то, что обеспечит вам длительный доступ.
Затем мы начали использовать Laravel Passport, фантастическую реализацию OAuth, которую вы можете использовать для предоставления доступа OAuth к вашим приложениям Laravel, будь то аутентификация между серверами, мобильная аутентификация или другие типы аутентификации. Долгое время мы придерживались использования Passport Laravel и типа предоставления пароля, что позволяло нам отправлять наши учетные данные вместе с данными приложения OAuth, и мы возвращали токен доступа и обновления, что позволяло нам получить доступ и обновлять этот доступ по истечении срока его действия. Однако это больше не рекомендуется в качестве механизма аутентификации.
Рекомендуемый вариант — Sanctum
Sanctum был разработан как легкая альтернатива Passport Laravel, но на самом деле он достиг гораздо большего. Независимо от того, создаете ли вы веб-приложение, реализацию клиента или что-то между ними, Sanctum быстро стал механизмом аутентификации золотого стандарта в экосистеме Laravel.
Что это значит для API? Нужно ли нам передавать имя токена каждый раз, когда мы хотим пройти аутентификацию? Вы можете это сделать — это никому не навредит.
Как аутентифицировать свои API в Laravel?
Давайте рассмотрим мой подход и посмотрим, почему это работает. Он начинается с учетных данных пользователей, как и любой подходящий механизм аутентификации. Мы публикуем их в наших конечных точках входа или регистрации — и Laravel делает для нас магию (в зависимости от пакета, который мы используем).
Предположим, мы используем Laravel Breeze или Jetstream. В этом случае предоставленная аутентификация создаст для нас сеансовый файл cookie, который наша реализация может затем использовать для каждого последующего запроса, чтобы доказать его состояние аутентификации. Это немного смутило меня. Мне было интересно, где должен быть мой токен и что у меня на стороне, чтобы доказать, что я аутентифицирован, кроме файла cookie.
Предположим, я должен был создать приложение CLI, мобильное приложение или какую-либо интеграцию, которая должна работать с моей локальной системой. В этом случае мы можем использовать Sanctum, чтобы передать имя для создания токена, который нуждается в хранении, что кажется естественным. Однако наш API может иметь интеграцию через одностраничное приложение или даже другое приложение, также построенное в Laravel. Эта часть не имеет значения, так как это не то, что мы устанавливаем.
Лучший способ подойти к аутентификации — следовать тому, что я бы назвал простым руководством:
Вы должны использовать Laravel Sanctum с аутентификацией на основе файлов cookie. Файл cookie может быть настроен так, чтобы он был таким же длинным или недолговевременным, как и когда доступ останавливается, аутентификация также может сделать это.
Вы создаете что-то, что устанавливается на устройстве пользователя. Именно здесь нам нужно сделать пару вариантов. Является ли доступ чем-то, что нужно контролировать на основе идентификации? Другими словами, есть ли у приложения доступ ко всему, а нет уровня авторизации? Passport Laravel с использованием учетных данных клиента — хороший звонок, если это так. Laravel Passport имеет тип гранта, называемый учетными данные клиента: где вы аутентифицируете клиента, а не пользователя, чтобы тот, кто имеет доступ к клиенту, мог контролировать систему. Вы можете продвинуть это немного дальше с PKCE, где вы не можете гарантировать конфиденциальность секрета клиента.
Если вам нужно аутентифицировать пользователя, а не клиента, опирайтесь на Laravel Sanctum и передайте уникальное имя для установленного приложения, чтобы вы могли хранить предоставленный токен и использовать его повторно.
Самая большая проблема с использованием Laravel Sanctum заключается в том, что вы должны получить межсайтовый файл cookie запроса, чтобы делать запросы к вашему Laravel API. При создании SPA это не проблема и лучший подход, чем хранение веб-токена JSON в локальном хранилище.