如何在使用Facebook Developer Toolkit授予offline_access后立即获得Facebook无限会话密钥

时间:2009-10-30 21:09:03

标签: c# .net facebook

我正在使用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刷新会话并获得新的无限会话密钥(和秘密)。

1 个答案:

答案 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上