サーバー上の Web サイトからデータを読み込むために REST API を使用する PhoneGap に組み込まれた単純なアプリを作成しています (PhoneGap 内で PHP を実行できないため)。
一部のデータをリストする例は次のとおりです。
$.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 が HTML ではなく JSON を想定しているため、エラーが発生します。
認証が要求された場合、現在行っているようにアプリから HTML ログイン フォームを返すのではなく、PhoneGap アプリにログイン フォーム ビューをロードするなど、これを処理するためのベスト プラクティスはありますか? おそらくJSON経由で認証リクエストを送信しますか?
例として、JSON 化された単純なメソッドは次のようになります。
public function index() {
$this->set('posts', $this->paginate());
$this->set('_serialize', array('posts'));
}
前述のように、メソッド名を に渡さないbeforeFilter
ようにすることで、 でこのメソッドを保護できます。したがって、リクエストが JSON であるかどうかを知るために beforeFilter で巧妙なことをする必要があると推測しています。そうであれば、メソッドに認証が必要かどうかを確認し、そうであればエラーを送り返します (通常は Cake のような HTML フォームではなく)。 JSON で AuthComponent を介して行うか、アクセスを許可します。$this->Auth->allow()
更新: 2012 年 1 月 13 日
このテーマについてさらに調査を行った後、RESTful API に関して私が構築しようとしているものを効果的に構築しているように見えるため、Forrst API を調べました。
たとえば、次のような呼び出しがあります: https://forrst.com/api/v2/post/comments?tiny_id=HUDこれは基本的に、HUD の小さな ID を持つ投稿のコメントを表示すると言っています。認証されていない場合に返されるものは次のとおりです。
{"resp":{"error":"this method requires authentication"},"stat":"fail","in":0.0903,"authed":false,"authed_as":false,"env":"prod"}
ここで興味深いのは、Forrst にログインしている場合でも、実際の要求を認証するために何らかのトークンを期待しているのではなく、セッションを見ていないため、そのエラー メッセージが表示されることです。例えば?access_token=550e8400-e29b-41d4-a716-446655440000
ここでの主な質問は、どうすればこれを Cake アプリに組み込むことができるかということです。計画は次のとおりです。
私のアプリでは、AJAX 経由でリクエストしたかブラウザでリクエストしたかに関係なく、ログイン ページにリダイレクトされます。Forrst は両方を処理し、API を呼び出すと常に JSON エラーを返し、HTML を返すことはありません! これが私の実装で達成したいことです。ユーザー テーブルに access_token 列を追加しました (セキュリティ上の理由から、誰かがパスワードを更新するたびに変更されます)。次のステップは、A) 保護されたメソッドのこのアクセス トークンをチェックし、それが正しい場合は許可または拒否します。次に、B) トークンが存在しないか正しくない場合に何らかの方法で処理し、HTML ログインの代わりに正しいエラー ステータスを送信する必要があります。形。