Cookie或RESTful密钥的身份验证?

时间:2012-01-07 03:45:29

标签: android ruby-on-rails web-services restful-authentication

我花了很多时间研究如何最好地实现从Android应用程序到Rails Web服务器的用户身份验证。我知道有些引擎可以在Rails端为我处理身份验证,但我需要的并不是很复杂,所以我认为我最好编写自己的身份验证代码。

我对RESTful Web服务非常感兴趣:在无状态Web服务器中,代码更具可读性,可维护性和可更改性,仅举几个优点。作为一名独立从事这项实施工作的大学生,这些事情对我来说并不是非常重要,但我相信从编码的角度来看,REST引导的实施是理想的。

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

原因如下:

  • 在每个请求上通过长字符串查找用户以便对该用户进行操作将比在CookieStore会话中具有关联表行的整数用户ID慢。

    < / LI>
  • 我可能不会在数据库中以纯文本格式存储RESTful身份验证密钥。我可能会使用BCrypt并为密钥存储salt和hash。这当然导致了这个子弹解决的计算开销:使用BCrypt对每个请求上的接收密钥进行散列,以针对存储在数据库中的散列进行测试。

当我最终需要托管生产服务器时,我实在无法承担为野兽付费的费用,只是为了让我可以使用REST徽章。

假设典型用户每天发出10-30个请求,并且用户数量取决于应用程序的受欢迎程度(我无法预测,但为了这个问题,假设是平均值),是吗?在我的特定情况下可以RESTful地实现身份验证吗?换句话说,它可能产生的计算开销是否会大幅增加服务器的硬件要求?

由于

1 个答案:

答案 0 :(得分:0)

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

用户登录系统后,我会向他发送一个包含混合普通和加密信息的唯一生成密钥。

基本上我做了类似的事情:

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

由于SHA1哈希的长度是已知的,因此您可以从字符串中提取id和token,而无需任何特殊的分隔符。 这样您就可以获得两个好处:

  1. 无需将密钥存储在DB上,因为它可以按需计算。
  2. 返回给用户的密钥很短(网络利益)且易于发送(因为在ASCII中,不需要Base64或类似)
  3. 希望这有帮助!