【发布时间】: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