【问题标题】:When I should load a new access token?我什么时候应该加载新的访问令牌?
【发布时间】:2012-05-14 15:11:39
【问题描述】:

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

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

据我了解,现在她有了新的访问令牌,应用程序应该从 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时,尝试加载它。但我注意到这是正确的方法,并且在大多数情况下不太有用

【问题讨论】:

    标签: facebook cookies oauth-2.0


    【解决方案1】:

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

    客户端的令牌不应过多打扰您,因为您可以轻松获得一个新令牌,正如“Handling Invalid and Expired Access Tokens”指南中所述:

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

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

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

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

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

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

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

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

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

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


    编辑

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

    你应该做什么:

    在服务器端,您应该按照Server-Side auth guide 中的说明,获取“代码”并用令牌交换它。 该令牌将有 60 天。

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

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

    【讨论】:

    • 是不是说没有办法将客户端Javascript认证和服务器端认证结合起来呢?我的意思是,服务器解析 Facebook cookie 以在服务器端授权用户已经足够了。但是这个cookie不包含访问令牌,服务器不知道当前存储的访问令牌是否仍然有效。
    • 您没有理由参与 cookie,让 SDK 为您做这件事。每个令牌都有到期时间(应用令牌除外),您可以检查该令牌是否仍然有效,如果有效,它有多长时间。至于 js/server 身份验证,正如我所写,您可以将客户端令牌发送到服务器,但这毫无意义,除非您对其进行扩展。
    • 似乎我们在谈论不同的事情。我已经更新了我的问题,请你看一下好吗?
    • 只使用服务器端身份验证有什么好处?我仍然有同样的问题(不同线程中的令牌无效),但它需要编写大量代码(因为我需要客户端流程 - 按钮、身份验证弹出窗口、客户端验证和页面刷新等。这对用户来说真的很不友好用我自己的方式做这个,而不是标准的 facebook 的 UI)
    • 服务器端身份验证产生一个 60 天的令牌,客户端流令牌是几个小时,如果这对你来说足够了,那就使用它。要获取服务器端,您不能使用身份验证弹出窗口,您必须将用户重定向到身份验证对话框页面。
    猜你喜欢
    • 2023-03-10
    • 2021-08-29
    • 2021-02-26
    • 2020-01-04
    • 2013-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多