草庐IT

ios - 当您在 iOS 应用程序和服务器中都使用 token 时如何处理 Facebook 弃用的离线访问权限

coder 2023-07-28 原文

Facebook的deprecationoffline_access许可将于 2012 年 5 月发布,但文档没有为我们提供有关如何处理它的足够信息。

我们有一个 iOS 应用程序和相应的服务,为其提供支持并与 Facebook 深度集成,以在应用程序内利用用户的 friend 列表(因此,如果您的 FB friend 也在使用该应用程序,您可以更轻松地建立联系)。这就像所有社交应用程序的工作方式一样,所以这里没什么特别的。

客户

我们的应用程序使用 Facebook iOS SDK允许用户登录,我们目前要求 offline_access . token 保留在我们的 iOS 应用程序中,但也会发送到保存它的服务器。客户端代表用户向用户的新闻源发布更新(我们还请求 publish_stream 权限)。

服务器

我们的服务器会定期检查用户的 FB 好友是否正在使用我们的应用程序。下次用户登录时,我们会以某种方式公开内容和关系以宣传该用户的 friend 。服务器还代表用户定期连接到图 API 并获取用户的当前好友列表。这样我们就可以解释用户关系的变化,并将它们反射(reflect)在我们的应用程序中。当用户当前未使用该应用程序时,我们会执行此操作,以便他们在下次使用该应用程序时获得最佳体验。为了实现这一点,我们的 iOS 应用程序将访问 token 发送到它使用的服务器以及我们为什么要求 offline_access .

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

问题

既然不再有我们可以使用的永久访问 token ,我正在尝试找出最佳实践,以在利用 facebook 处理和扩展访问 token 的新预期方式的同时仍然启用我们的场景。不幸的是,文档并不完全有帮助。

问题

答:当您通过最新的 Facebook iOS SDK 进行身份验证时,您获得的访问 token 的默认生命周期是多少? This document说一个扩展的 token 请求会给你一个持续 60 天的 token 。这个other document谈论第一个访问 token 请求并提到不同的有效性,但它是 unclear它是否谈论具体的有效期:

(重点是我的)

When you obtain an access token from Facebook, it will be valid immediately and usable in requests to the API for some time period defined by Facebook. After that period has elapsed, the access token is considered to have expired and the user will need to be authenticated again in order for your app to obtain a fresh access token. The duration for which a given access token is valid depends on how it was generated.

There are also events which may cause an access token to become invalid before its expected expiry time. Such events include the user changing their password, an application refreshing it's App Secret. Dealing with varying access token expiry times, and handling the case when an access token becomes invalid before its expected expiry time is essential for building robust social experiences.



B. 对于客户来说,既然访问 token 不一定是长期存在的,那么对我们来说是正确的方法:

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

C.根据this blog post我发现,您只能扩展一次访问 token :

Can I exchange my 60 day access token for a new 60 day access token?

No, sorry you cannot. You can only exchange a valid (meaning current) user access token for an extended one. You cannot extend an already extended access token.



在客户端,我可以通过提示重新认证/重新授权来处理这个问题,正如我在问题 B 中提到的那样。但是,这在我们的服务器上不起作用。我们当然可以让服务器将它更新一次到 60 天,但是在第 61 天会发生什么?服务器只是停止能够同步 friend 的列表?

D. 每次应用程序启动或从 sleep 中恢复时检查 FB 访问 token 的有效性似乎是有意义的。我们的 iOS 应用程序检查这一点的最佳方法是什么?是否有推荐的端点来调用以验证 token ?我们应该打电话到https://graph.facebook.com/me传递访问 token 并检查响应?

注意:我们当然可以记录expires我们获得初始扩展 token 的时间,但这不可靠,因为用户可以随时撤销我们的应用程序的权限,这使得 expires时间一个不可靠的有效性数据点

最佳答案

概述

我相信 facebook 试图实现的根本目的是防止应用程序永久永久访问用户帐户。因此,在新的迁移中,除非用户再次登录,否则应用只能访问一个帐户 60 天。

我不为 facebook 工作,但这是我在玩 facebook graph api 时的发现。

通用解决方案

  • 每当用户登录时,获取他们的访问 token 并立即扩展/刷新它,并保存它
  • 记录访问 token 的到期日期
  • 当访问 token 过期时(从记录的日期开始,或者图形 API 异常告诉您),然后通知用户您没有访问权限,并要求他们再次登录。

  • 答案

    A. When you authenticate through the newest Facebook iOS SDK, what is the default lifetime of the access token you get? This document says an extended token request will give you one that lasts 60 days. This other document talks about the first access token request and mentions varying validities but it's unclear and does it talk about specific validity times:



    以下是它的工作原理:
  • 第一次登录大约需要两个小时
  • 通过刷新访问 token ,您最多可以获得 60 天
  • 如果用户在这 60 天内未登录,则在不登录的情况下无法获得更长时间的访问权限。
  • 如果用户取消对您的应用程序的授权,则 60 天的窗口会立即结束,您将无法再访问。

  • B. For the client, now that the access token isn't necessarily long lived, is the right approach for us to: Let use login through FB, then detect whenever the access token is expired. If it is, then call into FB iOS SDK to re-authentication/re-authorize? (this should just trigger user to bounce out to FB iOS app, and in most cases come immediately back to our app with a new access token).



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

    C. According to this blog post I found, you can only extend an access token once. On the client, I can just handle this by prompting a re-authentication/re-authorization as I mentioned in Question B. However, this doesn't work on our server. We could certainly have the server renew it once to 60 days, but what happens on the 61st day? The server just stops being able to sync the friend's list?



    您只能扩展一次访问 token 。第 61 天,你运气不好。最好通知用户并让他们知道,除非他们登录,否则您将无法执行任何操作。

    D. It seems to make sense to check the validity of the FB access token every time the app starts or re-hydrates from sleep. What is the best way for our iOS app to check this? Is there a recommended endpoint to call to validate a token? Should we just call into https://graph.facebook.com/me passing the access token and checking the response?



    我找不到与 Debug Console 等效的 API . This FB blog article讨论了无效的访问 token ,但没有提到任何特别用于测试 API 的 API 方法。

    我建议您点击 https://graph.facebook.com/me工作得很好正是他们在 their example 中推荐的。 .事实上,我可能会在我的应用程序中使用这种方法作为检查访问 token 的主动方式。

    花絮
  • 当您“刷新”访问 token 时,将返回一个新的访问 token 。响应如下:access_token=TOKEN&expires=5183912
  • 您只能“刷新”一次访问 token 。如果您尝试“刷新”从先前调用返回的长期存在的 token ,它将返回相同的 token ,但除非 token 已过期,否则不会引发异常。 (换句话说,您可以安全地尝试刷新您的 token )
  • 默认访问 token 长度似乎约为 2 小时
  • 如果您“刷新”访问 token ,那么新的访问 token 似乎就是您之后将从 facebook API 获得的那个(而不是返回原始的、短暂的访问 token )

  • 此外,如果您想尝试一下,这些工具可以让您轻松地在浏览器中测试您的用例,然后再将其埋入您的代码中:
  • Graph API Explorer - 用于创建和获取访问 token
  • Debug Console - 用于在刷新之前/之后检查 token 的到期日期
  • Refresh Endpoint - 用于手动测试扩展 token
  • 关于ios - 当您在 iOS 应用程序和服务器中都使用 token 时如何处理 Facebook 弃用的离线访问权限,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10132610/

    有关ios - 当您在 iOS 应用程序和服务器中都使用 token 时如何处理 Facebook 弃用的离线访问权限的更多相关文章

    1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

      类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

    2. ruby - 具有身份验证的私有(private) Ruby Gem 服务器 - 2

      我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..

    3. ruby - 完全离线安装RVM - 2

      我打算为ruby​​脚本创建一个安装程序,但我希望能够确保机器安装了RVM。有没有一种方法可以完全离线安装RVM并且不引人注目(通过不引人注目,就像创建一个可以做所有事情的脚本而不是要求用户向他们的bash_profile或bashrc添加一些东西)我不是要脚本本身,只是一个关于如何走这条路的快速指针(如果可能的话)。我们还研究了这个很有帮助的问题:RVM-isthereawayforsimpleofflineinstall?但有点误导,因为答案只向我们展示了如何离线在RVM中安装ruby。我们需要能够离线安装RVM本身,并查看脚本https://raw.github.com/wayn

    4. ruby-on-rails - 在混合/模块中覆盖模型的属性访问器 - 2

      我有一个包含模块的模型。我想在模块中覆盖模型的访问器方法。例如:classBlah这显然行不通。有什么想法可以实现吗? 最佳答案 您的代码看起来是正确的。我们正在毫无困难地使用这个确切的模式。如果我没记错的话,Rails使用#method_missing作为属性setter,因此您的模块将优先,阻止ActiveRecord的setter。如果您正在使用ActiveSupport::Concern(参见thisblogpost),那么您的实例方法需要进入一个特殊的模块:classBlah

    5. ruby - 续集在添加关联时访问many_to_many连接表 - 2

      我正在使用Sequel构建一个愿望list系统。我有一个wishlists和itemstable和一个items_wishlists连接表(该名称是续集选择的名称)。items_wishlists表还有一个用于facebookid的额外列(因此我可以存储opengraph操作),这是一个NOTNULL列。我还有Wishlist和Item具有续集many_to_many关联的模型已建立。Wishlist类也有:selectmany_to_many关联的选项设置为select:[:items.*,:items_wishlists__facebook_action_id].有没有一种方法可以

    6. ruby-on-rails - 启动 Rails 服务器时 ImageMagick 的警告 - 2

      最近,当我启动我的Rails服务器时,我收到了一长串警告。虽然它不影响我的应用程序,但我想知道如何解决这些警告。我的估计是imagemagick以某种方式被调用了两次?当我在警告前后检查我的git日志时。我想知道如何解决这个问题。-bcrypt-ruby(3.1.2)-better_errors(1.0.1)+bcrypt(3.1.7)+bcrypt-ruby(3.1.5)-bcrypt(>=3.1.3)+better_errors(1.1.0)bcrypt和imagemagick有关系吗?/Users/rbchris/.rbenv/versions/2.0.0-p247/lib/ru

    7. ruby-on-rails - Enumerator.new 如何处理已通过的 block ? - 2

      我在理解Enumerator.new方法的工作原理时遇到了一些困难。假设文档中的示例:fib=Enumerator.newdo|y|a=b=1loopdoy[1,1,2,3,5,8,13,21,34,55]循环中断条件在哪里,它如何知道循环应该迭代多少次(因为它没有任何明确的中断条件并且看起来像无限循环)? 最佳答案 Enumerator使用Fibers在内部。您的示例等效于:require'fiber'fiber=Fiber.newdoa=b=1loopdoFiber.yieldaa,b=b,a+bendend10.times.m

    8. ruby-on-rails - s3_direct_upload 在生产服务器中不工作 - 2

      在Rails4.0.2中,我使用s3_direct_upload和aws-sdkgems直接为s3存储桶上传文件。在开发环境中它工作正常,但在生产环境中它会抛出如下错误,ActionView::Template::Error(noimplicitconversionofnilintoString)在View中,create_cv_url,:id=>"s3_uploader",:key=>"cv_uploads/{unique_id}/${filename}",:key_starts_with=>"cv_uploads/",:callback_param=>"cv[direct_uplo

    9. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

      似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

    10. ruby - 如何验证 IO.copy_stream 是否成功 - 2

      这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

    随机推荐