2011-02-08 70 views
2

我正在构建一个允许用户创建,编辑和保存文档的web应用程序。用户帐户的数据库是分开控制的,我已经提供了一个SOAP API,它会告诉我一个给定的用户名/密码是否有效。如何通过第三方API安全地维护用户身份验证?

假定用户名/密码有效,则API将会给我回了以下信息:
•电子邮件地址
•用户名
•login_number(该帐户唯一ID,似乎是一个自动递增INT )

我会将我的应用程序的数据存储在我自己的数据库中,所以我可能会使用login_number将数据绑定到单个用户。

我的问题是,一旦用户成功登录后,我应该如何跟踪用户。将login_number存储为cookie可能会起作用,但似乎对我来说会非常不安全。我正在考虑一些存储某种随机哈希的cookie,并在查找表中存储该哈希和相关的login_number,但我不确定这是否足够。

标签为PHP/MySQL,因为这是我计划使用的后端,但不确定这对于这个问题确实很重要。

回答

0

这是非常普遍的情况下,任何开放的身份验证以Facebook oAuth 2.0为例。一旦用户同意你的条款,Facebook提供了他的用户名,电子邮件,以及在任何时候检查用户是否仍然登录的方式。

因此,有几个方法:

  1. 依靠提供商:如果基于用户ID的SOAP API提供了用户是否登录或没有的信息。您可以在执行任何需要验证的任务之前使用此调用。

  2. 在SOAP API上构建您自己的身份验证:我猜这就是您计划要做的。该方法是使用加密/哈希和难以重新创建的令牌。
    这个想法是这样的

    (a)只要用户登录创建一个唯一的标记,将该标记保存在用户的会话或某个永久存储中。可能在memcache中或用userId映射的地方。基本上,无论您何时可以检索该令牌,都知道哪个用户与其关联。

    (b)将此令牌存储为cookie。 (c)无论何时需要进行身份验证,都可以使用cookie中的令牌与保存在用户会话中的令牌进行匹配(或者拉出与令牌匹配的userId,并将当前userId与使用令牌拉取的userId匹配进行验证)。

    (d)在注销时删除cookie。

    现在,有很好的机会man-in-the middle附加这种方法。

    一种方法是昂贵的,即在每个请求结束时更改令牌。这并不能消除MITM的攻击,但攻击的几率相当渺茫。

希望这会有所帮助。


杜撰现时的想法很简单,很扎实。但我不确定它会适用于您的情况。它基本上是保护SOAP调用。 AWS使用类似的东西。

  1. 向客户提供secretKey
  2. 每当cient提出请求时,他必须将当前时间戳的散列值与secretKey(说它是token)以及它用于创建token的时间戳一起传递。
  3. 服务器将tokentoken与服务器创建的哈希值进行比较,服务器使用时间戳在头中传递并将secretKey存储在服务器端的其他位置,可以在数据库中将其作为password或secretKey。
  4. 如果令牌匹配,则允许用户访问,否则不允许。
  5. 还有一件事,如果时间戳与服务器当前时间戳太差,服务器也可能会取消访问。

这种方法实际上是免费的MITM攻击,但不知道这是否是最适合您的方法。

客户端服务器对话看起来这

client ----request timestamp       --------> server 
     <---current timestamp       -----------' 
--- {ts: timestamp, token: Hash256(timestamp, secretKey)} --> isEqual(token, hash256(ts, secretKey)) 
                   | | 
             Access Denied<- false/ true --> ACCESS 

@kramthegram感谢提醒杜撰

+0

样的改变现时防止中间人攻击的人,只要你不重复的随机数和更改它与每个请求。不过,我认为在注销时改变已经足够了。 – cmaynard 2011-02-08 20:14:10

0

您可以尝试使用基于nonce的会话来散列用户号码。将该cookie设置为在登录超时时间(例如30分钟)时过期。随机会话随机数将有助于防止恶意用户可以复制Cookie以获得访问权限的回放攻击,因为每个会话都具有时间敏感的散列。

相关问题