2

Facebook 的服务器端登录过程提到服务器应该在向 Facebook 发出请求期间提供一个“状态”变量。它就像一个 CSRF 令牌,Facebook 将在其中传递回登录回调页面以供我们的服务器验证。

但是我不确定为什么这是必要的。如果我们确实收到了伪造的登录请求,我们仍然需要使用?code=登录请求从 Facebook 获取 access_token。虚假请求将没有正确的code,因此无法正常工作。

此外,用户可以通过Facebook App的链接访问我们的服务器。Facebook 会自动?code=向链接添加一个参数,以便我们的服务器可以/必须自动登录用户。如果我们要使用code这个推荐提供的,我们无论如何都没有state参数可以验证,Facebook 似乎也不关心它。

state可选的吗?它真的提供额外的安全性吗?

4

1 回答 1

1

state参数是可选的。如果您的服务可以将一些值得保留的信息放在那里,它可能会提供额外的安全性。通常,该state参数用于保存有关当前浏览器窗口会话状态的数据(与处理可以使用 cookie 处理的整个会话的数据相反)。

使用此功能获得额外安全性的示例如下:

  1. 用户访问您的网站
  2. 您的网站设置了会话 cookie(例如Set-Cookie: id=xyzrandomstuff
  3. 用户尝试做一些需要进行 facebook 身份验证的事情
  4. 您的站点创建可与会话 ID 一起使用的 CSRF 令牌,xyzrandonstuff并将其放入statefacebook 登录的参数中
  5. 用户在 facebook 上完成登录(你看不到这个)
  6. code用户带着和state参数从 facebook 回来。
  7. code您在完成第 3 步开始的操作之前验证登录,您的服务器会验证 CSRF 令牌是否与当前会话匹配。
于 2013-06-06T08:00:08.157 回答