2012-08-30 26 views
4

我正在構建一個將REST接口公開給網站和iphone/android/etc設備的php/mysql後端的初始階段。如何處理跨不同設備的會話?

我不太確定處理多個使用相同帳戶的設備的會話的「標準」或「最佳做法」是什麼。

下面是我對如何做到這一點的工作電流的想法:

  1. 我會用MySQL來存儲會話現在,與會話表所示:

    ID,SESSION_ID(哈希),USER_ID(INT),創建(時間戳),到期(時間戳),設備(枚舉)

  2. 當通過iOS應用或Android應用用戶登錄,我會返回一個本身在未來的api調用中使用成功json中的ssion令牌。與網站進行api通話一樣。

  3. 出於安全考慮,如果用戶重新登錄,但只爲該設備的session_id,我應該重新生成並覆蓋會話令牌。

  4. 我也有一個expire列,告訴我會話過期,所以如果我願意,我可以創建一個會在兩週內過期並由CRON工作定期清理的會話。

這似乎是一個合理的做法給我,但如果用戶使用的iPhone和iPad的,或使用同一帳戶的多個Android設備有問題。任何時候用戶登錄一個會導致另一個登出。

我注意到,即使我從另一個iphone登錄,instagram也沒有使會話失效。

但是,我不認爲我可以複製該行爲,除非我從不重寫會話令牌,當用戶重新登錄或保持添加會話行到我的會話表時,每當用戶從iPhone登錄?

在不同設備上處理會話的標準方式是什麼?

+0

您可以隨時在每個會話中存儲一些額外的信息,例如瀏覽器和IP地址 - 只有在登錄新位置時清除具有匹配詳細信息的會話。 – BenOfTheNorth

回答

3

我會極力阻止你使用mysql來存儲會話。我會建議使用redis或memcache。 Redis會將數據存儲到磁盤,以防服務器崩潰。 Redis還允許您設置一個TTL來終止會話,這將解決#4。

如果您正在使用基於休息的呼叫,我會建議僅將會話作爲cookie添加到標頭並將其傳遞。基本上模擬瀏覽器訪問該頁面的方式。我認爲這會讓測試更容易。

0

那麼它看起來你所尋找的並不是大多數傳統上稱之爲「會話」的東西,這通常侷限於單個瀏覽器或客戶端實例。

看來你正在談論更多關於將應用程序狀態附加到用戶登錄。在這種情況下,我不明白爲什麼你需要一個單獨的會話表/令牌系統。您只需使用典型的客戶端方法來持久登錄,然後當登錄的客戶端與您的API聯繫時,無論您正在與哪個實際客戶端實例交談,都將返回應用程序「會話」狀態信息。

這並不是說你不希望使用某種令牌交換系統在用戶想要在一段時間內不活動之後清除他們的狀態的情況下爲用戶提供「新鮮」令牌,只是你可以每個登錄都有多個活動令牌。