2011-10-19 57 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 /}标签。