我已经设置了一个画布页面,点击表单提交按钮时,它就是FB.login。在以下请求期间,它尝试通过$facebook->api('/me')(来自Github的最后一个API版本)访问用户数据。它适用于Firefox和Chrome,但不适用于Safari和IE,其中API失败并显示"需要身份验证令牌"。有没有人已经遇到过这个问题或知道可能导致它的原因?
BR 菲利普
编辑:
我在表单提交按钮的点击事件中调用FB.login:
$('.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
}
}
signed_request在隐藏的表单元素中传递。
我遇到了同样的问题,我在下面提供了一个解决方案。
我相信发生这种情况的原因是因为在 Javascript 登录尝试中,您的服务器永远不会收到任何访问令牌。Javascript 只在你的浏览器和 Facebook.com 之间传递数据,所以你的服务器不知道身份验证状态是什么。您的服务器只会在刷新页面时收到新的访问令牌;这是Facebook交出访问令牌的地方。
这是我的解决方案。通过FB.login成功登录后,您将收到响应对象,其中是一个access_token。您需要做的就是以某种方式将此访问令牌传递给脚本。下面是一个示例:
// 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
}
}
希望这有帮助
我在使用JS FB登录时遇到了很多麻烦。我建议使用更简单的重定向登录使用oauth和php fb api的getLoginUrl
函数。
所以基本上你从PHP做,你检查你是否有你的会话,如果没有,你使用getLoginUrl并重定向到该页面,你的使用将被重定向到你的应用程序/网站与有效的会话(如果他接受)。
这有帮助吗?我真的浪费了几个小时试图让FB JS登录在任何浏览器上工作,但我不能,从那时起,我已经切换到我所有应用程序中的简单重定向登录方法,并取得了圆满成功。
Conor的回答,因为我必须将我的访问令牌从客户端传递到服务器端,因为它在Safari中不起作用(我认为是cookie问题)。但这是一个老问题,所以有些事情必须改变。var 现在不同了,正如 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>
然后在 PHP 中,与 Conor 的答案几乎相同,但从 $_POST var 中获取代币。