由于连接是 HTTPS,因此您通过网络发送的任何内容都是安全的(理论上并且前提是您没有被mitm 'd)。不确定整个 API 是否通过 HTTPS 提供(您没有指定),所以即使您可以将密钥作为登录的一部分返回(同时仍在 HTTPS 的保护伞下),如果其余的 api 不是HTTPS,可以在下一个请求时嗅探密钥。
会话和 cookie 通常不是 RESTful 应用程序的一部分;REST 是无状态的。
对于非 HTTPS(也适用于 HTTPS),类似旋转密钥的东西会更好。您通过 HTTPS 登录,服务器返回 api 密钥,您在下一个请求中使用它,服务器返回新的 api 密钥,您在下一个请求中使用它,依此类推。虽然它比非 HTTPS 上的单个 api 密钥更好,但它并不完美。如果有人从后续请求之一中嗅出响应并且您最终没有使用该密钥,他们可以使用它。这将攻击向量缩小为从服务器到客户端的非 HTTPS 响应,因为如果从客户端到服务器的请求被嗅探,则 api 密钥将已被您的合法请求使用。但是,如果您不通过 HTTPS 提供 API,则应采取更多措施来保护 API。
如果是我,我会研究请求签名+ https。这里有一些关于请求签名的讨论:https ://stackoverflow.com/a/8567909/183254
在http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/的Securing API部分也有一些关于摘要认证的信息
客户端上的一个伪代码示例js函数
function get_calendar(){
var key = $('#api_key').value();
$.ajax({
type: 'get',
url: '/index.php/api/calendar?key=' + key,
success: function(response){
// show calendar
// ...
// set received api key in hidden field with id api_key
$('#api_key').value(response.api_key)
}
})
}
示例控制器方法:
function calendar_get($api_key = ''){
if($api_key_matches){//verify incoming api key
$r = array();
$r['calendar'] = $this->some_model->get_calendar();
$r['api_key'] = $this->_generate_api_key();// generate or get api key
}
$this->response($r);
}