我为 CakePHP 应用程序构建了一个简单的测试 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 用户)可以发送他们的登录详细信息,然后他们将请求以 JSON 格式作为 true 或 false 进行身份验证。此布尔值不用于授予用户访问权限,而是告诉移动应用程序他们是否可以看到某些屏幕,并且他们只能获取数据或如果会话存在则可以发送数据!
如前所述,他们实际上也登录到设备上的 API 本身,因此如果他们直接(从该设备)访问网站,他们将有一个会话并看到相同的 JSON 响应。
因此,从本质上讲,用户在与服务器通信的设备上的会话期间保持登录状态。这与需要为每个请求传递的令牌不同,在此示例中它们有一个会话。
现在问题...
用户使用如上所示的会话“实际”登录到 API 是不好的做法吗?这似乎是处理设备身份验证的最安全方法,因为它使用与直接 Web 根目录相同的逻辑。
我已经看到一些 API 使用访问令牌,而不是我也实现了(用户返回他们的令牌而不是布尔值,并且没有创建会话)。但据我所知,这似乎需要更多工作,因为每次发出请求时,我都需要根据用户记录检查访问令牌。