使用PHP API登录FB.login
我已经建立了一个画布页面,点击表单提交按钮,doe就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(Github的最后一个api版本)访问用户数据。它可以在Firefox和Chrome中使用,但不能在Safari和IE中使用,在IE中,API会因“需要身份验证令牌”而失败。有没有人已经有过这个问题,或者知道是什么导致了这个问题 菲利普 编辑: 我在表单提交按钮的单击事件中调用FB.login:使用PHP API登录FB.login,php,facebook,Php,Facebook,我已经建立了一个画布页面,点击表单提交按钮,doe就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(Github的最后一个api版本)访问用户数据。它可以在Firefox和Chrome中使用,但不能在Safari和IE中使用,在IE中,API会因“需要身份验证令牌”而失败。有没有人已经有过这个问题,或者知道是什么导致了这个问题 菲利普 编辑: 我在表单提交按钮的单击事件中调用FB.login: $('.form-submit', this).click(
$('.form-submit', this).click(function() {
FB.getLoginStatus(function(response) {
if (response.session) {
form.submit();
} else {
FB.login(function(response) {
if(response.session && (permissions == '' || response.perms)) {
form.submit();
}
else {
}
},{perms:permissions});
}
});
return false;
});
在中的服务器端,只需构造php api对象并尝试获取用户数据:
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => TRUE,
));
if ($facebook) {
try {
$me = $api->api('/me');
}
catch (Exception $exc) {
// Failure in Safari and IE due to invalid auth token
}
}
签名的请求在一个隐藏的表单元素中传递。我在JS FB登录方面遇到了很多问题。我建议使用oauth和php fb api中的
getLoginUrl
函数使用更简单的重定向登录
所以基本上你是从PHP开始的,你检查你是否有你的会话,如果没有,你使用getLoginUrl并重定向到该页面,你的使用将被重定向到你的应用程序/站点,并且有一个有效的会话(如果他接受)
这有用吗?我真的花了好几个小时试图让FB JS登录在任何浏览器上工作,但我做不到,从那时起,我在我所有的应用程序中都切换到了简单的重定向登录方法,并取得了圆满成功。我也遇到了同样的问题,我在下面提供了一个解决方案 我相信发生这种情况的原因是,在Javascript登录尝试中,您的服务器从未收到任何访问令牌。Javascript只在浏览器和Facebook.com之间传递数据,因此服务器不知道身份验证状态是什么。当页面刷新时,您的服务器将只接收新的访问令牌;这就是facebook交出访问令牌的地方 这是我的解决办法。 通过FB.login成功登录后,您将收到响应对象,其中包含一个访问令牌。您所需要做的就是以某种方式将此访问令牌传递给脚本。以下是一个例子:
// Hold the access token
var js_access_token = "";
// Connect to facebook
FB.login(function(response) {
if (response.session) {
if (response.perms) {
// user is logged in and granted some permissions.
// Save the access token
js_access_token = response.session.access_token;
// Do stuff on login
}
}
});
然后将访问令牌与任何请求一起包含。我选择了一个ajax示例
// Communication back to server.
$.ajax({
url: 'myurl.php',
data: {
js_access_token: js_access_token // Including the js_access_token
},
success: function(data) {
console.log(data);
}
});
在PHP中,您需要有如下内容:
$facebook = new Facebook(array(
'appId' => $appid,
'secret' => $appsecret,
'cookie' => TRUE,
));
if ($facebook) {
// If we get the access token from javascript use it instead
if (isset($_REQUEST['js_access_token']) && $_REQUEST['js_access_token']) {
$facebook->setAccessToken($_REQUEST['js_access_token']);
}
try {
$me = $api->api('/me');
}
catch (Exception $exc) {
// Failure in Safari and IE due to invalid auth token
}
}
希望这有帮助我喜欢Conor的回答,因为我必须将我的访问令牌从客户端传递到服务器端,因为它在Safari中不起作用(我想是cookie问题)。但这是一个老问题,所以有些事情必须改变。vars现在不同了,正如oliland指出的,我们不应该将访问令牌作为GET参数发送 不管怎样,这是我最后的结果,以防它对任何人都有帮助
<a id="start-button" href="#">Start</a>
<form id="entry-form" action="nextpageurl" method="post">
<input type="hidden" name="access_token" />
</form>
<script>
$(document).ready(function() {
$('#start-button').click(function(e) {
e.preventDefault();
FB.login(function (response) {
if (response.authResponse) {
$('#entry-form input').val(response.authResponse.accessToken);
$('#entry-form').submit();
} else {
alert('Permissions required');
}
}, {});
});
});
</script>
$(文档).ready(函数(){
$(“#开始按钮”)。单击(函数(e){
e、 预防默认值();
FB.登录(功能(响应){
if(response.authResponse){
$('#输入表单输入').val(response.authResponse.accessToken);
$(“#输入表格”).submit();
}否则{
警报(“需要权限”);
}
}, {});
});
});
然后在PHP中,与Conor的答案基本相同,但是从$u POST var获取令牌。My Deary,您应该提供您的所有代码。问题可能出在你的头上。这不是一个常见的问题。您能提供一些代码吗?我猜这与你的会话/cookies或一些js弹出窗口没有出现有关。。您的safari控制台中有任何错误吗?刚刚在上面添加了我的代码。有一些“不安全的请求”-警告,但它们总是出现在facebook上。这就是确切的例外->消息:必须使用活动访问令牌来查询有关当前用户的信息。非常感谢!它不像弹出式登录那样“漂亮”,但至少它在任何地方都能工作。完全同意这一点。我后悔使用了Facebook Javascript SDK。我花了很多时间研究被一些浏览器屏蔽的Facebook窗口弹出窗口。最后,我决定使用重定向一个解决方案。这是错误的!我们不应该在客户端和服务器之间发送未加密的访问令牌。在这里了解新的身份验证方法:@oliland谢谢+链接为1