什么时候我应该加载一个新的访问令牌?

时间:2012-05-14 04:30:31

标签: facebook cookies oauth-2.0

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

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

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

我的意思是:

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

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

1 个答案:

答案 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收到错误,当发生这种情况时,只需再次将用户发送到身份验证对话框。