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。任何人都可以解释发生了什么,以及如何解决这个身份验证过程?谢谢!
答案 0 :(得分:3)
您同时收到code
参数和state
。 code
参数允许您通过获取此URL
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'];