Facebook的SDK 3.1 - 错误验证访问令牌(Facebook SDK 3.1 - Er

2019-06-18 07:23发布

我想我的应用程序迁移到新的Facebook SDK 3.1(与iOS6的认证支持)。

我有它工作得很好,所以后来我决定取消从我的FB网站上的授权应用程序列表中的应用程序,以测试的iOS将再次请求许可。

现在,我要先把电话[FBRequest requestForMe]导致此错误:

响应:

{
  "error": {
    "message": "Error validating access token: Session does not match current stored session. This may be because the user changed the password since the time the session was created or Facebook has changed the session for security reasons.",
    "type":"OAuthException",
    "code":190,
    "error_subcode":460
  }
}

一些细节:

我想如下打开会话:

   [FBSession openActiveSessionWithReadPermissions:nil
                                       allowLoginUI:YES
                                  completionHandler:^(FBSession *session, FBSessionState state, NSError *error) {

                                           switch (state) {
                                               case FBSessionStateOpen:
                                                   [self presentPostOptions];
                                                   break;

                                               case FBSessionStateClosed:
                                               case FBSessionStateClosedLoginFailed:
                                                   [FBSession.activeSession closeAndClearTokenInformation];
                                                   break;

                                               default:
                                                   break;
                                           }

然后,我被调用回状态FBSessionStateOpen (在这一点上的iOS未提出请求对话框,这是可以预料的)? Facebook的日志这样的:

2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession INVALID transition from FBSessionStateCreated to FBSessionStateClosed
2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreated to FBSessionStateCreatedOpening 
2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition from FBSessionStateCreatedOpening to FBSessionStateOpen 

一旦会话是开放的,在presentPostOptions我这样做:

- (void)presentPostOptions
{    
    [[FBRequest requestForMe] startWithCompletionHandler:^(FBRequestConnection *connection, NSDictionary<FBGraphUser> *user, NSError *error) {
        if (!error) {
            self.usersName = user.name;
            self.usersID = user.id;

            [self getPages];
        }
        else
        {
            [self didFailWithError:error];
        }
    }];
}

上述完成块叫回来之前,我的主状态的处理程序块被称为与FBSessionStateClosed状态。 在此期间,Facebook的SDK已经登录了上述错误。

我找不到任何方式重置系统; 我也不真正了解的原因。

任何人都可以请一些启发?

Answer 1:

设备上的Facebook帐户已与服务器以及与应用程序的/ SDK的缓存成为了不同步。 这可以通过调用ACAccountStore方法renewCredentialsForAccount,将更新的令牌状态的OS的理解来解决。

在SDK的下一个更新,当它接收到来自指示标志已成为无效的服务器响应的SDK会自动调用这个API。 对于3.1.0版本的SDK,应用程序将需要显式调用此API。 下面是一个代码示例:

ACAccountStore *accountStore;
ACAccountType *accountTypeFB;
if ((accountStore = [[ACAccountStore alloc] init]) &&
    (accountTypeFB = [accountStore accountTypeWithAccountTypeIdentifier:ACAccountTypeIdentifierFacebook] ) ){

    NSArray *fbAccounts = [accountStore accountsWithAccountType:accountTypeFB];
    id account;
    if (fbAccounts && [fbAccounts count] > 0 &&
        (account = [fbAccounts objectAtIndex:0])){

        [accountStore renewCredentialsForAccount:account completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) {
            //we don't actually need to inspect renewResult or error.
            if (error){

            }
        }];
    }
}

有用于何处/何时调用API的几个选项。 最简单的地方将是机会主义拨打电话的应用程序启动,或查看负载。 这种方法的一个问题是,它会导致网络往返,往往是不必要的。 另一种选择是,当一个会话更改通知时,表明会话已经关闭调用它。 也有许多应用程序获取一些基本信息,如graph.facebook.com/me,在应用程序启动时,如果是这样 - 在错误响应的情况下调用此方法可能是一个合理的地方,要求iOS的更新它的令牌状态。

希望这有助于!



Answer 2:

我只是要促成另一件事来检查造成我浪费3小时:确保FB应用程序设置没有对,如果你想与非应用程序开发人员的FB用户登录的“沙盒”选项......也许不明显,但希望能救别人了几个小时。



Answer 3:

尝试添加,如果你还没有,你的iOS应用包ID在设置面板中你的Facebook应用程序的的建议在这里 。

希望这可以帮助。



Answer 4:

[FBSession openActiveSessionWithReadPermissions:nil
 allowLoginUI:YES
 completionHandler:^(FBSession *session, FBSessionState  state, NSError *error) 
    {

       switch (state) {
           case FBSessionStateOpen:
               [self presentPostOptions];
               break;

           case FBSessionStateClosed:
           case FBSessionStateClosedLoginFailed:
               [FBSession.activeSession closeAndClearTokenInformation];
               break;

           default:
               break;
       }

      }];   


Answer 5:

我相当肯定这是一个Facebook的iOS SDK的bug(甚至3.1.1)和我提起这个bug报告 。

虽然试图重现使用他们的示例应用程序美味的这个错误,我发现,它可以让你成功地重新检查,如果你正在使用openActiveSessionWithReadPermissions 。 但是,如果你要求通过发布权限openActiveSessionWithPublishPermissions ,它会停留在com.facebook.sdk.error 5



Answer 6:

在Facebook的SDK 3.7.1我仍然有这个问题。 基本上,我已经决定从Facebook的缓存中清除令牌时发生这种情况。 像这样:

if(state == FBSessionStateClosed ) {
     [FBSession.activeSession closeAndClearTokenInformation];
}


Answer 7:

简单斯威夫特2+解决方案 Facebook的错误验证访问令牌

// Step 1: Logout 
FBSDKLoginManager().logOut()

// Step 2: Login
FBSDKLoginManager().logInWithReadPermissions(["public_profile", "email"], fromViewController: self, handler: { result, error -> Void in 

// ...

}

如果出现此错误,您必须创建新的Facebook会话 ,所以你必须要重新登录。



文章来源: Facebook SDK 3.1 - Error validating access token