在Facebook iOS SDK的openActiveSession之后过期的访问令牌

我正在使用设置和我的应用程序授权设置的iOS 6 Facebook的3.1 Facebook SDK。

这完美地执行:

[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *fbSession, FBSessionState fbState, NSError *error) { ... } 

但是现在,当我尝试获取“我”信息时,出现错误:

 com.facebook.sdk:ParsedJSONResponseKey = { body = { error = { code = 190; "error_subcode" = 463; message = "Error validating access token: Session has expired at unix time 1348704000. The current unix time is 1348706984."; type = OAuthException; }; }; code = 400; } 

如果我看[error code]它等于5.在login之后,我不应该有一个有效的访问令牌吗? 我需要重新授权吗?

更新 :重新授权没有帮助。 奇怪的是我的activeSession的accessToken总是回来一样的。 这尽pipe调用closeAndClearToken。


更新 :这个问题已经在Facebook iOS SDK 3.1.1中解决。


我同步github的代码,发现他们没有调用accountStore renewCredentialsForAccount:completion:任何地方。 我更改了authorizeUsingSystemAccountStore的以下代码,似乎已经解决了这个问题。

 // we will attempt an iOS integrated facebook login [accountStore requestAccessToAccountsWithType:accountType options:options completion:^(BOOL granted, NSError *error) { // this means the user has not signed-on to Facebook via the OS BOOL isUntosedDevice = (!granted && error.code == ACErrorAccountNotFound); dispatch_block_t postReauthorizeBlock = ^{ NSString *oauthToken = nil; if (granted) { NSArray *fbAccounts = [accountStore accountsWithAccountType:accountType]; id account = [fbAccounts objectAtIndex:0]; id credential = [account credential]; oauthToken = [credential oauthToken]; } // initial auth case if (!isReauthorize) { if (oauthToken) { _isFacebookLoginToken = YES; _isOSIntegratedFacebookLoginToken = YES; // we received a token just now self.refreshDate = [NSDate date]; // set token and date, state transition, and call the handler if there is one [self transitionAndCallHandlerWithState:FBSessionStateOpen error:nil token:oauthToken // BUG: we need a means for fetching the expiration date of the token expirationDate:[NSDate distantFuture] shouldCache:YES loginType:FBSessionLoginTypeSystemAccount]; } else if (isUntosedDevice) { // even when OS integrated auth is possible we use native-app/safari // login if the user has not signed on to Facebook via the OS [self authorizeWithPermissions:permissions defaultAudience:defaultAudience integratedAuth:NO FBAppAuth:YES safariAuth:YES fallback:YES isReauthorize:NO]; } else { // create an error object with additional info regarding failed login NSError *err = [FBSession errorLoginFailedWithReason:nil errorCode:nil innerError:error]; // state transition, and call the handler if there is one [self transitionAndCallHandlerWithState:FBSessionStateClosedLoginFailed error:err token:nil expirationDate:nil shouldCache:NO loginType:FBSessionLoginTypeNone]; } } else { // reauth case if (oauthToken) { // union the requested permissions with the already granted permissions NSMutableSet *set = [NSMutableSet setWithArray:self.permissions]; [set addObjectsFromArray:permissions]; // complete the operation: success [self completeReauthorizeWithAccessToken:oauthToken expirationDate:[NSDate distantFuture] permissions:[set allObjects]]; } else { // no token in this case implies that the user cancelled the permissions upgrade NSError *error = [FBSession errorLoginFailedWithReason:FBErrorReauthorizeFailedReasonUserCancelled errorCode:nil innerError:nil]; // complete the operation: failed [self callReauthorizeHandlerAndClearState:error]; // if we made it this far into the reauth case with an untosed device, then // it is time to invalidate the session if (isUntosedDevice) { [self closeAndClearTokenInformation]; } } } }; if (granted) { [accountStore renewCredentialsForAccount:[[accountStore accountsWithAccountType:accountType] lastObject] completion:^(ACAccountCredentialRenewResult renewResult, NSError *error) { dispatch_async(dispatch_get_main_queue(), postReauthorizeBlock); }]; } else { // requestAccessToAccountsWithType:options:completion: completes on an // arbitrary thread; let's process this back on our main thread dispatch_async(dispatch_get_main_queue(), postReauthorizeBlock); } }]; } 

所以这个问题已经解决了,但是我一直在后台打电话给我,因为你不能信任这个设备。

因此,当后端返回授权错误时,我会调用FBSession+ (void)renewSystemAuthorization