处理Facebook授权 - 从auth返回的“state”参数是什么?

时间:2011-11-21 22:41:27

标签: authentication facebook

Facebook API今天不是我的朋友......

我正在尝试解决FB授权的基础知识,特别是处理用户允许和不允许应用程序访问所请求权限的两种情况。 (我有一个使用fb:login-button的工作登录方案,除了“不允许”部分,使用fb:login-button似乎不可能。)

问题:当用户允许访问时,我的服务器获得两次点击:

  • 从Facebook到我的应用程序的post_authorization回调的POST,其中包含一个signed_request,我想,最终将用于获取用户的访问令牌,

  • 从我自己的网站获取“GET /?state = aLongStringOfEncodedCharacters”形式的GET。

我找不到这个GET调用或“状态”参数的任何解释 - 这似乎是FB文档最近进化的地方之一。 http://developers.facebook.com/docs/authentication/指的是返回“代码”参数的GET;我在Facebook上的应用程序定义引用了post_authorization回调,但在身份验证页面中没有提到它。 Arggh。任何人都可以解释发生了什么,以及如何解决这个身份验证过程?谢谢!

2 个答案:

答案 0 :(得分:3)

您同时收到code参数和statecode参数允许您通过获取此URL

来获取access_token
https://graph.facebook.com/oauth/access_token?
       client_id=YOURAPPID&
       redirect_uri=YOUR_CALLBACK_URL&
       client_secret=YOUR_SECRET&
       code=CODE_PARAM_YOU_RECEIVED;

state参数是CSFR保护。

如果您查看此代码(取自您发布的页面),

   if(empty($code)) {
     $_SESSION['state'] = md5(uniqid(rand(), TRUE)); //CSRF protection
     $dialog_url = "https://www.facebook.com/dialog/oauth?client_id=" 
       . $app_id . "&redirect_uri=" . urlencode($my_url) . "&state="
       . $_SESSION['state'];

     echo("<script> top.location.href='" . $dialog_url . "'</script>");
   }

   if($_REQUEST['state'] == $_SESSION['state']) {
         //getting access_token here      
   }
   else {
     echo("The state does not match. You may be a victim of CSRF.");
   }

你会看到你(或至少这个例子)向Facebook发送了一些md5()哈希随机字符串。

您应该检查它是否与您收到的相同,否则,您/您的客户可能是CSFR的受害者

答案 1 :(得分:0)

未设置

FBRLH_state会话,可以在$_GET['state'];

中找到此哈希
<?php 
session_start();
$_SESSION['FBRLH_state'] = $_GET['state'];