我的应用程序在客户端使用Facebook Javascript SDK授权,并且授权用户应用程序从Facebook API获取访问令牌,使用带有签名请求的facebook cookie并提供code
,并将其存储到数据库中。
一切正常,但我想知道,什么时候我应该刷新存储的访问令牌?如果用户有更改密码,并再次登录/连接,该怎么办?
据我了解,现在她有了新的访问令牌,应用程序应该从Facebook加载它。但是,当我应该检查新令牌时,我怎么理解?使用facebook cookie检查每个请求都不起作用,因为每个用户每秒请求的次数很少(如果她没有更改密码则会发生事件)。或者也许我做错了什么?
我的意思是:
access token
(因为我需要来自签名请求的code
)。所以,当我没有存储access token
或现有access token
已过期时,我正在这样做。access token
只是存储在数据库中,可以随时使用,在不同的线程中使用,也许几分钟后(意味着我们没有用户请求和带有签名请求的cookie)access token
未过期但在facebook端无效,该怎么办?我需要获取新的access token
,但此时cookie已经消失。目前我只看到一种方法:将已签名的请求中的code
存储到数据库中,当我们发现无效access token
时,请尝试加载它。但是我要注意这是正确的方法,并且在大多数情况下并没有那么多可用
答案 0 :(得分:3)
您有客户端令牌和服务器令牌,客户端令牌短暂(几个小时),服务器一个长寿(60天)。
客户端的令牌不应该打扰你太多,因为你可以很容易地得到一个新的,因为它在“Handling Invalid and Expired Access Tokens”指南中说明:
使用Javascript SDK实现身份验证的桌面Web和移动Web应用
调用FB.getLoginStatus()或确保status:true 调用FB.init()表示下次用户登陆您的 应用程序并签署到Facebook,authResponse对象你 由于那些调用将包含一个新的,有效的传递 访问令牌。
在这种情况下,它只是用户使用您的应用程序的行为 它隐式生成一个新的访问令牌。
服务器端的令牌(您在数据库中持久存储)无法轻松复制,用户必须再次发送到身份验证对话框:
实施服务器端身份验证流程的桌面Web和移动Web应用
要获得新访问令牌,您必须通过该用户 再次通过完整的服务器端流程:即获得代码和 将其换成新的访问令牌。
但是,假设用户未取消您的申请, 当您将用户重定向到OAuth对话框时,用户将不会 提示重新授权您的应用程序,并将立即 重定向到您的redirect_uri。这意味着重新认证 进程对用户来说可以是透明的。
你当然可以将一个客户端令牌发送到服务器并坚持下去,但它很短暂,因为它很短暂。 另一种方法是在服务器端使用new endpoint to extend 有效客户端令牌,然后保留该令牌。
至于“如何知道何时获取新令牌”,在服务器端进行api请求时只需检查响应并查看是否返回错误,如果是,则返回错误(第一个列表中有一个列表)我添加的网址)。 如果令牌已过期,则只需再次将用户发送到auth对话框(您可以将某种代码返回给客户端并从那里执行),然后将新令牌保存到数据库中。
没有必要检查cookie,这些是在后台使用的,但你不应该与它们有任何关系。
不要使用cookies,他们不应该随时关注你。
你应该做什么:
在服务器端,您应该按照Server-Side auth guide中的说明操作,获取“代码”并使用令牌进行交换。 该令牌将有60天。
根据需要使用您存储在数据库中的令牌(其他线程,不支持)以及当您从Facebook收到错误时说明令牌已过期,只需将用户导航回auth对话框页面即可。
您无法使用“代码”获取多个令牌,因此无法帮助您。 如果用户会话(和令牌)失效(由于各种原因),您在尝试发出api请求时仍会从Facebook收到错误,当发生这种情况时,只需再次将用户发送到身份验证对话框。