Требования и описание работ для OAuth | Redis | Lua

Требования

«Разогнать» следующие эндпоинты OAuth-сервера:

• Запрос кода авторизации
• Запрос на деавторизацию
• Выпуск токена по коду авторизации
• Выпуск токена по логину/паролю
• Выпуск токена для приложения
• Перевыпуск токена
• Выпуск токена для личного кабинета
• Анализ токена
• Получение профиля

Описание работ

Redis

Существующее Redis-хранилище мы предлагаем оставить как есть, хотя бы из соображений обратной совместимости, а разработать новое.

В Redis-хранилище должна содержаться следующая информация:

• Список всех зарегистрированных приложений с их областями доступа
• Список всех выпущенных кодов авторизации и токенов доступа
• Список всех пользовательских логинов/паролей
• Список всех пользовательских профилей

Этой информации достаточно для обеспечения функциональности обсуждаемых эндпоинтов.

Кроме того, в Redis должен быть создан механизм, обеспечивающий двухстороннюю синхронизацию данных с MySQL (судя по всему, будет использован уже существующий механизм, практически без изменений).

Так, если в MySQL был добавлен токен доступа, то он должен в тот же миг попасть в Redis, и наоборот.

Данное хранилище должно быть документировано и покрыто автоматическими тестами, которые проверяют как само хранение, так и механизм синхронизации.

PHP

Дорабатываем модель данных, чтобы запись и чтение происходили в нужные хранилища.

Если Redis хранилище «разогрето» (то есть синхронизировано с MySQL), то чтение данных осуществляется из Redis. Аналогично, если Redis хранилище «разогрето», то и запись данных осуществляется в него.

А если Redis хранилище не «разогрето», то чтение и запись данных происходит в MySQL, как и сейчас.

Таким образом, в условиях «разогретого» Redis, приложение значительно увеличивает свою производительность, а синхронизация данных из Redis в MySQL происходит в фоновом режиме, не увеличивая время обработки запроса.

В случае «падения» или повреждения Redis-хранилища, приложение сохраняет свою работоспособность, а спустя время, после «разогрева» Redis-хранилища, возвращается к оптимальным эксплуатационным параметрам.

Как минимум две модели — для приложений (clients) и для токенов (oauth sessions) — будут иметь два места хранения — либо MySQL, либо Redis. Нам потребуется абстрагировать разработчика от хранилища, для чего мы предлагаем использовать паттерн Facade.

Без изменений остается модель, которая работает с MySQL хранилищем. В дополнение к ней мы разрабатываем модель, которая работает с Redis хранилищем. Обе эти модели реализуют одинаковый интерфейс.

Работа с моделью будет происходить через Facade, так что программист даже не будет подозревать, с каким хранилищем сейчас работает.

Lua

Будет написана lua версия обсуждаемых эндпоинтов.

Эндпоинты должны быть покрыты автоматическими тестами, которые будут повторять существующие (для php).