我正在使用3.0版本的Facebook Developer Toolkit来构建一个MVC iframe Facebook应用程序,并且在获得无限会话密钥后立即获取它会有一些麻烦。
当用户首次点击我的应用程序设置时,View会设置他们的首选项,他们只能拥有来自Facebook的常用会话密钥。没问题。
根据他们选择的偏好,我使用Facebook javascript客户端库FB.Connect.showPermissionDialog方法提示他们获取offline_access扩展权限。再次没问题,他们授予许可。
此时会发出新的非过期(无限)会话密钥。我需要将其保存到我的数据库中以备将来使用。问题是,我无法弄清楚如何在需要时立即获取它。包含会话信息的Facebook cookie在更新页面刷新之前不会更新。
Facebook错误跟踪器中有一个与此相关的错误ID 6421的漏洞,但我正在寻找使用Facebook Developer Toolkit 3.0版本的服务器端解决方案。我想告诉FDT api去Facebook并开始新的会议。
我知道新会议是在Facebook方面建立的。在http://www.facebook.com/extern/login_status.php上有一个告警GET,在用户授予offline_access权限后立即出现在Firebug Net面板中,并且响应时包含一些包含新的非过期会话密钥的javascript。如果我继续使用旧的到期会话密钥,我会从Facebook收到无效的会话错误。
在我的控制器中,我的代码如下:
[AcceptVerbs(HttpVerbs.Post)]
[FacebookAuthorization(IsFbml = false)]
public ActionResult Index(FormCollection collection)
{
var api = this.GetApi();
var userid = api.Session.UserId;
var key = api.Session.SessionKey;
}
这是获得旧的SessionKey,而不是新的非过期的。
如果我在GET上使用ExtendedPermissions =“offline_access”装饰我的ActionResult,我就没有这个问题,迫使用户在看到页面之前授予offline_access,但我不喜欢这种用户体验。我更喜欢仅在需要时提示使用javascript,并且当我使用ExtendedPermissions =“offline_access”时,javascript权限灯箱比完整页面宽度权限提示更好。
我也尝试拦截对xd_receiver的调用(我已经创建了一个View,因此我可以在其控制器中点击调试器断点并检查来自Facebook的传入请求)。它在授予扩展权限期间被点击,但它再次引用旧的过期会话信息。
所以回顾一下,我正在寻找一种方法,使用Facebook Developer Toolkit强制从Facebook刷新会话并获得新的无限会话密钥(和秘密)。
答案 0 :(得分:5)
讨厌回答我自己的问题,但肯定没有解决方案。希望这有助于其他人。
问题的根本原因是,cookie未及时更新新会话,或者直到页面重新加载。 Facebook开发者说这是一个浏览器问题。包括.NET Facebook Developer Toolkit在内的所有Facebook客户端库都依赖于cookie来获取会话信息。所以这是一个浏览器错误,或Facebook的bug,或Facebook设计缺陷,以至于如此依赖cookie。见Facebook bug 6421。
幸运的是,Facebook在alpha中有一个新的Javascript客户端库,它有一个无cookie的选项。
<div id="fb-root"></div>
<script type="text/javascript"
src="http://static.ak.fbcdn.net/connect/en_US/core.js">
</script>
<script type="text/javascript" >
// initialize the library with the API key, set cookie: false
FB.init({
apiKey: your_facebook_apikey,
cookie: false,
});
FB.getLoginStatus(function(response) {
if (response.session) {
alert(response.session.session_key);
} else {
// re-prompt for permissions or do some other exception handling
}
}, true); // critical optional parameter to force a refresh
</script>
(为了简洁省略了facebook权限提示和其他内容)
在我的MVC应用程序中,我正在提示Javascript中的权限。在提交表单之前,我执行getLoginStatus调用并将sessionkey和secret放入表单字段中,以便将它们发布到控制器。
新的Javascript客户端库位于http://github.com/facebook/connect-js
的github上