javascript - FB auth 的正确方法

标签 javascript facebook node.js

我的项目使用 Node.js 和 Express,但问题是关于通用方法。

我们的用户都来自 FB,除了 FB,我们没有任何身份验证。我们需要将一些 Action 与特定的 FB 用户关联起来,还需要他们的 token 与 FB 进行通信。

目前我们这样做:

  • 用户来到页面
  • 不可见 block :一个带有用户头像和名称的占位符('logged-in'),另一个带有触发 FB 登录的按钮('logged-out')
  • 使用 FB JS SDK 我们检查用户的登录状态。如果已连接(实际上意味着:登录 FB,验证我们的应用程序并提供我们需要的所有权限),我们将获取用户名和 FB ID 并显示“登录” block 。否则会显示“已注销” block
  • 对于登录用户的某些操作,用户的 access_token 通过 AJAX(不用担心,这里是 HTTPS)传递给服务器,并由服务器代码用于发布到用户的墙或其他操作等操作
  • FB登录按钮由JS处理,调用FB.login()
  • 在 JS authResponseChanged 事件中采取明显的行动(显示/Conceal 登录/退出 block )

好在哪里:我们一直都知道用户的状态是有效的(token的TTL超过了正常页面的生命周期,所以我们这里好)。

我们不太喜欢的东西: * 客户端 token 是短暂的(是的,我们可以交换它们,但如果我们能找到任何替代品就不想这样做) * 它通常需要几个对 FB 的请求(1 - 加载 JS SDK,2 - 获取登录状态),直到我们可以显示一些东西。直到我们网站的“登录” block 为空。

问题是什么?

我们正在寻找一种最佳方式来在这里使用一些服务器端代码,并至少在我们确定用户已登录时呈现用户的姓名和头像。

我可以想象一些这样的方案:

  • 使用服务器端身份验证(带有重定向)来获取长期存在的 token 并将其保存在服务器上
  • 在 session 中保存用户状态(登录/退出、FB ID、姓名)
  • 如果 session 在服务器上处理模板时具有登录状态,则呈现名称和头像

担忧:

  • 如果用户从 FB 登录我们或撤销了 App 权限,我们应该如何知道它以及我们应该何时检查它(检查每 N 个请求?每 X 小时?只检查 token 何时将在 Y 小时内到期?)
  • 如果我们在渲染任何模板(official example 中的情况)之前从服务器检查用户的状态,这会减慢速度,对吗?因为我认为 FB API 调用在炎热的时候会很慢。

最佳答案

使用 JS SDK 是“实时”了解用户状态的唯一可行方法。 (引号中的“实时”,因为 FB.getLoginStatus 的结果也会被缓存——如果希望它始终准确,则必须使用第二个参数设置为 true。)

如果您将 JS SDK 设置为在您的域下设置 cookie,那么 PHP SDK 能够确定用户的登录状态,而无需通过 HTTP 进行任何 API 查找——它只是从 cookie 中读取用户 ID,因此 Facebook::getUser() 将为您获取用户 ID。这足以显示图片 - 但对于用户名,这仍然需要 API 请求。

在这里您可以选择请求名称​​一次 - 然后将其保存到您的 session 中。如果在下一个请求中,JS SDK 指示用户不再连接,您可以从页面中删除登录信息和/或强制重新加载(然后清除 session ),以返回未连接登录状态。

关于javascript - FB auth 的正确方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13351235/

相关文章:

javascript - RegEx javascript 匹配 2 个连续出现的字符,但不匹配更多

facebook - 使用 facebook connect 在 Meteor 应用程序中登录回调

javascript - promise Stripe API

javascript - socket.io - 'connect' 事件不会在客户端触发

node.js - Sharepoint API 上传损坏的文件

javascript - 在正则表达式中可以只接受换行输入吗?

Java 列出目录中的文件

动态编写脚本时无法访问 Javascript 函数

node.js - Instagram基本显示: Exchanging code for access_token works only after 5 minutes

ios - RPSCommonObjects.m 解析问题未知类型名称 NSString