如何通过第三方API安全地维护用户身份验证?

时间:2011-02-08 19:23:13

标签: php mysql api web-applications authentication

我正在构建一个允许用户创建,编辑和保存文档的webapp。用户帐户数据库是单独控制的,我已经提供了一个SOAP API,可以告诉我给定的用户名/密码是否有效。

假设用户名/密码有效,API将返回以下信息:
•电子邮件地址
•用户名
•login_number(帐户的唯一ID,似乎是自动增量int)

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

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

标记为PHP / MySQL,因为这是我计划合作的后端,但不确定这对于这个问题真的很重要。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用基于nonce的会话对用户号进行哈希处理。将该cookie设置为在登录超时长度(例如30分钟)到期。每个会话随机随机数将有助于防止恶意用户复制您的cookie以获取访问权限的回放攻击,因为每个会话都有一个时间敏感的哈希值。

答案 1 :(得分:0)

这是任何开放式身份验证的常见情况,例如Facebook oAuth 2.0。一旦用户同意您的条款,Facebook就会提供他的用户ID,电子邮件以及随时检查用户是否仍然登录的方式。

所以,有几种方法:

  1. 依赖于提供程序:如果基于User-Id,SOAP API会提供用户是否登录的信息。您可以在执行任何需要身份验证的任务之前使用此呼叫。

  2. 在SOAP API之上构建自己的身份验证:我猜这是你打算做的。方法是使用加密/散列和难以重新创建的令牌。
    这样的想法如下(a)用户登录后立即创建唯一令牌,将此令牌保存在用户会话或某个永久存储中。可能在memcache或用userId映射的某个地方。基本上,无论您何时可以检索此令牌,您都知道哪个用户与之关联。

    (b)将此令牌存储为cookie。

    (c)无论何时您想要进行身份验证,使用来自cookie的令牌来匹配用户会话中保存的令牌(或拔出与令牌匹配的userId,并将当前userId与使用令牌进行验证的userId匹配)。

    (d )在注销时删除cookie。

    现在,man-in-the middle很有可能使用这种方法。

    一种方法,也是昂贵的,是在每个请求结束时更改令牌。这并没有消除MITM攻击,但攻击的可能性相当小。
  3. 希望这有帮助。


    Nonce nonce的想法很简单而且非常可靠。但我不确定它是否适用于您的情况。它基本上是为了保护SOAP调用。 AWS使用类似的东西。

    1. 向客户提供secretKey
    2. 每当cient发出请求时,他都必须使用secretKey(比如说​​token)传递当前时间戳的哈希值以及用于创建token的时间戳。
    3. 服务器通过将token与服务器使用标头中传递的时间戳创建的散列进行比较来验证token,并将存储在服务器端的其他密钥存储在其中,可以在数据库中作为密码或secretKey。
    4. 如果令牌匹配,则允许用户访问其他内容。
    5. 还有一件事,如果时间戳与服务器的当前时间戳相距太远,服务器也可能会取消访问权限。
    6. 这种方法实际上不受MITM攻击,但不确定这是否适合您。

      客户端服务器对话框如下所示

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

      @kramthegram感谢提醒Nonce