Аутентификация Rails API - проверка работоспособности и совет - PullRequest
0 голосов
/ 09 января 2012

Я хочу создать приложение Rails, которое предоставляет API для использования только авторизованными клиентскими приложениями (это будут мобильные приложения для iOS / Android). Я еще не начал работать над приложением, но основной метод доступа к базовым данным будет через API. Я рассматривал использование драгоценного камня grape , но мне нужно было бы добавить к нему слой аутентификации. Я думал о том, чтобы использовать devise и добавить другую модель для хранения деталей клиента, API-ключа и секретного ключа. При входе через API, ключ и секрет API возвращаются. Ключ API передается с каждым запросом, а секретный ключ - нет. Вместо этого он используется для подписи каждого запроса; параметры запроса упорядочены по имени, хешируются с использованием секретного ключа в качестве ключа хеширования. Эта подпись затем добавляется в качестве параметра к запросу.

Звучит ли эта система аутентификации логично и безопасно?

Я пытался создать прототип системы ранее, но столкнулся с трудностями при регистрации пользователя с помощью JSON с помощью devise. Сначала я получал ошибку CSRF. Затем я выключил protect_from_forgery и получал еще одну ошибку. Безопасно ли отключить это, если я аутентифицируюсь таким образом?

Ответы [ 2 ]

1 голос
/ 09 января 2012

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

0 голосов
/ 09 января 2012

protect_from_forgery помогает защитить ваши HTML-формы. Если вы используете JSON от мобильных клиентов, он вам не нужен.

Вот что бы я делал на твоем месте:

  • на странице учетной записи пользователя, есть кнопка с надписью «(создать) ключ API»

  • клиент затем встраивает этот ключ в свой код вызова и передает с каждым запросом.

  • ваш сервер API проверяет, можно ли использовать этот ключ API с этим идентификатором клиента.

Очень прост в реализации и хорошо обслуживает.

Параметры подписи также работают, и я успешно использовал их в нескольких проектах. Но это увеличивает сложность кода без какой-либо реальной выгоды (секретный ключ находится на клиенте, злоумышленник уже знает его).

...