2016-09-28 21 views
0

我正在嘗試製作網站的後端API(我想讓後端獨立於前端,因此我現在只需製作服務器端API儘可能遵守RESTfulness)。我之前沒有這樣做過,所以我不知道最安全的做法。關於使用會話創建Web API的問題

我怎麼現在就這樣做:

的API的某些部分應該只給特定用戶訪問他們登錄後長達24小時後。

要做到這一點,每當用戶在服務器端登錄(我使用無密碼登錄,因此用戶在他們的電子郵件中單擊鏈接時分配了該用戶ID),就會生成隨機會話ID,通過將該會話ID發送給客戶端進行響應一次。客戶端然後將該會話ID存儲在localstorage中(或者如果客戶端不是Web瀏覽器,則將其存儲在磁盤中)。

接下來,我將該ID與相關電子郵件一起存儲在服務器端的我的數據庫(MySQL表)中。

現在,每當客戶端想要我的API中的某些東西時,他們都必須在URL中提供電子郵件&會話ID(我現在不想Cookie),服務器會檢查數據庫中的會話ID,如果他們存在然後服務器響應完全否則與錯誤響應。

24小時後,服務器刪除電子郵件/會話ID對,並且用戶必須再次登錄(以生成另一個會話ID並將其與他們的電子郵件相關聯)。

現在的問題:

  1. 是我的方法安全還是有明顯的漏洞? 還有另一個我不知道的經過戰鬥考驗的方式嗎?

  2. 有沒有更好的方式讓客戶端存儲會話ID(如果他們是網頁瀏覽器,它們是 )?

  3. 什麼是生成唯一會話ID的最佳方式?目前我 生成一個隨機的16個字符的字符串,我設置爲 會話電子郵件表的主鍵。

  4. 正在使用MySQL表最高性能/最好的方式來存儲會話 ID(鑑於它將與每個請求查詢)?

  5. 我需要以任何方式加密會話ID嗎? 客戶端將其作爲「裸體」URL參數發送是否安全?

對不起,有一個帖子中有太多的問題,但我認爲他們是由上面的單一場景相關。如果它有什麼不同,我使用F#,我希望我的客戶端可以是Android應用程序或Web應用程序。

+0

我不確定如何處理您的問題。它肯定與REST無關,它只是一個普通的Web應用程序。請刪除REST標籤,或者說明爲了使您的API具有RESTful功能,您做了什麼。 – inf3rno

+0

@ inf3rno我在開頭提到REST。基本上我希望它是一個RESTful API(即,我不希望我的API的狀態完全中斷REST)。 – Tim

回答

0

您的REST API務必不知道有關REST客戶端會話的任何內容,甚至連會話ID都不知道。如果您不想通過每個請求發送密碼,您只需簽署用戶標識和超時時間,以便服務可以基於簽名進行身份驗證。使用JSON Web令牌:https://en.wikipedia.org/wiki/JSON_Web_Token

您可以有一個服務器端REST客戶端,它可以具有您描述的會話。問題是,開發REST服務而不是常規Web應用程序真的值得嗎?我不確定你的情況,但通常答案是否定的,因爲你不會有任何第三方REST客戶端,並且你的應用程序沒有足夠的流量來證明分層架構的合理性,或者它不夠大而不能分成多個進程等...

如果安全性很重要,那麼你必須使用一個真正的隨機生成器算法或硬件。 https://en.wikipedia.org/wiki/Random_number_generation#.22True.22_vs._pseudo-random_numbers通過HTTP發送任何東西並不安全,您必須改用HTTPS。您必須使用標準授權標頭而不是查詢參數。 https://en.wikipedia.org/wiki/Basic_access_authentication