[英]Expired access token after openActiveSession for Facebook iOS SDK
I'm using the 3.1 Facebook SDK with iOS 6 Facebook set up in Settings and my app authorized. 我正在使用3.1 Facebook SDK与iOS 6 Facebook设置在设置和我的应用程序授权。
This executes flawlessly: 这完美地执行:
[FBSession openActiveSessionWithReadPermissions:nil allowLoginUI:YES completionHandler:^(FBSession *fbSession, FBSessionState fbState, NSError *error) { ... }
However now when I try to get 'me' information I'm getting an 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;
}
If I look at [error code]
it's equal to 5. Shouldn't I have a valid access token after just logging in? 如果我查看
[error code]
它等于5.我登录后不应该有一个有效的访问令牌吗? Do I need to call reauthorize? 我需要拨打重新授权吗?
UPDATE : Reauthorizing doesn't help. 更新 :重新授权没有帮助。 Oddly the accessToken for my activeSession is always coming back the same.
奇怪的是,我的activeSession的accessToken总是回归相同。 This despite calling closeAndClearToken.
尽管调用了closeAndClearToken。
UPDATE : This issue has been addressed in Facebook iOS SDK 3.1.1. 更新 :此问题已在Facebook iOS SDK 3.1.1中得到解决。
I synched the code off of github and found that they weren't calling accountStore renewCredentialsForAccount:completion:
anywhere. 我将github的代码同步,发现他们没有调用
accountStore renewCredentialsForAccount:completion:
anywhere。 I changed the following code in authorizeUsingSystemAccountStore
and it seems to have resolved the issue. 我在
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);
}
}];
}
So it's addressed, but I've been calling /me from our backend to verify since you can't trust the device. 所以它已得到解决,但我一直在从我们的后端调用/我来验证,因为你不能信任该设备。
So I make a call to FBSession
's + (void)renewSystemAuthorization
when the backend comes back with an authorization error. 因此,当后端返回授权错误时,我会调用
FBSession
的+ (void)renewSystemAuthorization
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.