【问题标题】:PHP: Using Facebook OAuth with less API callsPHP:使用 Facebook OAuth 并减少 API 调用
【发布时间】:2011-07-28 15:32:12
【问题描述】:

我的目标是在网站上使用 Facebook 登录,并尽可能少地调用 api。我不想在根本不与 facebook 交互的网站上使用任何服务器端的 facebook api 调用。这意味着我只想使用 api 调用来登录和发布内容。但是我不想使用 Facebooks offline_access 权限标志。

以下是一些想法:

  • 为网站使用自己的会话,而不是依赖 Facebook 会话。因此,即使 Facebook 会话令牌已过期,用户也会保持登录状态。否则用户将在令牌过期后立即注销,需要再次单击登录以获取新令牌,否则 Facebook 的 JS SDK 将自动登录,但这仍然不完美,因为用户将在“已登录”中看到页面-out state”,一旦 JS SDK 得到一个新的令牌,它就会刷新。无 JS 用户必须再次点击登录按钮。
  • 在数据库或内存缓存中缓存 Facebook 用户数据。使用Facebook API Subscription 保持数据库更新。 -> 无需向 API 询问用户 Facebook 个人资料的更改。

问题:

  • 使用自己的会话时,Facebook 会话令牌可能会在尝试发布某事时过期。在Facebook上。因此,您必须中止当前脚本并通过将用户重定向到 Facebook 或使用 JS SDK 来获取新令牌。然后继续脚本。这很痛苦。

我对如何解决问题的想法:

  • 您也可以使用 Javascript 在 Facebook 上发布内容,而不是使用 PHP。如果令牌已过期,只需使用 JS 获取一个新令牌,该令牌不需要重新加载页面,也不需要将页面重定向到 Facebook。但是我想支持禁用 Javascript 的用户,但这是不可能的。
  • 在我看来,唯一有用的方法是使用缓存用户数据的自己的会话,即使 Facebook 令牌过期也让用户保持登录状态。但是一旦需要 Facebook 交互,就将它们重定向到 Facebook 并返回。这样,用户将不会看到处于“注销状态”的页面,不需要 Javascript,并且只有在确实需要时,用户才会被重定向到 Facebook 登录。对于 Javascript 用户,Facebook JS SDK 将更新令牌(然后将其存储在 cookie 中)而用户不会注意到这一点,因为用户仍处于登录状态(使用自己的会话处理)。

你怎么看?是否有另一种(更好的?)方法来做到这一点?我的最后一点似乎是可行的,但没有更简单的方法吗?谢谢。

【问题讨论】:

  • 我不明白你想要完成什么。您希望用户即使未登录也保持登录状态?
  • 我想用 PHP 编写应用程序并使用 Facebook 作为登录提供程序。使用自己的会话,即使 Facebook 令牌已过期或用户在 Facebook 上注销,我也可以让用户保持登录状态。
  • 使用 Facebook 作为登录提供程序的意义不在于您不需要处理这些事情吗?
  • 是的,但我不希望用户在令牌过期后以访客身份查看我的网站,如果用户在每次访问页面时仍然登录,我不想检查 API .但是,如果用户之前登录过并且令牌是否已过期(在 cookie 中保存过期时间),我可以检查使用 cookie,如果用户 WAS 已登录且令牌已过期,则 HTTP 将直接重定向到 Facebook。但是,如果用户撤销了权限,他将始终看到 Facebook 身份验证页面,而不是我网站的访客视图。
  • 您可以在每个 $(document).ready() 上运行 FB.login 方法,如果用户已经登录,它将不会重新登录。您可以做的是保存一个 cookie表示用户之前已通过身份验证,仅在您需要与 facebook 交互时才运行 FB.login。

标签: php facebook oauth facebook-graph-api


【解决方案1】:

在为我的网站创建身份验证系统时,我遇到了完全相同的问题。就像 Elad Lachmi 所说,您可以在每个页面加载时运行 FB.login - 但这会导致快速弹出闪烁(变得非常烦人)。

我的解决方案实际上最终要求我使用offline_access。如果用户离开您的网站几个小时,似乎没有其他合适的方法可以让用户保持登录状态。

这是(潜在的)捕获:

  • 通过 Facebook 登录用户,无需离线访问
  • 在每个页面上,使用 jQuery 将 iframe 写入使用 FB.getLoginStatus 的特殊格式的 URL,并将其设置为每 15 分钟刷新一次

此组合应每 15 分钟从 Facebook 获取最新的用户会话 ID。它会导致它在接近到期时被更新。

请注意,我还没有尝试过,它可能违反了 Facebook ToS。但如果您想让用户保持登录超过 2 小时而不要求他们刷新页面,那么它确实是唯一不使用 offline_access 的解决方案。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-28
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 2012-12-30
    • 2011-06-26
    • 1970-01-01
    相关资源
    最近更新 更多