提问



Facebook对offline_access许可的弃用即将于2012年5月发布,文档并未向我们提供有关如何处理它的足够信息。[10]


我们有一个iOS应用程序和相应的服务,它可以为Facebook提供强大的功能并与Facebook集成,以便在应用程序中利用用户的朋友列表(因此,如果您的FB朋友也使用该应用程序,您可以更轻松地连接)。这是就像所有社交应用程序似乎都工作一样,所以这里没什么特别的


客户端



我们的应用程序使用Facebook iOS SDK允许用户登录,我们目前要求offline_access。令牌会保留在我们的iOS应用程序中,但也会发送到保存它的服务器。客户代表用户发布更新到用户的新闻源(我们也要求publish_stream许可)。[11]


服务器



我们的服务器会定期检查用户的FB朋友是否正在使用我们的应用程序。下次用户登录时,我们会以某种方式公开内容和关系以宣传该用户的朋友。服务器还代表用户定期连接到图形API并获取用户的当前好友列表。这样我们可以考虑用户关系的变化并将它们反映在我们的应用程序中。当用户当前没有使用该应用程序时,我们会这样做,以便他们在下次使用时获得最佳体验。为此,我们的iOS应用程序会将访问令牌发送到我们使用的服务器以及我们要求的原因[[offline_access


注意:如果用户明确退出我们的应用,我们会从客户端和服务器中删除访问令牌。


问题



现在已经不再使用我们可以使用的永久访问令牌,我试图找出仍然启用我们的场景的最佳实践,同时利用Facebook新的处理和扩展访问令牌的新方法。遗憾的是,文档并不完全有用。


问题



A. 当您通过最新的Facebook iOS SDK进行身份验证时,您获得的访问令牌的默认生命周期是多少?该文档说扩展令牌请求将为您提供持续60天的令牌请求。这个其他文件讨论了第一个访问令牌请求,并提到了不同的有效性,但它不清楚,是否谈论具体的有效时间:[12] [13] [14]


(重点是我的)



  从Facebook获取访问令牌时,它将有效
  在一段时间内立即可用于API的请求
  由Facebook定义。在该时间段过去之后,访问令牌
  被认为已经过期,用户需要
  再次进行身份验证,以便您的应用获得全新访问权限
  令牌。 给定访问令牌有效的持续时间取决于
  它是如何生成的。


  
  还有一些事件可能导致访问令牌成为
  在预期的到期时间之前无效。这些事件包括用户
  更改密码,一个应用程序刷新它的应用程序秘密。
  处理不同的访问令牌到期时间,并处理案例
  当访问令牌在其预期到期时间之前变为无效时
  对于建立强大的社交体验至关重要。



B。对于客户来说,现在访问令牌不一定很长,对我们来说是正确的方法:


让我们使用FB登录,然后在访问令牌过期时进行检测。如果是,那么调用FB iOS SDK重新认证/重新授权? (这应该只是触发用户反弹到FB iOS应用程序,并且在大多数情况下会立即通过新的访问令牌返回到我们的应用程序)。


C。根据我发现的这篇博客文章,您只能扩展一次访问令牌:[15]



  我可以将60天访问令牌换成新的60天访问令牌吗?

  
  不,对不起,你不能。您只能交换有效(意味着当前)
  扩展的用户访问令牌。你不能扩展已经
  扩展访问令牌。



在客户端,我可以通过提示我在问题B中提到的重新认证/重新授权来处理这个问题。但是,这不能在我们的服务器上运行。我们当然可以让服务器将其更新一次到60天,但是第61天会发生什么?服务器只是停止同步朋友的名单?


D. 每次应用启动或从睡眠中重新补充水平时,检查FB访问令牌的有效性似乎是有意义的。我们的iOS应用程序检查此功能的最佳方式是什么?是否有建议的端点来调用验证令牌?我们应该调用https://graph.facebook.com/me传递访问令牌并检查响应吗?


注意:当我们获得最初扩展的令牌时,我们当然可以记录expires时间,但这不可靠,因为用户可以随时撤销我们应用的权限,这会使expires时间成为不可靠的数据指出有效性

最佳参考


概述


我认为,facebook试图实现的目的是阻止应用程序永久持久访问用户的帐户。因此,通过新迁移,应用程序只能访问帐户60天,除非用户再次登录。


我不会为facebook工作,但这是我在facebook图表api中玩的调查结果。


一般解决方案



  1. 每当用户登录时,请使用其访问令牌并立即对其进行扩展/刷新,然后保存

  2. 记录访问令牌的到期日期

  3. 当访问令牌过期时(从记录的日期或图表API异常告诉您),然后通知用户您无权访问,并要求他们再次登录。



答案



  答:当您通过最新的Facebook iOS SDK进行身份验证时,您获得的访问令牌的默认生命周期是多少?该文档说扩展令牌请求将为您提供持续60天的令牌请求。这个其他文档讨论了第一个访问令牌请求,并提到了不同的有效性,但它不清楚,它是否谈论具体的有效时间:



这是它的工作原理:



  1. 首次登录授予您约两小时

  2. 通过刷新访问令牌,您最多可以使用60天

  3. 如果用户没有登录这60天,则无法在没有登录的情况下访问更长时间。

  4. 如果用户取消授权您的应用,那60天的窗口会立即结束,您将无法再访问。




  B.对于客户端,既然访问令牌不一定很长,对我们来说是正确的方法:让我们通过FB登录,然后检测访问令牌何时到期。如果是,则调用FB iOS用于重新验证/重新授权的SDK?(这应该只会触发用户反弹到FB iOS应用程序,并且在大多数情况下会立即通过新的访问令牌返回到我们的应用程序)。



如果用户访问令牌已过期,那么您唯一的选择就是让他们像您所说的那样通过登录循环。



  C.根据我发现的这篇博文,你只能扩展一次访问令牌。在客户端,我可以通过提示我在问题B中提到的重新认证/重新授权来处理这个问题。但是,这不能在我们的服务器上运行。我们当然可以让服务器将其更新一次到60天,但是第61天会发生什么?服务器只是停止同步朋友的名单?



您只能扩展一次访问令牌。在第61天,你运气不好。最好通知用户并让他们知道,除非他们登录,否则你将无法做任何事情。



  D.每次应用程序启动或从睡眠中重新补充时,检查FB访问令牌的有效性似乎是有意义的。我们的iOS应用程序检查此功能的最佳方式是什么?是否有建议的端点来调用验证令牌?我们应该调用https://graph.facebook.com/me传递访问令牌并检查响应吗?[16]



我的天堂T能够找到一个API相当于调试控制台的关于无效的访问令牌这FB博客文章会谈,但没有按吨提任何特别的API方法旨在测试API。[17] [18]


我你打击https://graph.facebook.com/me 的建议可以正常工作正是他们在他们的例子中推荐的。事实上,我可能会在我的应用程序中使用这种方法作为检查访问令牌的主动方式。[19]


Tid Bits



  • 当您刷新访问令牌时,将返回新的访问令牌。回复如下:access_token=TOKEN&expires=5183912

  • 您只能刷新一次访问令牌。如果您尝试刷新从前一次调用返回的长期令牌,它将返回相同的令牌,但除非令牌已过期,否则不会抛出异常。(换句话说,您可以安全地尝试刷新您的令牌)

  • 默认访问令牌长度似乎约为2小时

  • 如果您刷新访问令牌,那么新的访问令牌似乎是您之后从facebook API获取的(而不是返回原始的,短期访问令牌)



此外,如果您想玩游戏,这些工具可以在将代码嵌入您的代码之前轻松地在浏览器中测试您的用例:



  • 图形API资源管理器 - 用于创建和获取访问令牌

  • 调试控制台 - 用于检查刷新之前/之后的令牌的到期日期

  • 刷新端点 - 用于手动测试扩展令牌


其它参考1


很棒的答案,一个重要的补充:默认令牌持续1到2个小时。您将获得用户注册的剩余时间,加上1个小时。例如,如果用户在下午3:45注册,则访问令牌将在下午5点到期。为了安全起见,开发人员应该假设它只持续1小时。 [20] [21] [22]