我回来一段时间,从FB平台离开后建立一个FB应用程序,我看到老offline_access权限已被删除,并用长(ISH)取代-expiry令牌[1]。
所以,现在看来这样的需要将数据推送到基于Facebook上的任何外部应用程序,比方说,一个时间表或在外部应用中的一些活动将需要应付,长期访问令牌已经过期。 这更加令人沮丧,因为现在退出FB的用户也将杀死任何长期到期令牌[2],而在此之前,offline_access住在即使用户被注销。
我仍然在琢磨,一个解决方案阶段,但两种观点映入脑海:
1)每当我的应用中的联系人谁拥有FB整合用户,他们被要求点击一个链接,将触发重新授权使用FB获得新的长期访问令牌。 我的用户长期访问令牌的生命周期内一般多次进行接触,所以这应该有效地保持更新,只要他们需要长期访问令牌(即使它确实增加了一些恼人的摩擦我的应用程序)
2)因为我不能保证1)总能工作(由于用户不点击我的应用程序的电子邮件通知的重新授权链接或他们退出Facebook的,例如)我还必须处理失败FB互动通过将其放置在保持队列和电子邮件用户明确要求他们再次令牌发放长期访问。 不冷静,但我看到没有其他选择。 如果X试图要求他们重新发放的许可后,他们不响应请求,我只好斌任务,并给他们发电子邮件解释说,这是由于FB限制,而不是我的应用程序。 再次,不冷静。
有没有人不得不想出任何更好的解决方案,以保持与用户的身份验证/明确权限帐户进行交互? 我当然很希望听到你做了什么。
(这是所有未决我重新读FB TOS,当然 - 这是完全可能的,这是违反规定的,这将是更令人沮丧)
编辑/ UPDATE:我需要推数据是图像到相册,将在从各种渠道我的服务器到达,随后将被推到一个合适的用户的相册(与他们的前授予的权限,当然)。 我不能保证具有在时间点的任何基于网络的最终用户交互的图像打我的服务器,以获得最终用户授予我一个新的短寿命令牌。 基本上, offline_access
真的会IMO一直非常理想的。
更新2:注意:它是真正关键的是,用户不一定会用我的应用程序或Facebook令牌时需要被授予或延长我的使用情况。
[1] https://developers.facebook.com/roadmap/offline-access-removal/ [2] http://developers.facebook.com/blog/post/2011/05/13/how-to--handle -expired存取令牌/
你有正确的两种选择,但我会指出了第三种选择和一个鲜为人知的,事实可能会或可能不相关为您的具体情况“需要将数据推至Facebook”
首先,提供另一种选择假设你要么有移动网络或帆布实施了您的应用程序是应用用户请求或通知。 用户将得到旁边的程序名称有点通知计数器指标在书签列表。 如果他们的请求或书签/计数器通知让他们打你的应用程序响应,可以触发你的服务器端令牌更新/扩展的过程。 这个过程对用户透明 - 假设他们仍然有你的应用程序安装,他们什么也看不到。
第二个问题,有很多人使用offline_access今天仅仅是张贴到用户的信息流。 如果这是你需要的,你不需要做一堆FQL查询或在图形API打等动作,那么你实际上并没有,如果你得到了publish_stream许可需要offline_access或当前用户令牌。 随着publish_stream而用户使用你的应用程序访问令牌处于脱机状态,你可以发布。
对于具体的“需要将数据推”的情况下, Facebook宣布新的Page对象的连接 ,让您创建后的与特定的发布时间。 有了这些在理论上,你可以通过创建这些当认证用户摆脱了这个问题,让Facebook的在你身边张贴他们,而不是计划作业。
这里谈到第三选项的建议。
对于每一个身份验证的用户,您已ACCESS_TOKEN和expires_in(假设你已经将它们存储在你的数据库的话)
1)写一个计划任务,现有的与他们expires_in价值代币的支票,当你发现接近到期时间与任何标记,
2)可以通过HTTP GET呼叫(下面示例代码)更新从服务器侧此令牌
requestUrl = "https://graph.facebook.com" + "/oauth/access_token"
+ "?" + "client_id="+facebook_appId
+ "&"+"client_secret="+facebook_appSecret
+ "&" + "grant_type=fb_exchange_token"
+ "&" + "fb_exchange_token="+currentToken;
req = WS.url( requestUrl );
Logger.info("renew token, req.url : %s", req.url);
req.timeout = 20;
resp = req.get();
// access_token=....&expires=5181096
Map<String, String> respMap = LocoUtils.decodeUrl( resp.getString() );
token = respMap.containsKey("access_token")? respMap.get("access_token") : "";
facebookToken.access_token = token;
facebookToken.expires_in = respMap.containsKey("expires")?LocoUtils.stringToLong(respMap.get("expires")) : 0L;