CakePHP基本身份验证和jQuery
我试图用完全用jQuery编写的应用程序在CakePHP中实现基本身份验证。我本来打算使用OAuth2,但对增加的复杂性感到厌倦,因为这个应用程序将是唯一使用API的应用程序,基本的身份验证应该足够了 登录方法如下所示:CakePHP基本身份验证和jQuery,php,jquery,cakephp,authentication,Php,Jquery,Cakephp,Authentication,我试图用完全用jQuery编写的应用程序在CakePHP中实现基本身份验证。我本来打算使用OAuth2,但对增加的复杂性感到厌倦,因为这个应用程序将是唯一使用API的应用程序,基本的身份验证应该足够了 登录方法如下所示: login: function(username, password) { $.ajax({ type: 'GET', url: 'http://api.domain.com/login', beforeSend
login: function(username, password) {
$.ajax({
type: 'GET',
url: 'http://api.domain.com/login',
beforeSend : function(xhr) {
var base64 = $.base64.encode(username + ':' + password);
xhr.setRequestHeader("Authorization", "Basic " + base64);
},
dataType: 'jsonp',
success: function(data) {
if( data.response.status == 'error' ) {
alert(data.response.message);
} else {
// Save some sort of session
}
},
error: function(a,b,c) {
console.log(a,b,c);
}
});
}
在CakePHP方面:
public function login() {
if ($this->request->is('get')) {
if ($this->Auth->login()) {
$response = json_encode(
array(
'meta'=>array(
'code'=>$this->response->statusCode(),
'in'=>round(microtime(true) - TIME_START, 4)
),
'response'=>array(
'status'=>'success',
'message'=>'successfully logged in'
)
)
);
} else {
$response = json_encode(
array(
'meta'=>array(
'code'=>$this->response->statusCode(),
'in'=>round(microtime(true) - TIME_START, 4)
),
'response'=>array(
'status'=>'error',
'message'=>'incorrect login details'
)
)
);
}
// Handle JSONP
if(isset($_GET['callback'])) {
$response = $_GET['callback'] . '(' . $response . ')';
}
// Return JSON
$this->autoRender = false;
$this->response->type('json');
$this->response->body($response);
}
}
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate: Basic realm="My Realm"');
header('HTTP/1.0 401 Unauthorized');
echo 'Text to send if user hits Cancel button';
exit;
} else {
echo "<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo "<p>You entered {$_SERVER['PHP_AUTH_PW']} as your password.</p>";
}
?>
会话可以在没有cookie的情况下使用,在每个查询中将其作为参数和json响应的值共享
准备应用程序以在其中存储sessionID
成功的ajax登录后,json响应中包含sessionID
每个下一个请求都必须包含sessionID作为参数,响应还必须包含sessionID
这就是我应该做的。会话可以在没有cookie的情况下使用,在每个查询中作为参数和json响应值共享
准备应用程序以在其中存储sessionID
成功的ajax登录后,json响应中包含sessionID
每个下一个请求都必须包含sessionID作为参数,响应还必须包含sessionID
这就是我要做的。虽然基本身份验证是无状态的,但根据CakePHP文档:
使用基本身份验证的客户端必须支持cookie。自从
AuthComponent根据会话内容和客户端标识用户
使用基本身份验证必须支持cookies
但是:
您还可以将AuthComponent::$sessionKey
设置为false以确保
AuthComponent不尝试从会话读取用户信息。无国籍
身份验证将在每次请求时重新验证用户的凭据,
这会产生少量的额外开销,但允许客户端
您可以在不使用cookie的情况下登录
您的AppController应该如下所示:
class AppController extends Controller {
public $components = array('Auth', 'Session');
public function beforeFilter() {
$this->Auth->authorize = array('Controller');
$this->Auth->authenticate = array('Basic');
$this->Auth->sessionKey = false;
}
}
您可能还想使用$this->Auth->unauthorizedRedirect=false代码>。默认情况下,未经授权的用户被重定向到引用者URL或AuthComponent::$loginAction或“/”
。如果unauthorizedDirect
设置为false
将引发禁止异常,而不是重定向
然后,在每个控制器中,您必须具有isAuthorized()
方法,在该方法中,您可以根据用户的角色对用户进行授权,就像对常规表单身份验证所做的那样。例如:
public function isAuthorized($user) {
if (isset($user['role']) && ($user['role'] == 'admin')) {
return true;
}
return false;
}
因为基本和摘要身份验证不需要初始POST
或者,如果只使用基本/摘要验证器,则不使用
需要在控制器中执行登录操作
这意味着您不需要显式地调用Users::login(),当用户尝试访问URL时,将显示基本身份验证窗口,在该窗口中,如果您没有像在Ajax调用xhr.setRequestHeader(“授权”)中那样发送基本授权标头,则每次请求页面时,她都必须输入用户名和密码,“Basic”+base64);
如果您不希望在每个请求上向用户显示这样的窗口,则可以将用户凭据存储在cookie中,或者最好存储在客户端的本地存储()中,并在每个请求上设置“Authorization”(授权)头(任何控制器的任何操作)
您始终可以通过以下方式将经过身份验证的用户详细信息从控制器发送回客户端:
$this->set(array(
'user' => json_encode($this->Auth->user()),
'_serialize' => array('user')
));
概率