JavaScript ベースのアプリで動作するように、PHP で REST API を構築しています。すべてのリクエストは JSON として処理され、一部のリクエストには認証が必要です。
リクエストの例は次のとおりです。
$.ajax({
type: 'GET',
url: 'http://domain.com/api/posts/recent.json',
headers: {
Authorization: 'X-TRUEREST ' + $.param({
username: 'johndoe',
password: '********'
})
},
success: function(response){
// Handle response here (includes auth errors too)
},
error: function(a,b,c) {
}
});
このプラグインのコードに基づいて HTTP 認証ヘッダーを使用しました: https://github.com/kvz/cakephp-rest-plugin/blob/master/Controller/Component/RestComponent.php#L532
ご覧のとおり、ヘッダーで渡されたパラメーターを取得し、ユーザーがまだシステムにログインしていない場合は、それらを使用してシステムにログインします。私が言えることから、彼らは認証資格情報がデータの要求とともに渡されることを期待しています。
この例は次のとおりです (私のサンプルアプリでは CakePHP を使用していないことに注意してください):
if ( $loggedIn ) { // logged in is true of false based on session existing
// Then return the JSON as normal
} else {
// Grab HEADERS INFO
$headers = $_SERVER['HTTP_AUTHORIZATION'];
$parts = explode(' ', $_SERVER['HTTP_AUTHORIZATION']);
// Then use the parts to find a user in the DB... and populate $user
if($user){
$this->Auth->login($user); // login the user with our authentication code
// Then return JSON as normal
} else {
print json_encode(array('auth'=>false))
}
}
私が持っているいくつかの質問:
質問 1:なぜ HTTP 認証とヘッダーを使用するのですか? 私が知る限り、私がそれらを間違って使用していない限り、彼らは私に何も提供してくれませんか? JS のデータ パラメーターでユーザー名とパスワードを渡さないのはなぜですか?
質問 2:前述のように、API 設計は上記の Cake プラグインに基づいていますが、私が見る限り、彼らは常にすべてのリクエストでユーザー名とパスワードを渡し、ユーザーがログインしている場合にそれを使用するかどうかを決定します。これは正しいですか?私には、認証とデータの要求を別々に処理する必要がある可能性が高いようです。そうしないと、リクエストごとに送信できるように、JavaScript のどこかにユーザー名とパスワードを保存する必要があります。
それが次の質問につながります...
質問 3:ユーザーがログインしているかどうかを確認するにはどうすればよいですか? 変数を true に設定し、それをすべてのリクエストで JSON の一部として渡すことはできますが、セッションは外部デバイスと連携できますか?