我在PHP中构建REST API以使用基于JavaScript的应用程序。所有请求都以JSON的形式处理,一些请求需要验证。使用HTTP身份验证
一个例子请求是:
$.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
正如你可以看到他们采取传递的参数与头和那么如果用户还没有登录系统,他们将被用于登录系统。从我可以告诉他们期望的auth凭证传递与数据请求。
这方面的一个例子是(在我的示例应用程序使用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身份验证和头文件?据我所知,除非我错误地使用它们,否则它们不会提供任何东西?为什么不在JS的数据参数中传递用户名和密码?
问题2:如前所述我已经基于上述蛋糕插件我的API设计,但是从我所看到的,他们总是每个请求传递用户名和密码,然后决定使用与否如果用户登录,这是正确的吗?对我而言,认证和数据请求应该分开处理的可能性更大。否则,我将不得不将用户名和密码存储在我的JavaScript中,以便我可以在每个请求中发送它。
这使我下一个问题......
问题3:我怎么知道,如果一个用户登录?我可以将变量设置为true,然后将其作为我的JSON的一部分与每个请求一起传递,但会话可以与外部设备一起使用吗?
大多数RestAPI使用令牌或密钥。我正在构建一个需要身份验证的应用程序,然后为用户生成一个令牌。功能很像一个cookie。没有什么说你必须使用标题。您可以使用标题,cookie或参数进行GET或POST – Cfreak
@Cameron,您对外部设备有何意义,为什么它不适用于会话? – Yoggi
@Yoggi外部在会话中由服务器设置,但请求来自其他地方,不像普通的HTTP请求。我并不是说这不会起作用,只是询问可以完成这些操作的不同方式以及HTTP Auth提供的仅仅通过数据参数传递凭据的方式。 – Cameron