37 votes

Facebook SDK 3.1 - Erreur de validation du jeton d'accès

Je suis en train de faire la transition de mes applications sur le nouveau Facebook SDK 3.1 (avec le soutien de iOS6 d'authentification).

J'ai eu il fonctionne très bien, j'ai donc décidé de la supprimer de ma liste d'apps sur le FB du site web, afin de tester que iOS serait de leur demander la permission de nouveau.

Maintenant mon premier appel à [FBRequest requestForMe] des causes de cette erreur:

Réponse:

{"error":{"message":"Erreur lors de la validation de jeton d'accès: Session ne correspond pas stockée actuelle session. Cela peut être parce que l'utilisateur a changé le mot de passe depuis le temps de la session a été créée ou Facebook a changé la session pour des raisons de sécurité.","type":"OAuthException","code":190,"error_subcode":460}}

Quelques détails:

Je suis en train 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;
                                           }

J'ai ensuite appelé en FBSessionStateOpen (à ce stade, iOS n'a pas présenté une demande de dialogue, c'est qu'à l'attendre)? Facebook enregistre:

2012-09-26 13:43:43.768 MyApp[2177:907] FBSDKLog: FBSession *non VALIDE transition de FBSessionStateCreated à FBSessionStateClosed 2012-09-26 13:43:43.769 MyApp[2177:907] FBSDKLog: FBSession transition de FBSessionStateCreated à FBSessionStateCreatedOpening 2012-09-26 13:43:43.837 MyApp[2177:907] FBSDKLog: FBSession transition de FBSessionStateCreatedOpening à FBSessionStateOpen*

Une fois que la session est 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 de le au-dessus de l'achèvement de bloc est appelé retour, mon principal état bloc de gestionnaire est appelé avec un FBSessionStateClosed de l'état. Dans l'intervalle, le Facebook SDK a enregistré l'erreur ci-dessus.

Je ne peux pas trouver un moyen de réinitialiser le système, je ne comprends vraiment la cause.

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

76voto

Jason Clark Points 1333

Le Facebook compte sur l'appareil est devenu hors de synchronisation avec le serveur ainsi que de l'Application/du SDK cache. Ce problème peut être résolu par l'appel de la ACAccountStore méthode renewCredentialsForAccount, qui sera mise à jour de l'OS, de la compréhension de l'jeton d'état.

Dans la prochaine mise à jour du SDK, le kit de développement sera automatiquement appeler cette API lorsqu'il reçoit une réponse du serveur indiquant qu'un jeton est devenu invalide. Pour la 3.1.0 révision du SDK, les demandes devront explicitement appel de 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 existe plusieurs options pour où/quand faire appel à l'API. Le plus simple serait de façon opportuniste faire l'appel sur le lancement d'une application, ou sur la vue de la charge. Un problème avec cette approche est que cela va entraîner un aller-retour qui est souvent inutile. Une autre option est de l'appeler lorsqu'une notification de changement de session se produit, indiquant que la session est fermée. Aussi de nombreuses applications d'extraction des informations de base telles que graph.facebook.com/me au lancement de l'application le temps, et, dans l'affirmative, un appel à cette méthode dans le cas d'une réponse d'erreur peut être un bon endroit pour demander iOS pour mettre à jour son jeton d'état.

Nous espérons que cette aide!

7voto

snowdragon Points 458

Je vais simplement contribuer à un autre point à vérifier qui m'a fait perdre 3 heures: Assurez-vous que les paramètres de votre application FB ne disposent pas de l'option "Sandbox" si vous essayez de vous connecter avec un utilisateur FB non développeur. ... Peut-être évident, mais pourrait sauver les autres quelques heures avec espoir.

4voto

Cyupa Points 420

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

J'espère que cela t'aides.

1voto

Min Kim Points 29

Je suis assez sûr que c'est un facebook sdk ios bug (même sur 3.1.1). J'ai déposé un rapport de bug

https://developers.facebook.com/bugs/512251508787686

Tout en essayant de reproduire ce bug à l'aide de leur exemple d'application Délicieux, j'ai trouvé qu'il vous permet d'autoriser à nouveau correctement si vous utilisez openActiveSessionWithReadPermissions. Cependant, si vous demandez pour publier des autorisations via openActiveSessionWithPublishPermissions, il serait coincé dans (com.facebook.sdk.erreur 5).

0voto

chourobin Points 1147

obtenir le même problème. il semble que le sdk extrait le même jeton d'accès expiré même après le renouvellement des étapes de connexion.

Jeton d'accès expiré après openActiveSession for Facebook iOS SDK

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X