我正在用 PHP 构建一个 REST API 以使用基于 JavaScript 的应用程序。所有请求都作为 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 Authentication 和 headers?据我所知,除非我不正确地使用它们,否则他们不会为我提供任何东西?为什么不直接在 JS 的数据参数中传递用户名和密码呢?
问题 2:如前所述,我的 API 设计基于上面的 Cake 插件,但据我所知,他们总是在每个请求中传递用户名和密码,然后在用户登录时决定是否使用它。是这对吗?对我来说,身份验证和数据请求似乎更有可能分开处理。否则我将不得不将用户名和密码存储在我的 JavaScript 中的某个地方,以便我可以随每个请求一起发送它。
这让我想到了下一个问题......
问题3:如何知道用户是否登录?我可以将变量设置为 true,然后将其作为 JSON 的一部分传递给每个请求,但是会话可以与外部设备一起使用吗?