Как сделать Api для Rails приложения?

Здрайствуйте. Подскажите пожалуйста алгоритм работы api для рельсового приложения. Суть такова:
Есть rails приложение с системой аутинтификации devise. В приложении можно создавать разнообразные сущности в базе данных. Для работы необходимо уметь создавать, изменять и удалять эти данные без помощи браузера, а с помощью скрипта, который запросы будет отправлять запросы.
Пользователь не может получить доступ ни к одной странице пока не авторизуется, так как во всех контроллерах у меня есть строкаbefore_filter :authenticate_user!
И главный вопрос - как все это сделать? Вроде решений несколько, в зависимости от говнокодистости:
1) Можно создать контроллер "API", который будет принимать запросы типа
{login: 'oleg', password:'123456', action:'create_item', data:{idem_name:'item'}}
- логин и пароль сравниваются, если все совпадает - вызываем там же созданные метод 'create_item' и передаем туда данные :data. Да, можно логин и пароль присылать 1 раз - генерировать токен/записать его в таблицу 'все_допустипые_токены', следующий запрос присылать уже с токеном, искать его в базе - нашли? => выполняем действия. Можно и так, но это условности, методы все равно дубликатить надо.
2) Второй вариант основывается на том, что аутинтификация devise основана на cookies. Схема - такая же, как и у варианта 1, НО в меcто токена, мы каким-то образом(пока не знаю как) логиним пользователя, данные которого передаем, а его куки возвращаем. Во всех последующих запросах эти куки будем просто подкладывать, типо это пользователь. Минус - если разлогинимся - кука перестанет быть валидной.
Оба варианта мне не нравятся, но как правильно делать - хз. Подскажите как можно api по цивилизованному сделать
  • Вопрос задан
  • 936 просмотров
Решения вопроса 1
viktorvsk
@viktorvsk
https://github.com/gonzalo-bulnes/simple_token_aut...
https://github.com/lynndylanhurley/devise_token_auth
Смотрели?

Вариантов, действительно не так много:
1. Единожды создавать сессию, которая истечет через какое-то время, для чего нужно сначала сделать отдельный запрос логин.
2. Слать\вычислять ключ в каждом запросе.

В принципе, вы все правильно описали, разве что с action: 'create_action' - это перебор. Вместо этого отправляйте запросы на соответствующие роуты.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы