iphone - iOS 6 Facebook 登录不刷新访问 token

标签 iphone objective-c facebook ios6 facebook-access-token

我正在阅读(很多 FB 开发文章和 SO 问题)都没有帮助,所以我想我会在这里发帖。我正试图让这一切与 iOS 6 和 Facebook SDK 3.1.1 一起工作。

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

在新安装的第一个小时左右,一切都完美无缺。如果用户通过 iOS 设置应用程序登录,他们会看到一个快速的 iOS 确认框,我得到他们的 token ,将它发送到我的服务器,一切都很好。

如果我将收到的 token 粘贴到 Facebook 的访问 token 调试器中,它会显示它将在一小时后过期。

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

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

随机笔记:

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

更新#1:

我提到过我读过 SDK 将处理无效/过期的 token 。这似乎应该发生在 FBRequestConnection#completeWithResults:orError: 中。有关代码路径的注释,请参阅内联注释。

- (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];
        }
    }

    ...
}

最佳答案

这不是我想要的修复类型,但事情看起来按预期工作,所以此时我只需要发布。

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

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

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

在大多数情况下,现在一切都按预期工作。

关于iphone - iOS 6 Facebook 登录不刷新访问 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13125430/

相关文章:

javascript - Facebook JS SDK 不需要 app secret 来验证 : How secure is it?

iphone - 如何设置 uitoolbar 的背景类似于我的导航栏

ios - 我的 UIScrollView(包含一些 UIControl)在 iOS 8 中不再滚动

ios - 过程中的 UIProgressView 栏

ios - 滚动时保持 UITableview 单元格中自定义按钮的状态

ios - Facebook SDK 3.1 登录错误

android - 适用于 Android 的 Facebook SDK - 示例应用程序无法运行

iphone - 使用线程批量更新核心数据时出错

iphone - UITableView 不滚动到单元格

objective-c - Objective c 检查文本字段是否为空