iOS 6中的Facebook登录不刷新访问令牌(iOS 6 Facebook Login not

2019-07-03 10:39发布

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

我有一个非常基本的设置:我的iOS应用与Facebook进行身份验证,我通过到的access_token我的服务器,现在的用户登录到我的应用程序。 他们可以做相关的Facebook的唯一的其他东西是东西后到他们的墙。 我使用的是传统的对话框窗口,以便用户可以添加自己的评论。

一切都完美的作品上了一个新安装的第一个小时左右。 如果用户通过iOS设置应用登录后,他们提出了一个快速的iOS确认框,我得到他们的令牌,将它发送到我的服务器,我们都好。

如果我贴我收到到Facebook的访问令牌调试令牌,它表明,它会在一个小时内到期。

如果我等那么小时,回来到应用程序之后,什么我尝试做给我这个错误:

{"error_code":190,"
  error_msg":"Error validating access token: 
              Session has expired at unix time 1351497600. 
              The current unix time is 1351525180. }
  1. 我需要做什么做这样的事情只是工作? 我读过 ,在SDK 3.1.1 FBSession只会照顾它,但是这似乎并不像这种情况。 我的访问令牌到期,一旦这样做,的iOS / FB SDK不会给我回一个刷新。
  2. 即使注销(它调用[FBSession.activeSession closeAndClearTokenInformation]不解决这个问题。 我已经能够做的唯一的事情就是在iPhone模拟器首“重置内容和设置”,重新输入Settings.app我的FB凭据,重建我的应用程序。 只有这样,我可以得到另一个标记,这将在一个小时内到期。

散记:

  1. 当我的应用程序恢复,我打电话[FBSession.activeSession handleDidBecomeActive][self.facebook extendAccessTokenIfNeeded]
  2. 根据链接到上面的SO问题,SDK会自动调用被FBSession#renewSystemAuthorization 。 我把一个NSLog的在那里,我从来没有看到该方法获取调用。

更新#1:

我说过,我读过的SDK将处理无效/过期的令牌。 好像应该在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];
        }
    }

    ...
}

Answer 1:

这不是我后修复的类型,但事情看起来是工作不如预期,所以在这一点上,我只需要出货。

首先第一件事情,事实证明,我们的应用程序的旧版本中,要求offline_access。 我不知道。 我去到我的FB应用程序的设置>高级,并启用了“删除offline_access许可。” 现在我又回到那持续两月(令牌检查出facbeook令牌调试器 )。

现在,我又回到了正确类型的令牌,我仍然有取回一个有效令牌时,它已经停用/过期的问题。 因为现在我又回到2个月的令牌,我不能等待到期,所以我的计划是通过进入我的帐户的设置和取消授权它来触发OAuthException。

在我appDidBecomeActive,我把[FBRequestConnection startForMeWithCompletionHandler:无]简单地触发一种无声的请求,FB,当失败因为无效的会话/令牌,代码流,通过正确的路径运行,[FBSession renewSystemAuthorization]最终得到所谓的,这是最终什么,我需要。 这是什么让iOS的做下一次我去登录至通过FB我的应用程序是,iOS的又提示我,理解我没有有效令牌了。 调用[FBSession renewSystemAuthorization]有效地告诉iOS的下一次我的应用程序请求访问,命中Facebook和给我回一个新的/刷新令牌。

在大多数情况下一切工作为现在的预期。



文章来源: iOS 6 Facebook Login not refreshing access token