我的项目使用 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 小时内到期的时间?)
- 如果我们在渲染任何模板之前从服务器检查用户的状态(这是官方示例中的情况),这会减慢速度,对吗?因为我认为 FB API 调用在炎热的时候会相当慢。