2011-10-19 54 views
2

我正在嘗試爲遊戲創建一個RESTful API。支持匿名和註冊用戶

該遊戲將支持匿名用戶(只想現在玩的用戶)和願意註冊的用戶。

我想要實現的是,雖然未註冊的用戶仍在使用同一臺計算機,但與其關聯的數據將會保留。我遇到了麻煩,並且對於那些選擇註冊的用戶也提供了適當的用戶支持。

GET users/create Users.create 將創建一個新的「匿名」的用戶,其將返回用戶(以及獨特的令牌可以通過識別)

POST users/register Users.register 將帶有可選的令牌(如果用戶以前匿名) ,一封電子郵件和一個密碼。它將創建一個新的註冊用戶(同樣的道理,如果提供了一個新註冊用戶 - 或新的註冊用戶)。

POST auth/login Auth.login 將採取的電子郵件地址和密碼,返回用戶如果成功

POST auth/authenticate將採取獨特的標記,根據數據庫中是否存在令牌返回200/500。

基本上,每次調用服務器都需要這些獨特的令牌之一。我將能夠使用它來跟蹤與其關聯的用戶。

當我試圖爲註冊用戶實現某種「記住我」功能時,我真正感到困惑。如果註冊用戶有這些獨特的令牌之一可用,我可以使用它作爲記住我的令牌嗎?看起來這是一個糟糕的選擇,在安全方面,這可能會導致很多auth/authenticate失敗。由於每次用戶在新計算機上登錄時都必須創建新的令牌。

我完全錯過了什麼嗎?整個過程似乎都有安全災難。這種行爲有沒有好的配方?

乾杯,

伊恩

+0

我會讓別人回答主要問題,但我強烈建議您不要使用GET進行「創建」調用。 GET不應該有副作用或導致服務器端數據的任何更改。相反,使用POST創建用戶,併爲只讀請求保留GET。 –

回答

2

令牌(如存儲在瀏覽器cookie中的唯一標識符)是唯一的方法(我所知道的),你可以用它來唯一地識別用戶考慮到Play是無狀態的。

關鍵是不要將令牌作爲請求的參數發送,而是直接在每個請求上從cookie(播放會話)中檢索它。

關於安全性,應該是比較安全的。 Play中的cookies受密碼保護,這意味着它們不能被更改或僞造。如果你在頂部添加SSL,他們不應該被嗅探,所以沒有人應該能夠「僞造」另一個用戶。爲了進一步增強這個使用UUID(難以生成有效的令牌),它應該工作。

事實上,當你想到它時,Play中有一個「會話」的唯一方法就是將用戶標識(或某種標識符)存儲在應用程序的cookie中,這基本上就是你想要做的。

哦,如布萊恩凱利注意,不要使用GET創建一個用戶

1

你檢查過play security guide。尤其是跨站請求僞造的部分。
玩法使用checkAuthenticity()方法驗證每個帖子請求的真實性。
請確保您使用的表格中包含真實性標記的#{form}標記。 或者在普通的html表單標籤中使用#{authenticityToken /}標籤。