- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 Facebook Developer Toolkit 的 3.0 版本构建一个 MVC iframe Facebook 应用程序,并且在授予无限 session key 后立即获取它时遇到了一些问题。
当用户第一次点击我的应用程序设置 View 来设置他们的偏好时,他们只有来自 Facebook 的通常的到期 session key 。没问题。
根据他们选择的首选项,我使用 Facebook javascript 客户端库 FB.Connect.showPermissionDialog 方法提示他们提供 offline_access 扩展权限。再次没问题,他们授予权限。
此时会发出一个新的不会过期(无限)的 session key 。我需要将其保存到我的数据库中以备将来使用。问题是,我不知道如何在需要时立即获取它。包含 session 信息的 Facebook cookie 不会更新,直到再刷新几次页面。
Facebook 错误跟踪器中有一个与此相关的错误 ID 6421 的未解决错误,但我正在寻找使用 Facebook Developer Toolkit 3.0 版本的服务器端解决方案。我想要一种方法来告诉 FDT api 转到 Facebook 并获取新 session 。
我知道新 session 是在Facebook端建立的。在 http://www.facebook.com/extern/login_status.php 上有一个 GET 信号在用户授予 offline_access 权限后立即显示在 Firebug Net 面板中,并使用包含新的非过期 session key 的一些 javascript 进行响应。如果我继续使用旧的过期 session key ,我会收到来自 Facebook 的无效 session 错误。
在我的 Controller 中,我有如下代码:
[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 ,因此我可以在其 Controller 中命中调试器断点并检查来自 Facebook 的传入请求)。它在授予扩展权限期间受到攻击,但它再次引用了旧的到期 session 信息。
总而言之,我正在寻找一种使用 Facebook 开发人员工具包强制从 Facebook 刷新 session 并获取新的无限 session key (和 secret )的方法。
最佳答案
不想回答我自己的问题,但总比没有解决方案好。希望这对其他人有帮助。
问题的根本原因是 cookie 没有及时更新新 session ,或者直到页面重新加载。 Facebook 开发人员说这是浏览器问题。包括 .NET Facebook Developer Toolkit 在内的所有 Facebook 客户端库都依赖 cookie 获取 session 信息。因此,如此依赖 cookie 是浏览器错误、Facebook 错误或 Facebook 设计缺陷。请参阅 Facebook 错误 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 调用并将 session key 和密码放入表单字段,以便将它们发布到 Controller 。
新的 Javascript 客户端库在 github 上 http://github.com/facebook/connect-js
关于c# - 如何在使用 Facebook Developer Toolkit 授予 offline_access 后立即获取 Facebook 无限 session key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1652336/
我希望在我的应用程序下载信息时显示 Toast 消息,但即使我将它放在我的代码之前,它也不会在下载完成后出现。将我的代码放在一个单独的线程中会引起很多麻烦,但是将 toast 放在一个单独的线程中也不
面临即时应用更新模式的问题。成功完成应用程序更新后,一切都关闭并且不重新启动应用程序。这就是问题所在。 但是android文档说: A full screen user experience that
我有一张 table 我有一个 anchor 标记,
我正在开发一个具有两个线程的 Java/Seam/Hibernate/Glassfish 应用程序: 线程 #1 发送各种消息并将摘要信息写入 MySQL 数据库。 线程 #2 定期轮询数据库(由 S
我找不到规范的相关部分来回答这个问题。在 Java 中的条件运算符语句中,是否同时评估真假参数? 以下是否会抛出 NullPointerException Integer test = null; t
大家下午好, 我想知道是否有办法使类的静态 block 运行,即使类本身没有被引用? 我知道它是延迟加载的,因此只需调用该类的任何函数即可开始启动该类, 但是,我希望该类在任何调用之前启动,换句话说,
我正在尝试使用 jQuery prop() 方法禁用元素(表单字段)。有两个字段,一个叫做fee,一个叫做currency。每当 fee 设置为 0 时,第二个字段 currency 将被禁用。这样做
我想为 UIButton 的缩放设置动画,并在完成后再次为缩放设置动画,但让它在没有动画的情况下旋转。我尝试将旋转变换放在没有持续时间的动画调用中,但不知何故它仍然成为缩放动画的一部分或替换缩放动画。
在 js 代码中,我创建了 3 个按钮 --- 按钮 1...按钮 2...按钮 3和 3 个输入字段 --- 输入字段 1...输入字段 2...输入字段 3 从脚本开始所有按钮都被禁用 只有当输入
我正在使用一个 threading.Thread() 来完成它的工作并返回 。它的返回记录在打印语句中,所以我确信有时候是这样的。然而,依靠 threading.active_count() 和 th
我正在使用 IntelliJ 9,我很好奇是否有任何与 Visual Studio“即时”调试窗口等效的 IntelliJ。在编辑器中选择所需的表达式,然后 ALT-F8 来评估表达式,但我希望能够在
我有一个两个标签页,一个标签是记录列表,点击记录会切换到编辑标签,编辑标签中有保存和取消按钮。 现在,我单击记录 #1,进行一些编辑,然后单击取消按钮。当然我不想验证表单,因为它被取消了,所以我设置了
我有一个 A viewController,首先,我呈现 B viewController,经过一些工作后,我需要关闭 B viewController 并呈现 C viewController,所以
我希望能够在文本框中输入内容,当用户在文本框中输入内容时,我希望程序无需单击按钮即可自动读取文本框。 例子:用户类型:“abcd”当用户输入时,程序会显示每个字母对应的数字。 程序输出:“1234”
如果任何表单输入发生更改,如何立即更改提交按钮文本? //This applies to whole form $('#test').change(function() { $("#send").
主要功能: var interval; function refreshId(sessio
假设我有一个包含这些列的 data.table nodeID hour1aaa hour1bbb hour1ccc hour2aaa hour2bbb hour2ccc .
根据vimeo js-api doc ,事件 finish - 当视频播放结束时触发。 出于某种原因,我无法让它工作,finish 事件总是立即调用,我做错了什么吗? 我试图让嵌入的视频在播放完毕后消
我想滑动当前ul元素下的所有li元素和slideDown li元素 $(document).ready(function(){ $("li").slideUp(); }); $(".nav")
我有一个表-compositeView,其中有行-itemView。每行都有许多事件 - 单击、更改等等。 在某些状态下,我想“锁定”表。禁用按钮并取消事件。 是否有一种好方法可以立即取消 itemv
我是一名优秀的程序员,十分优秀!