FB身份验证的正确方法

时间:2012-11-12 20:40:55

标签: javascript facebook node.js

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

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

目前我们这样做:

  • 用户访问该页面
  • 隐形块:一个带有占位符,用于用户的头像和名称('登录'),另一个带按钮触发FB登录('已登出')
  • 使用FB JS SDK检查用户的登录状态。如果已连接(实际上意味着:登录到FB,验证我们的应用并提供了我们需要的所有权限),我们会获得用户名和FB ID并显示“已登录”块。否则显示“已注销”块
  • 对于某些操作的登录用户,用户的access_token通过AJAX传递给服务器(不用担心,此处为HTTPS),并由服务器代码用于发布到用户墙壁或其他任何内容的操作
  • FB登录按钮由JS处理并调用FB.login()
  • 关于JS authResponseChanged事件采取明显的操作(显示/隐藏登录/隐藏块)

什么是好的:我们总是知道用户的状态是有效的(令牌的TTL超过正常页面的生命周期,所以我们在这里很好)。

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

有什么问题?

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

我可以想象一下这样的计划:

  • 使用服务器端身份验证(带重定向)获取长生命令牌并将其保留在服务器上
  • 在会话中保存用户的状态(登录/注销,FB ID,姓名)
  • 如果会话具有登录状态,则在处理服务器上的模板时呈现名称和头像

关注

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

2 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:0)

实际上,说“为了实时,你需要使用JS SDK”是完全错误的! Facebook有“实时更新图谱API”,每次更新一些数据时,您的本地数据库会自动更新,然后您不需要使用JS SDK