2013-06-25 127 views
8

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

即使它使用2路验证或只有API密钥。我正在寻找一个同时是以下情形:

  • 用户请求的第一次(例如:https://www.xyz.com)的应用程序,然后它会被重定向到登录页面,以检查凭证
  • 用户进入usernam /密码,并通过POST发送过来的HTTPS
  • 服务器检查,如果信息是有效的,那么:

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

    • 如何以安全的方式将API密钥发送到客户端?

      • 1)我可以使用会话cookie和在cookie中恢复API密钥,然后使用每个来要求这个API KEY(这是暴力其余部分的无状态的,我不知道它足够安全)。
      • 2)其实我不知道其他的选择:)轮到你了,如果你能帮助

如果你能举一个例子这将是一个很大的帮助,因为我找到并阅读大量的文章

:)

+0

如果我使用的方法只使用Api密钥来验证用户是安全的,我担心安全,因为应用程序内的数据是敏感的 – ahmedsaber111

回答

8

由于连接是HTTPS,任何你寄过来的电线是安全的(理论上和提供您不是mitm'd)。不确定整个API是否通过HTTPS提供(您没有指定),因此即使您可以将密钥作为登录的一部分返回(仍处于HTTPS的保护范围内),但如果api的其余部分不是HTTPS,关键可能会在下一个请求中被嗅探。

会话和cookie通常不是RESTful应用程序的一部分; REST是无状态的。

类似于旋转键的东西对于非HTTPS会更好(也可以与HTTPS一起使用)。您通过HTTPS登录,服务器返回api密钥,您在下一个请求中使用它,服务器返回新的api密钥,您在下一个请求中使用它,依此类推。虽然它比单个非HTTPS API更好,但它并不完美。如果有人嗅探其中一个后续请求的响应,并且最终没有使用该密钥,则可以使用该密钥。这将攻击向量缩小为从服务器到客户端的非HTTPS响应,因为如果从客户端到服务器的请求被嗅探,api密钥已经被您的合法请求占用。但是,如果您未通过HTTPS提供服务,则应该采取更多措施来保护api。

如果是我,我会考虑请求签名+ https。有要求签名的一些谈话这里:https://stackoverflow.com/a/8567909/183254

也有上消化在AUTH确保API http://net.tutsplus.com/tutorials/php/working-with-restful-services-in-codeigniter-2/

的伪代码示例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); 
} 
+0

我最大的问题是我怎么能发送API密钥用户成功登录后尝试以便能够在下一个请求中使用此api密钥 – ahmedsaber111

+0

我添加了并使用日历方法的示例。基本上只是创建一个数组,并将响应和api键放在那里,然后用'$ this-> response() – stormdrain