1

我的应用在客户端使用 Facebook Javascript SDK 授权,授权用户应用从 Facebook API 获取访问令牌,使用带有签名请求和提供的 facebook cookie code,并将其存储到数据库中。

一切正常,但我想知道,什么时候应该刷新存储的访问令牌?如果用户更改了密码并再次登录/连接怎么办。

据我了解,现在她有了新的访问令牌,应用程序应该从 Facebook 加载它。但是我怎么能理解什么时候应该检查一个新的令牌呢?使用 facebook cookie 检查每个请求不起作用,因为每个用户每秒的请求很少(如果她没有更改密码,则事件)。或者也许我做错了什么?

我是说:

  • 我已经在客户端授权用户
  • 我有带有签名请求的 cookie
  • 签名请求足以在服务器端授权用户(验证用户凭据)
  • 当用户用户向我的应用发出请求时,我可以access token随时通过调用 Facebook API 来获取(因为我需要code来自签名的请求)。所以,当我没有存储access token或现有access token已过期时,我正在这样做。
  • access token只是存储在数据库中,可以随时在不同的线程中使用,可能几分钟后(意味着我们没有用户请求和带有签名请求的 cookie)
  • 如果存储access token未过期,但在 facebook 端无效怎么办?我需要获取新access token的,但此时 cookie 已经消失了。

目前我只看到一种方法:将code签名请求存储到数据库中,当我们发现我们有 invalidaccess token时,尝试加载它。但我注意到这是正确的方法,并且在大多数情况下不太有用

4

1 回答 1

3

你有客户端令牌和服务器令牌,客户端一个是短暂的(几个小时),服务器一个是长期的(60 天)。

客户端的令牌不应该过多打扰您,因为您可以轻松获得一个新令牌,如“处理无效和过期的访问令牌”指南中所述:

使用 Javascript SDK 实现身份验证的桌面 Web 和移动 Web 应用程序

调用 FB.getLoginStatus() 或确保 status: true 在您调用 FB.init() 时设置,这意味着用户下次登陆您的应用程序并登录 Facebook 时,您将通过这些调用传递 authResponse 对象将包含一个新的、有效的访问令牌。

在这种情况下,它只是用户使用您的应用程序的行为,它隐式地生成了一个新的访问令牌。

您保存在数据库中的服务器端令牌不能轻易复制,必须再次将用户发送到身份验证对话框:

实现服务器端身份验证流程的桌面 Web 和移动 Web 应用程序

在这种情况下,要获得新的访问令牌,您必须再次让用户通过完整的服务器端流程:即获得一个代码并将其交换为新的访问令牌。

但是,假设用户没有取消对您的应用程序的授权,当您将用户重定向到 OAuth Dialog 时,不会提示用户重新授权您的应用程序,而是会立即重定向到您的 redirect_uri。这意味着重新认证过程对用户来说是透明的。

您当然可以将客户端令牌发送到服务器并保留它,但它非常没有意义,因为它是短暂的。另一种选择是使用新端点在服务器端扩展有效的客户端令牌,然后将其持久化。

至于“如何知道何时获取新令牌”,在服务器端,当您发出 api 请求时,只需检查响应并查看是否返回错误,如果是,则它是什么(我添加的第一个 url 中有一个列表)。如果令牌已过期,则只需将用户再次发送到身份验证对话框(您可以将某种代码返回到客户端并从那里执行),然后将新令牌保存到数据库。

无需检查 cookie,它们在后台使用,但您不应该与它们有任何关系。


编辑

不要使用 cookie,它们在任何时候都不应该让您担心。

你应该做什么:

在服务器端,您应该按照服务器端身份验证指南中的说明,获取“代码”并用令牌交换它。该令牌将有 60 天。

根据需要使用存储在数据库中的那个令牌(其他线程,什么不是),当你从 facebook 收到一个错误说令牌已过期时,只需将用户导航回身份验证对话框页面。

您不能使用“代码”来获取多个令牌,这样对您没有帮助。如果用户会话(和令牌)无效(由于各种原因),当您尝试发出 api 请求时,您仍然会从 facebook 收到错误消息,当这种情况发生时,只需再次将用户发送到身份验证对话框。

于 2012-05-14T06:37:37.827 回答