【发布时间】:2014-06-01 10:15:06
【问题描述】:
我正在尝试使用完全用 jQuery 编写的应用程序在 CakePHP 中实现基本身份验证。我打算使用 OAuth2,但厌倦了增加的复杂性,并且认为这个应用程序将是唯一使用 API 的应用程序,基本身份验证应该就足够了。
登录方式如下:
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);
}
}
- 如何保存用户登录详细信息?因为我无法创建会话,因为 JavaScript 可能不在同一台服务器上运行(因为它可能是外部应用程序、移动应用程序等)。数据将通过 SSL 发送,但我不确定如何我可以记住用户详细信息,因此用户不必继续登录。据我所知,基本身份验证应该是无状态的......所以甚至不存在 cookie 或会话。任何人都可以阐明这一点吗?
更新: 在对此进行了更多研究之后,我发现用户名和密码需要随每个请求一起发送......所以实际上从来没有会话或 cookie。但是我需要将这些信息存储在某个地方吗?否则用户会在页面上的每个请求后登录对吗?
一旦用户登录并通过身份验证...我如何向数据发出请求并处理身份验证以确保正确的用户具有访问权限,以及他们是否创建了作为他们创建的数据。与在 OAuth2 中一样,我将拥有一个 access_token,我可以将其传递给访问数据,但在 Basic Auth 中,您没有令牌。而且由于没有会话,我无法访问已登录的用户信息。那我该怎么做呢?
1234563用户名和密码?
更新:当尝试根据我上面的代码访问登录方法时,我收到了输入用户名和密码的提示...但这是一个允许方法!任何想法为什么?因为它阻止我的 JavaScript 发送请求,因为端点永远无法访问。此外,如果我使用提示登录,即使我访问注销方法或清除浏览器中的所有会话/缓存,我也 保持 登录。那么如何删除用户登录?
非常感谢任何能帮助我指明正确方向的人,因为我觉得我完全误解了 Basic Auth 的工作方式......一些例子会很棒!
更新 2:
根据 PHP Docs,以下是检查用户是否登录并在取消时显示消息的方法。信息也被存储,无需任何会话!那么同样的原则如何适用于 CakePHP 呢?例如,如何显示正确的 401 状态和自定义消息,如果基于此,登录的用户信息如何存储在 CakePHP 中?
<?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>";
}
?>
【问题讨论】:
标签: php jquery cakephp authentication