iOS 6 Facebook登录不刷新访问令牌

Posted

技术标签:

【中文标题】iOS 6 Facebook登录不刷新访问令牌【英文标题】:iOS 6 Facebook Login not refreshing access token 【发布时间】:2012-10-29 16:11:18 【问题描述】:

我正在阅读的任何内容(许多 FB 开发文章和 SO 问题)都没有帮助,所以我想我会在这里发帖。我正在尝试让这一切与 ios 6 和 Facebook SDK 3.1.1 一起工作。

我有一个非常基本的设置:我的 iOS 应用程序通过 Facebook 进行身份验证,我将 access_token 传递给我的服务器,用户现在已登录到我的应用程序。他们唯一能做的与 facebook 相关的事情就是在他们的墙上贴一些东西。我使用的是旧版 Dialog 窗口,因此用户可以添加自己的 cmets。

在新安装的头一个小时左右,一切都可以完美运行。如果用户通过 iOS 设置应用程序登录,他们会看到一个快速的 iOS 确认框,我得到他们的令牌,将其发送到我的服务器,我们都很好。

如果我将收到的令牌粘贴到 Facebook 的 Access Token 调试器中,它会显示它将在一小时后过期。

如果我等了那个小时然后再回到应用程序,我尝试做的任何事情都会给我这个错误:

"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. 
    我需要做什么才能让事情正常工作? I've read 在 SDK 3.1.1 FBSession 中只会处理它,但情况似乎并非如此。我的访问令牌即将过期,一旦过期,iOS/FB SDK 将不会给我一个刷新的令牌。 即使注销(调用[FBSession.activeSession closeAndClearTokenInformation])也无法解决此问题。我唯一能做的就是在 iOS 模拟器首选项中“重置内容和设置”,在 Settings.app 中重新输入我的 FB 凭据,然后重建我的应用程序。只有这样我才能获得另一个将在一个小时内到期的令牌。

随机笔记:

    当我的应用程序恢复时,我正在调用 [FBSession.activeSession handleDidBecomeActive][self.facebook extendAccessTokenIfNeeded] 根据上面链接的 SO 问题,SDK 应该会自动调用 FBSession#renewSystemAuthorization。我已经在其中放置了一个 NSLog,但我从未看到该方法被调用。

更新 #1

我提到我已经读到 SDK 将处理无效/过期的令牌。这似乎应该发生在 FBRequestConnection#completeWithResults:orError: 中。有关代码路径的说明,请参见内联 cmets。

- (void)completeWithResults:(NSArray *)results
                orError:(NSError *)error

    int count = [self.requests count];
    for (int i = 0; i < count; i++) 
        FBRequestMetadata *metadata = [self.requests objectAtIndex:i];
        id result = error ? nil : [results objectAtIndex:i];
        NSError *itemError = error ? error : [self errorFromResult:result];

        id body = nil;
        if (!itemError && [result isKindOfClass:[NSDictionary class]]) 
            NSDictionary *resultDictionary = (NSDictionary *)result;
            body = [FBGraphObject graphObjectWrappingDictionary:[resultDictionary objectForKey:@"body"]];
        

        ...

        // *******************************************
        // My code actually falls into this block, proving that I do in fact have an invalid session
        // *******************************************
        if ([self isInvalidSessionError:itemError
                        resultIndex:error == itemError ? i : 0]) 
            [metadata.request.session closeAndClearTokenInformation:itemError];

            // *******************************************
            // Unfortunately metadata.request.session is nil, so this condition is never
            // run, so renewySystemAuthorization is never called
            // *******************************************
            if (metadata.request.session.loginType == FBSessionLoginTypeSystemAccount)
                [FBSession renewSystemAuthorization];
        
    

    ...

【问题讨论】:

您确定这是一个长期存在的访问令牌吗?当您将令牌输入Debugger 时,到期日期说明了什么。我的长期令牌说“过期:1356716436(大约 2 个月)” 嗯,这很有趣。好主意。将其插入调试器(对于那些不知道的人:developers.facebook.com/tools/debug)说“过期:1351540800(大约一个小时)”。我觉得我已经非常密切地关注了 SDK 文档和示例。我的应用程序在第一个小时内运行良好,但在那之后,我就无法获得更新的令牌。有什么想法吗? 您能否提供有关您的应用仪表板设置的信息。例如,您在 Advanced > Authentication 部分中的设置是什么。您在设置中能想到的其他与文档不同的地方吗? 好问题。他们似乎都很正常。对于 Advanced > Auth,我将 Web 作为类型,将回调 url 设为空白。我认为它需要保持 Web 而不是 Native/Desktop,因为我们的网站使用相同的 FB 应用程序。我今天尝试将其切换到Native/Desktop,当我将令牌插入调试器时,没有过期时间。我觉得很奇怪,所以我把它改回来了。除 Social Discovery、Picture as Dict 和 Reset Client URL 设置为 NO 外,其他所有内容均已禁用或空白。在 Basics 中,我已经“正确配置了本机 iOS 应用程序,启用了 FB 登录,并禁用了深度链接。 @djibouti33 - 我有同样的问题,我在这里描述:***.com/questions/13242787/…。你找到解决方案了吗?我正在考虑一些但还不确定最好的方法。 【参考方案1】:

这不是我所追求的修复类型,但看起来一切正常,所以此时我只需要发货。

首先,我们的应用程序的旧版本正在请求offline_access。我不知道。我进入了我的 FB 应用程序的设置 > 高级,并启用了“删除 offline_access 权限”。我现在取回了一个持续两个月的令牌 (check out the facbeook token debugger)。

现在我正在取回正确类型的令牌,但在取回已停用/过期的有效令牌时仍然存在问题。由于我现在要取回一个 2 个月的令牌,我等不及它过期了,所以我的计划是通过进入我的帐户设置并取消授权来触发 OAuthException。

在我的 appDidBecomeActive 中,我将 [FBRequestConnection startForMeWithCompletionHandler:nil] 用于简单地触发对 FB 的静默请求,当由于无效会话/令牌而失败时,代码流将通过正确的路径运行并且 [FBSession renewSystemAuthorization] 结束接到电话,这最终是我所需要的。这允许 iOS 做的是下次我通过 FB 登录到我的应用程序时,iOS 再次提示我,了解我不再拥有有效的令牌。调用 [FBSession renewSystemAuthorization] 有效地告诉 iOS,下次我的应用请求访问时,点击 facebook 并给我一个新的/刷新的令牌。

现在大多数情况下一切正常。

【讨论】:

在哪里可以找到“FB 应用程序的设置 > 高级,并启用了“删除 offline_access 权限。”我找不到它 嗯,好像已经被删除了。一些搜索显示它在下个月左右被弃用/删除,但也许如果它没有启用,他们只是完全隐藏它。尝试跳过该步骤并按照其余步骤进行操作,看看您会得到什么。

以上是关于iOS 6 Facebook登录不刷新访问令牌的主要内容,如果未能解决你的问题,请参考以下文章

iOS:通过自动登录获取 Facebook 访问令牌

NodeJS上的Facebook iOS access_token身份验证

在 iOS 6 中为我的应用程序登录 Facebook [关闭]

我在 ios 6 中获得了用于 Facebook 的格式错误的访问令牌

在 Facebook iOS SDK 3.5.x 中获取 Facebook 页面访问令牌

Facebook 登录不起作用,错误:无效的 Oauth 访问令牌。它总是零