2013-06-25 129 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