【问题标题】:Server-side auth and request timeouts to Facebook?服务器端身份验证和对 Facebook 的请求超时?
【发布时间】:2011-10-07 12:24:34
【问题描述】:

我的应用程序的一部分需要登录,并且无法通过 javascript 等使用客户端身份验证,因此使用 http 请求请求身份验证服务器端:

https://graph.facebook.com/oauth/access_token?client_id=[app_id]&client_secret=[secret]&redirect_uri=[uri]&code=[code]

这在大多数情况下都可以正常工作。但是我间歇性地从这个请求中得到超时/空响应。我可以运行一个工具,它会一遍又一遍地请求这个页面,并且大约 80-90% 的时间会成功。一旦发生一次故障,对于任何用户来说,所有请求都会失败几秒钟,然后它会再次运行。

有没有其他人经历过这样的事情,或者你知道 Facebook 是否会在超过某个阈值时切断请求的上限?我在文档中找不到任何听起来相似的信息。

【问题讨论】:

    标签: facebook authentication oauth


    【解决方案1】:

    这是因为如果您发送的请求过多,facebook 会认为您要进行 DDOS 攻击并暂时阻止您的请求。

    【讨论】:

    • 我之前考虑过,但我肯定没有提出足够的要求吗?该应用有大约 10 万用户,根据我的见解,每天只有 30-4 万个 api 请求。
    • 如果,那么您应该在“API”选项卡上的应用洞察中找到有关它的信息。
    【解决方案2】:

    您只能为会话检索一次令牌。其他方式肯定会让FB防御节流。 但是,如果您没有申请 'offline_access' 特殊权限,则您的令牌有过期时间。 默认为retentionPeriod=2 和retentionUnit=hour。 也许你应该要求

    scope=offline_access
    

    进入您的许可,然后只检索一次用户令牌。 另外你需要执行一个

    try{my api call} catch(bad token){ reload the new token and retry } 
    

    如果任何 API 调用因身份验证错误而失败,则重新询问令牌。

    【讨论】:

    • 我认为使用offline_access 来解决这个问题是多余的,但我同意缓存令牌以尝试并确保它只被请求一次是一个好主意。但是,如果您尝试让用户登录,则不能使用缓存令牌,因为显然您想检查用户是否实际登录,而不仅仅是您存储了他们的访问令牌
    • 好吧,在 OAuth 2.0 中,fb cookie 就是为此目的而设置的。
    • @Guillaume-Pelletier cookie 是否解决了 Abby 的担忧,即您不能使用缓存的令牌以防万一他们没有真正登录?
    • 缓存令牌是服务器端的问题.. 不一样的情况。例如,就像您正在使用任何应用程序,即使是来自“不可信”的设备,并且希望应用程序(如 deezer)在您的墙上或时间轴上发布更新。
    • @GuillaumePelletier 我仍然很困惑,当你说“你必须为你的会话只检索一次令牌”时,FB API 文档中的说明在哪里?我将尝试将我的问题表述为一个详细的问题并参考此讨论。
    【解决方案3】:

    在 app Insights 中,您可以从诊断页面检查 API 限制,也可以从性能页面检查最常见的错误。如果您没有看到任何错误或没有任何限制,您可能会更改应用程序逻辑,如果您收到超时/空响应,请再次请求令牌。

    【讨论】:

    • 没有限制我的诊断,也没有错误。我已经实施了重试,但其中一些必须重试多达 20-30 次才能成功。
    猜你喜欢
    • 1970-01-01
    • 2015-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-31
    • 2014-05-07
    • 2011-11-04
    • 2023-03-24
    相关资源
    最近更新 更多