Я создаю простое приложение, встроенное в PhoneGap, которое использует REST API для загрузки данных с моего сайта на сервере (потому что вы не можете запускать PHP внутри PhoneGap).
Примером для перечисления некоторых данных может быть:
$.ajax({
url: 'http://myserver.com/posts/index.json',
dataType: 'jsonp',
success: function(data) {
for (var i=0,total=data.length; i<total; i++)
{
console.log(data.Post.title[i]);
}
}
});
Это нормально, и возвращенные данные могут быть использованы в моем приложении PhoneGap. Однако скажите, что список сообщений требует, чтобы вы вошли в систему...
Как бы я справился с этим? Поскольку в отличие от обычного запроса на аутентификацию, посредством которого он перенаправляется на форму входа в систему, в моем мире JSON этого не произойдет. Фактически, что происходит, возвращается фактическая форма входа в HTML, которая затем вызывает ошибку, потому что мой JavaScript ожидает JSON, а не HTML.
Есть ли наилучшая практика для обработки этого, например, если запрашиваемая аутентификация затем загружает вид формы входа в приложение PhoneGap вместо того, чтобы возвращать форму входа в систему из приложения, как она сейчас делает? Возможно, отправив запрос авторизации через JSON?
В качестве примера простой метод JSONized выглядит так:
public function index() {
$this->set('posts', $this->paginate());
$this->set('_serialize', array('posts'));
}
И как было сказано ранее, я могу защитить этот метод в beforeFilter
не, передав имя метода в $this->Auth->allow()
. Поэтому я предполагаю, что мне нужно будет сделать что-то умное в файле beforeFilter, чтобы узнать, является ли этот запрос JSON, и если да, то проверьте, требует ли метод авторизации, а затем, если это так, отправьте ошибку (вместо HTML-формы как Cake обычно через AuthComponent) в JSON или разрешить доступ.
ОБНОВЛЕНИЕ: 13 января 2012
После нескольких исследований по этому вопросу я рассмотрел API Forrst, поскольку они, похоже, эффективно создали то, что я собираюсь построить с точки зрения API RESTful.
Например, у них есть вызов типа: https://forrst.com/api/v2/post/comments?tiny_id=HUD, это в основном говорит о том, чтобы отображать комментарии для сообщения с крошечным идентификатором HUD. То, что вы получите, следующее: если вы не прошли аутентификацию:
{"resp":{"error":"this method requires authentication"},"stat":"fail","in":0.0903,"authed":false,"authed_as":false,"env":"prod"}
Теперь интересная часть EVEN, если я зашел в Forrst, я все равно получаю это сообщение об ошибке, потому что он не смотрит на мою сессию, а ожидает, что какой-то токен аутентифицирует фактический запрос. например ?access_token=550e8400-e29b-41d4-a716-446655440000
Итак, главный вопрос, который я предполагаю, заключается в том, как я могу создать это в своем приложении Cake? План выглядит следующим образом:
В моем приложении он перенаправил бы вас на страницу входа, независимо от того, запросили ли вы ее через AJAX или в браузере. Forrst обрабатывает оба и ALWAYS возвращает ошибки JSON при вызове API и не возвращает HTML никогда! Это то, чего я хочу достичь в своей реализации. Я добавил столбец access_token в таблицу моих пользователей (которая изменяется всякий раз, когда кто-либо обновляет свой пароль по соображениям безопасности). Следующим шагом будет A) проверить этот токен доступа для защищенных методов и разрешить или запретить, если он будет исправлен, а затем B) Мне нужно каким-то образом обрабатывать, когда не существует или неверен токен, и отправляет правильный статус ошибки вместо входа в HTML форма.