7

我正在使用 PHP SDK getLoginUrl() 函数,该函数可以完美地登录用户。一旦用户被重定向回我的页面,URL 可以有两种形式,请参见以下链接第 3 小节:http://developers .facebook.com/docs/authentication/server-side/

返回 URL 的一部分是 ?state= 值。该值应该用于防止跨站点请求伪造:http: //developers.facebook.com/docs/reference/dialogs/oauth/

虽然,使用 getLoginUrl() 方法我永远无法设置状态值,因为它不是参数之一:http: //developers.facebook.com/docs/reference/php/facebook-getLoginUrl/

那么如何利用状态值将用户登录到 facebook 并防止 CSRF?

4

1 回答 1

3

那么如何利用状态值将用户登录到 facebook 并防止 CSRF?

这是由Facebook PHP SDK自动处理的。如果您要编写自己的state对 Facebook 的 API 调用,则需要根据 Facebook 的OAuth文档手动提交(如果需要)。

当您使用 来创建登录 url 时BaseFacebook::getLoginUrl(),该函数所做的第一件事是建立 CSRF 令牌状态1,它使用 PHP 的核心 创建一个哈希mt_rand()uniqid()md5()函数并将值存储为会话变量。

当用户被重定向回您的页面时,FBSDK 会检查提交的内容是否与会话中的值state匹配。state如果值确实匹配,则从对象和会话state中清除,因此所有后续请求都将获得一个新变量。2FacebookgetLoginUrl()state

从理论上讲,您可以将自己的state值与 FBSDK 一起使用,方法是在构造 -object 之前将其写入会话变量,作为的构造函数,并检查会话中是否已经存在。fb_<your_app_id>_stateFacebookBaseFacebookestablishCSRFTokenState()state

但这可能会引入不必要的复杂性。

 


  1. BaseFacebook::establishCSRFTokenState()
  2. BaseFacebook::getCode()
于 2012-11-20T08:30:11.460 回答