2012-09-27 28 views
9

Estoy usando el SDK de Facebook 3.1 con iOS 6 Facebook configurado en Configuración y mi aplicación está autorizada.Token de acceso caducado después de openActiveSession para Facebook iOS SDK

Esto ejecuta sin problemas:

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

Sin embargo, ahora cuando trato de conseguir 'yo' la información que estoy recibiendo un 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; 
} 

Si miro [error code] es igual a 5. ¿No debería tener un token de acceso válido después de iniciar sesión? ¿Debo llamar para volver a autorizar?

ACTUALIZACIÓN: volver a autorizar no ayuda. Curiosamente, el accessToken para mi session activa siempre vuelve lo mismo. Esto a pesar de llamar a closeAndClearToken.

+2

Para empezar a diagnosticar, ¿podría registrar el access_token que obtiene y pegarlo en https://developers.facebook.com/tools/debug - es la marca de tiempo justo allí? –

+0

Buen consejo. Ahora el problema se ha ido y necesito recrearlo. Probaré tu sugerencia la próxima vez que la vea. –

+0

Estoy teniendo el mismo problema con iPhone5/iOS6. Aunque parece muy esporádico. Por favor, avíseme si encuentra algo más sobre este tema y haré lo mismo. – Chad

Respuesta

4

ACTUALIZACIÓN: Este problema se ha abordado en Facebook SDK de iOS 3.1.1.


I synched el código fuera de GitHub y se encontró que no estaban llamando accountStore renewCredentialsForAccount:completion: en cualquier lugar. Cambié el siguiente código en authorizeUsingSystemAccountStore y parece que resolvió el problema.

// 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); 
             } 

            }]; 

} 
+0

Probablemente deberíamos estar buscando un expiryDate antes de renovar (ya que lleva tiempo renovarlo) pero a pesar de lo que dice en los documentos de Apple (http://developer.apple.com/library/ios/#documentation/Accounts/Reference/ACAccountCredentialClassRef /Reference/Reference.html#//apple_ref/doc/c_ref/ACAccountCredential), el parámetro expiryDate no parece existir. –

+2

Hola Ben, tienes razón acerca de la necesidad de llamar a renovar *. Llamar desde aquí funciona bien. La elección de dónde realizar las llamadas depende generalmente de la compensación entre la coherencia en el comportamiento y los recorridos de ida y vuelta adicionales de la red. En la próxima actualización de SDK, estamos considerando realizar la llamada en la lógica FBRequestConnection que maneja tokens no válidos. –

+0

@JasonClark Parece una elección razonable. Sugeriría que también tenga una simple y renovada llamada en el FB SDK. Eso sería útil si solo estuviera usando el SDK para la gestión de tokens en lugar de un conducto para realizar llamadas de gráficos. ¡Gracias por responder! –

0

Así que se trata, pero he estado llamándome/desde nuestro servidor para verificarlo ya que no puede confiar en el dispositivo.

Llamo al FBSession+ (void)renewSystemAuthorization cuando el servidor vuelve con un error de autorización.

+1

No veo un método de clase renewSystemAuthorization en FBSession en 3.1.1. – gerry3

+0

Parece que abordaron este problema por este compromiso por el que estoy atrasado. https://github.com/facebook/facebook-ios-sdk/commit/0b3d28b7bea8b63dd9efca67e1438d72fc78daf5 – hawflakes

Cuestiones relacionadas