Facebook SDK 3.1 – Erreur lors de la validation du jeton d'access

J'essaie de faire la transition entre mon application et le nouveau SDK 3.1 de Facebook (avec la prise en charge de l'authentification iOS6).

Je l'ai fait fonctionner très bien, alors j'ai décidé de retirer l'application de ma list d'applications autorisées sur le site FB afin de tester que iOS requestrait à nouveau la permission.

Maintenant, mon premier appel à [FBRequest requestForMe] provoque cette erreur:

Réponse:

 { "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 } } 

Quelques détails:

J'essaie d'ouvrir la session comme suit:

  [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; } 

Je suis alors callbacké dans l'état FBSessionStateOpen (à ce stade, iOS n'a pas présenté de dialog de requête, est-ce prévisible)? Facebook enregistre ceci:

 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 

Une fois la session ouverte, dans presentPostOptions, je fais ceci:

 - (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]; } }]; } 

Avant que le bloc d'achèvement ci-dessus soit callbacké, mon bloc de gestionnaire d'état principal est appelé avec un état FBSessionStateClosed . En attendant, le SDK Facebook a enregistré l'erreur ci-dessus.

Je ne trouve aucun moyen de réinitialiser le système; Je ne comprends pas vraiment la cause.

Quelqu'un peut-il s'il vous plaît jeter un peu de lumière?

    Le count Facebook sur l'appareil est désynchronisé avec le server ainsi qu'avec le cache de l'application / SDK. Cela peut être résolu en appelant la méthode ACAccountStore renewCredentialsForAccount, qui mettra à jour la compréhension du operating system de l'état du jeton.

    Dans la prochaine mise à jour du SDK, le SDK appelle automatiquement cette API lorsqu'il reçoit une réponse du server indiquant qu'un jeton est devenu invalide. Pour la révision 3.1.0 du SDK, les applications devront appeler explicitement cette API. Voici un exemple de code:

     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){ } }]; } } 

    Il y a plusieurs options pour où / quand appeler l'API. L'endroit le plus simple serait de faire l'appel de façon opportuniste au lancement de l'application, ou sur le chargement de la vue. Un problème avec cette approche est qu'elle entraînera un aller-return réseau qui est souvent inutile. Une autre option consiste à l'appeler lorsqu'une notification de modification de session se produit, indiquant qu'une session s'est fermée. De nombreuses applications extraient également des informations de base telles que graph.facebook.com/me, au moment du lancement de l'application, et si c'est le cas, un appel à cette méthode en cas de réponse d'erreur peut être un bon moyen de requestr à iOS de mettre à jour son jeton statut.

    Espérons que cela aide!

    Je vais juste append une autre chose pour vérifier que cela m'a fait perdre 3 heures: Assurez-vous que vos parameters d'application FB n'ont pas l'option 'Sandbox' si vous essayez de vous connecter avec un user FB non-développeur d'applications … Peut-être évident, mais pourrait sauver les autres quelques heures avec optimisme.

    Essayez d'append, si vous ne l'avez pas déjà fait, votre identifiant d'application iOS dans le panneau des parameters de votre application Facebook, comme suggéré ici .

    J'espère que cela t'aides.

     [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; } }]; 

    Je suis assez sûr que c'est un bug Facebook iOS SDK (même sur 3.1.1) et j'ai déposé ce rapport de bogue .

    Tout en essayant de reproduire ce bug en utilisant leur exemple d'application Scrumptious, j'ai trouvé qu'il vous permet de ré-autoriser avec succès si vous utilisez openActiveSessionWithReadPermissions . Cependant, si vous requestz des permissions de publication via openActiveSessionWithPublishPermissions , il sera bloqué dans com.facebook.sdk.error 5 .

    Dans Facebook SDK 3.7.1 j'avais toujours ce problème. Fondamentalement, j'ai décidé d'effacer le jeton du cache Facebook lorsque cela se produit. Comme ça:

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

    Solution simple Swift 2+ pour Facebook Erreur de validation du jeton d'access

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

    Si cette erreur se produit, vous devez créer une nouvelle session Facebook , vous devez donc vous reconnecter.