API Авторизация из одной точки при помощи Lumen или Laravel?
Пишу API для проекта, хочу реализовать one-point авторизацию. Что-то вроде единый аккаунт для всех проектов, т.е. зарегистрировавшись однажды для всех будущих проектов аккаунт подойдет. Очень похоже на регистрацию на хабре с их TM.
Техническую сторону представляю так: Сначала окно с авторизацией, если логин-пароль и верификационный код (для подтверждения что это не левый клиент) подходит - выдается токен, приложение его сохраняет.
К примеру запрос на авторизацию пользователя: api.company.com/aouth/...
Далее все запросы к проекту идут вместе с выданным токеном.
Запрос к проекту размещен в другом месте: api.project.com/users/23...
Проверка токена проходит уже на сервере, делается запрос на api для личного кабинета.
Как вывод: мне нужно два отдельных проекта Laravel или Lumen, один API отвечает за доступ приложения к API и авторизации пользователя. Выдает токен если все успешно.
Второй API сохраняет токен и обращается к API проекта, который и проверяет токен у первого API.
По сути тут мало что можно придумать:
- Делаем центральный репозиторий с ключами.
- Делаем сервис который будет авторизовывать, выдавать ключи и складывать их в репозиторий.
- На остальных сервисах просто обращаемся к репозиторию, и проверяем есть ли и валидный ли ключ.
Плюс в том, что репозиторий и сервис авторизации можно расположить где угодно и писать на любом языке, так как общение с ними идет по API.
Один API служит для авторизации, выдает ключ. Приложение сохраняет его, и делает все запросы к API проекта прикрепляя ключ. Проверка ключа происходит запросом к API для авторизации. Вроде так же?
Что скажете насчет Oauth 2.0? Или его использовать для этого решения не выйдет?
Иван Воробей: да, вы именно так и описали. Я просто сделал выжимку.
Свой сервер oauth я не использовал, но не вижу проблемы поставить его.
Если не хочется сильно заморациваться, можно использовать JWT для всей этой цепочки.
А можно еще проще...
- Сервер авторизации генерирует уникальный токен и кладет его в репозиторий
- После авторизации редиректимся на нужный сайт с этим токеном.
- Сайт проверяет токен в репозитории и если все ок, то авторизовывает пользователя стандартным ларавеловским Auth.
Тогда не нужно будет мудрить с постоянными запросами к репозиторию и писать свой драйвер для Auth.
Но тут проблема с отзывом авторизации, не получиться разом разлогинить пользователя на всех сервисах.
D' Normalization: спасибо! Еще вопрос, стоит ли делать запрос авторизации сначала на API проекта, который будет отправлять его на API аккаунта, или делать напрямую?
Как в это все вольется авторизация через соц. сети? Имею ввиду что аккаунт можно будет создать через социалки, и авторизироваться на API проекта используя их.
Иван Воробей:
>Еще вопрос, стоит ли делать запрос авторизации сначала на API проекта, который будет отправлять его на API аккаунта, или делать напрямую
Тут зависит от того, какие токены и как будут использоваться.
>Как в это все вольется авторизация через соц. сети?
Можно сделать хранение "аккаунтов" на том же центральном сервисе авторизации, или вообще в репозитории.
Т.е схема такая:
- Авторизовываем пользователя (не важно каким способом)
- Если это новый юзер, то создаем аккаунт
- Генерируем ему токен и привязываем его к аккаунту.
- На всех сервисах по токену получаем аккаунт. Т.е по сути у нас будет 1 аккаунт в общем репозитории и сколько угодно аккаунтов в локальных (для каждого проекта).
Так вроде реализованно у ТМ. Т.е у нас есть основной аккаунт (логин\пароль\социалки) по которым происходит авторизация, и есть "локальные" аккаунты на хабре, тостере, фрилансим со своими профилями, которые привязанны к 1 основному аккаунту.
D' Normalization: спасибо! Теперь у меня в голове выстроилась картина. Именно как у хабра, да.
Уточнение: мой единый центр авторизации заводит аккаунт, связывает с аккаунтом токен. Этот токен выдается локальному аккаунту и после манипулирует им (посылает в запросах). Надеюсь правильно думаю.
Как мне определить куда обращаться за авторизацией: или к api с аккаунтам (напрямую) или делать затычки на локальном api и делать запрос из этого api к основному (с перепдрисацией на вспомогательном)
Иван Воробей:
>Как мне определить куда обращаться за авторизацией
Это уже вкусовщина. Но я бы сделал редирект на отдельный домен (как у ТМ), чтобы не пилить для каждого сервиса еще и заглушку авторизации.
Т.е просто редиректим на отдельный домен, там получаем токен и возвращаемся обратно с токеном и стюардессами.
Иван Воробей: это опять таки вкусовщина (с чем вам будет проще работать). Я бы сделал уникальные токены на каждый проект, чтобы нельзя было, например, украсть токен на одном ресурсе, и получить доступ ко всем остальным.