我正在构建一个在Google小工具中运行的Facebook Connect应用程序。作为小工具意味着应用程序在iframe内运行。在应用程序内部,有一个表单允许注册用户发表评论。提交是使用AJAX进行的,但我使用普通表单获得相同的结果。问题是我需要获取用户的Facebook ID。在Firefox中,它工作正常,但在Internet Explorer 7上,我收到以下错误:
'A session key is required for calling this method'
我认为这是由于IE处理第三方cookie的方式,因为如果我转到Internet选项/隐私/高级,并检查覆盖自动cookie处理并接受所有cookie,它可以正常工作。我无法通过javascript传递Facebook ID,因为任何人都可以篡改它。
编辑:如果我直接打开iframe的内容,该应用程序工作正常。问题实际上是由于IFRAME和IE安全模型。
我做错了什么?我该如何解决这个问题?
答案 0 :(得分:7)
您是否尝试过添加P3P政策?
如果设置cookie的响应具有紧凑策略,IE将使用它来确定是否允许第三方cookie。
答案 1 :(得分:3)
我通过修改如何在FB连接登录后检查用户是否登录PHP页面解决了同样的问题。
因此,他们使用IE7登录FB Connect。 下一页和后续页面加载我需要验证它们确实登录到FaceBook我使用了以下代码(注意$ facebook-> require_login()和其他函数不起作用 - 它们仅在IE 7中返回null):
// Validate from Facebook that session is valid and user is logged in.
require_once 'facebook/facebook.php';
$facebook = new Facebook(YourAppsAPIKeyPublic, YourAppsAPIKeySecret);
$facebook->api_client->session_key = $this->userAPISessionKey;
$fb_user_id = $facebook->api_client->users_getLoggedInUser();
$ fb_user_id现在应该具有有效的FaceBook用户ID。
虽然这对我不起作用,但似乎对其他人有效。在HTAccess中:
Header append P3P "CP=\"HONK\""
或在PHP文件中:
header('P3P: CP="CAO PSA OUR"');
要么
header('P3P: CP="HONK"');
参考:http://forum.developers.facebook.com/viewtopic.php?id=28636
ASP.NET:
protected void Application_BeginRequest(Object sender, EventArgs e)
{
HttpContext.Current.Response.AddHeader("p3p", "CP=\"CAO PSA OUR\"");
}
答案 2 :(得分:1)
我找到了一个可行的解决方法,虽然它有点难看:当用户点击“登录”按钮时,它会打开一个来自我自己网站的弹出窗口,其中包含Facebook Connect登录按钮。用户登录后,关闭弹出窗口并重新加载iframe。
这真的很难看,因为它打开了两个弹出窗口,但至少它有效。我将检测是否使用javascript启用了cookie,如果启用了它,我将跳过第一个弹出窗口。
我仍然愿意接受更好的解决方案......
编辑:Facebook现在在弹出窗口中使用“假”弹出窗口,而不是打开另一个窗口。现在我只有一个弹出窗口,对我来说没问题。
答案 3 :(得分:0)
你可能也希望看到这个帖子,这是在Facebook开发者平台下创建的