ПРИМЕЧАНИЕ: у меня было 4 щедрости на этот вопрос, но ни один из приведенных ниже ответов не является ответом, необходимым для этого вопроса. Все, что нужно, находится в обновлении 3 ниже, просто для поиска кода Laravel для реализации.
ОБНОВЛЕНИЕ 3: Эта блок-схема - именно тот поток, который я пытаюсь выполнить, все ниже - оригинальный вопрос с некоторыми более старыми обновлениями. Эта блок-схема суммирует все необходимое.
Зеленые части в блок-схеме ниже - это те части, которые я знаю как делать. Красные части вместе с примечаниями к ним - вот то, что я ищу для помощи в использовании кода Laravel.
Я провел много исследований, но информация всегда была короткой и неполной, когда дело доходит до использования Laravel с cookie файлом JWT httponly для самопотребляющего API (большинство онлайн-уроков показывают только то, что JWT хранится в локальном хранилище, которое не очень безопасно).). Похоже, что файл cookie httponly, содержащий JWT by Passport, должен использоваться для идентификации пользователя на стороне Javascript при отправке с каждым запросом к серверу для проверки того, что пользователь является тем, кем они себя называют.
Есть также некоторые дополнительные вещи, которые необходимы, чтобы иметь полную картину того, как заставить эту установку работать, с которой я не сталкивался ни в одном учебнике, который покрывает это:
- Laravel Passport (не tymon auth) для генерации зашифрованного JWT и отправки его в виде файла cookie httponly в качестве ответа после входа в систему со стороны JS. Какое промежуточное программное обеспечение использовать? Если токены обновления повышают безопасность, как это сделать?
- JavaScript (например, axios) api-псевдокод API, который выполняет вызов к конечной точке аутентификации, как cookie файл httponly передается в бэкэнд и как бэкенд проверяет токен.
- Если в одну учетную запись вошли с нескольких устройств, то устройство украдено, как отозвать доступ со всех устройств с аутентифицированным пользователем (если пользователь меняет пароль с зарегистрированного устройства, которым он управляет)?
- Как бы выглядели методы контроллера "Вход/Регистрация", "Выход из системы", "Смена пароля", "Забыли пароль" для создания/проверки/отзыва токенов?
- Интеграция токенов CSRF.
Я надеюсь, что ответ на этот вопрос послужит простым руководством для будущих читателей и тех, кто в данный момент пытается найти ответ, охватывающий вышеперечисленные вопросы о самопотребляющем API.
ОБНОВЛЕНИЕ 1:
- Обратите внимание, что я пробовал
CreateFreshApiToken
раньше, но это не сработало, когда дело доходит до отзыва токенов пользователя (для пунктов 3 и 4 выше). Это основано на этом комментарии основного разработчика Laravel, когда речь идет о промежуточном программном обеспеченииCreateFreshApiToken
:
Токены JWT, созданные этим промежуточным ПО, нигде не хранятся. Они не могут быть отозваны или "не существуют". Они просто предоставляют способ авторизации ваших вызовов API через cookie файл laravel_token. Это не связано с токенами доступа. Кроме того: вы обычно не используете токены, выпущенные клиентами в том же приложении, которое их выпускает. Вы бы использовали их в первом или стороннем приложении. Либо используйте промежуточное программное обеспечение, либо клиент выпустил токены, но не оба одновременно.
Таким образом, кажется, что он может обслуживать пункты 3 и 4 для отзыва токенов, это невозможно сделать при использовании промежуточного программного обеспечения CreateFreshApiToken
.
- На стороне клиента кажется, что
Authorization: Bearer <token>
- это не тот путь, когда имеешь дело с безопасным файлом cookie httpOnly. Я думаю, что запрос/ответ должен включать в себя защищенный файл cookie httpOnly в качестве заголовка запроса/ответа, например, на основе документов laravel:
При использовании этого метода аутентификации скаффолдинг Laravel JavaScript по умолчанию указывает Axios всегда отправлять заголовки X-CSRF-TOKEN и X-Requested-With.
headerswindow.axios.defaults.headers.common = {
'X-Requested-With': 'XMLHttpRequest',
'X-CSRF-TOKEN': (csrf_token goes here)
};
Это также причина, по которой я ищу решение, которое охватывает все пункты выше. Извиняюсь, я использую Laravel 5.6, а не 5.5.
ОБНОВЛЕНИЕ 2:
Похоже, что комбинация Password Grant/Refresh Token Grant - это то, что нужно. Ищите простое в использовании руководство по внедрению с использованием паролей Grant/Refresh Token Grant.
Предоставление пароля. Этот грант подходит для работы с клиентом, которому мы доверяем, например с мобильным приложением для нашего собственного веб-сайта. В этом случае клиент отправляет учетные данные пользователя на сервер авторизации, а сервер напрямую выдает токен доступа.
Обновление предоставления токена. Когда сервер выдает токен доступа, он также устанавливает срок действия токена доступа. Обновление разрешения токена используется, когда мы хотим обновить токен доступа после его истечения. В этом случае сервер авторизации отправит токен обновления при выдаче токена доступа, который можно использовать для запроса нового токена доступа.
Я ищу простой в реализации, понятный и целостный ответ, используя комбо " Предоставление пароля/Обновление токена", которое охватывает все части вышеупомянутых оригинальных 5 пунктов с помощью httpOnly secure cookie, создания/отзыва/обновления токенов, создания cookie входа в систему, отмена cookie для выхода из системы, методы контроллера, CSRF и т.д.