8

我们正在构建需要所有页面的登录信息的系统。该应用程序设计为使用 codeigniter 作为Phil Sturgeon库的 Restful 应用程序。该库仅使用 API 密钥通过通过 HTTPS 连接发送每个请求来授权 api 调用。

即使它使用 2 路身份验证或仅使用 API 密钥。我正在寻找的是以下场景:

  • 用户第一次请求应用程序(例如:https://www.xyz.com)然后它将被重定向到登录页面以检查凭据
  • 用户输入用户名/密码并通过 POST 通过 https 发送
  • 服务器检查信息是否有效然后:

    • API KEY 应该由服务器提供给客户端作为由这个用户名标识的资源(这里是问题???!!!

    • 如何以安全的方式将 API Key 发送给客户端?

      • 1)我可以使用 session-cookies 并在 cookie 中恢复 API KEY,然后在每个即将到来的请求上使用这个 API KEY(这是暴力的无状态其余部分,我不确定它是否足够安全)。
      • 2)实际上我不知道其他选择:)如果你能提供帮助,轮到你了

如果你能举个例子,那将是一个很大的帮助,因为我发现并阅读了很多文章

:)

4

1 回答 1

9

由于连接是 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);
}
于 2013-06-28T18:11:30.200 回答