【问题标题】:A proper approach to FB authFB auth 的正确方法
【发布时间】:2012-11-12 20:40:54
【问题描述】:

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

我们的用户都来自 FB,除了 FB,我们没有任何身份验证。我们需要将一些操作与特定的 FB 用户相关联,并且还需要他们的令牌与 FB 进行通信。

目前我们这样做:

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

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

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

问题是什么?

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

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

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

担忧

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

【问题讨论】:

    标签: javascript facebook node.js


    【解决方案1】:

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

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

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

    【讨论】:

    • 除了我们没有使用 PHP(如问题开头所述)外,我的计划正是这样做的,尽管我可以在 JS SDK 中检索用户数据并通过 AJAX 将其传递给服务器
    • 哦,是的,我只是过度阅读了 :-) 如果您对它在第一页加载上花费更多时间感到满意,那么您可以使用 JS 并将信息发送到服务器并保存它进入那里的会议。 (然后在随后的页面加载中将信息从服务器提供给客户端,不需要通过 JS 进行另一次查找。)
    • 仍然需要 JS 查找:会话为空 - 检查可能是用户再次登录;会话不为空 - 检查可能是我们已经注销的用户。但是我会根据会话显示初始登录/注销状态,然后使用额外的 JS 查询对其进行优化 - 对吗?
    • 是的,正确的。如果您在页面加载后检查用户是否仍然登录,则不应导致用户明显的延迟。对于第一次检查,当会话为空时,您甚至可能希望默认不显示登录按钮,但有一个文本说“检查登录状态”或其他内容,然后将其更改为显示确定状态后的用户详细信息或登录按钮。
    【解决方案2】:

    其实说“为了实时,需要使用JS SDK”是完全不正确的! Facebook 有“Realtime Updates Graph API”,每次更新一些数据时,你的本地数据库会自动更新,那么你就不需要使用 JS SDK

    【讨论】:

    • 是否与用户登录和注销有关? :)
    • 对不起,我不关注!基本上这是关于 facebook 向您发送更新信息的实时信息,而不是您查询 facebook 并使用新信息更新您的数据库
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    • 1970-01-01
    • 2017-02-28
    • 2014-03-25
    • 1970-01-01
    • 2015-11-16
    相关资源
    最近更新 更多