私は CakePHP アプリケーション用の簡単なテスト API を作成しました。この API を使用すると、ユーザーはモバイル デバイス (または任意のデバイス) からログインして、JSON 応答を取得できます。この API は、PhoneGap で構築されたモバイル アプリに使用できます。
ログイン方法は次のようになります。
public function login()
{
if($this->request->is('post'))
{
// Use custom method in Model to find record with password params
$findUser = $this->User->findUser(
$_POST['username_or_email'],
AuthComponent::password($_POST['password'])
);
// If a user exists and matches params
if($findUser)
{
$this->User->id = $findUser['User']['id'];
$this->autoRender = false;
$this->response->type('json');
$this->response->body(json_encode(array('authenticated'=>true,'message'=>__('You have been logged in successfully'))));
}
else
{
$this->autoRender = false;
$this->response->type('json');
$this->response->body(json_encode(array('authenticated'=>false,'message'=>__('Username or password is incorrect'))));
}
}
else
{
$this->autoRender = false;
$this->response->type('json');
$this->response->body(json_encode(array('message'=>'GET request not allowed!')));
}
}
モバイル デバイス (または任意の API ユーザー) は、ログインの詳細を送信できます。その後、認証済みの true または false として JSON として要求を取得します。このブール値は、ユーザー アクセスを許可するために使用されるのではなく、モバイル アプリに特定の画面を表示できるかどうかを伝え、データのみを取得するか、セッションが存在する場合にデータを送信できます。
前述のように、実際にはデバイス上の API 自体にもログインしているため、(そのデバイスから) Web サイトに直接アクセスすると、セッションが発生し、JSON に対して同じ応答が表示されます。
したがって、基本的に、ユーザーは、サーバーと通信しているデバイスでのセッションの間、ログインしたままになります。これは、この例のようにセッションがある場合に、リクエストごとに渡す必要があるトークンとは異なります。
さて、質問は...
上記のようなセッションでユーザーが「実際に」API にログインするのは悪い習慣ですか? ダイレクト Web ルートと同じロジックを使用しているため、デバイスの認証を処理する最も安全な方法のようです。
私が実装した代わりに、いくつかの API がアクセス トークンを使用しているのを見てきました (ユーザーはブール値の代わりにトークンを取得し、セッションは作成されません)。しかし、私が知る限り、リクエストが行われるたびにユーザー レコードに対してアクセス トークンを確認する必要があるため、これはより多くの作業のように思えます。