2012-01-07 167 views
2

我一直花费大量的时间研究如何最好地实现从Android应用程序到Rails Web服务器的用户认证。我知道有些引擎可以用于Rails方面的身份验证,但我需要的并不是很复杂,所以我认为我最好是编写自己的身份验证代码。Cookie或RESTful密钥的身份验证?

我对REST风格的Web服务非常感兴趣:在无状态的Web服务器中,代码更具可读性,可维护性和可修改性,以提供一些优势。作为一名在这个实现上独立工作的大学生,这些事情对我来说并不是非常重要,但我相信从编码的角度来看,REST指导实现将是理想的。

由于我的应用程序需要维护自己的上下文的用户帐户,因此用户在向Web服务器发出请求时必须进行身份验证。如果我要以完全RESTful的方式实现这个应用程序,我不会维护任何类型的会话,而是要求Android应用程序(客户端)传递当前用户的凭据(可能是返回到Android应用程序的单个唯一密钥在第一次登录时从Web服务器上)在每个请求上。这将是一种有效的方法,但我担心这可能会在服务器端产生的计算开销。

这里的原因:

  • 仰望由一长串用户在以行为对用户的每个请求将是比具有在相关的表行的整数用户ID慢CookieStore会话。

  • 我可能不会在数据库中以纯文本格式存储RESTful身份验证密钥。我可能会使用BCrypt并将密钥的salt和hash存储起来。这当然会导致这个项目符号所涉及的计算开销:使用BCrypt在每个请求上对接收到的密钥进行散列,以测试存储在数据库中的散列值。

当我最终需要托管的生产服务器,我真的承受不起支付兽,只是这样我就可以炫耀一个REST徽章。

假设典型用户进行10-30请求/天,和用户的数量取决于应用的普及(我不能预测,但对这个问题的缘故,假定是平均值),是在我的具体情况下可以实现认证RESTfully?换句话说,它可能造成的计算开销是否会显着增加服务器的硬件需求?

谢谢

回答

0

在我的项目中,我通常使用另一种方法。

一旦用户登录到系统,我给他发送一个具有混合简单和加密信息的唯一生成的密钥。

基本上我做这样的事情:

key = User.id.to_s + SHA1::Digest.hexdigest("#{SECRET_KEY}#{User.id}#{User.name}#{User.created_at.to_i}")

由于SHA1哈希的长度是已知的,可以提取ID,并从字符串标记,而不需要任何特殊的分隔符。 这种方式,您可以有两个好处:

  1. 没有要求保存在DB的关键,因为它可以按需计算。
  2. 返回给用户疗法的关键是短(网络的好处)和容易发(因为在ASCII,没有或不需要的Base64相似)

希望这有助于!