wake-up-neo.net

Facebook SDK 3.1 - Fehler beim Validieren des Zugriffstokens

Ich versuche, meine App auf das neue Facebook SDK 3.1 (mit Unterstützung der iOS6-Authentifizierung) umzustellen.

Ich hatte es gut funktioniert, also entschied ich mich, die App aus meiner Liste der autorisierten Apps auf der FB-Website zu entfernen, um zu testen, ob iOS erneut um Erlaubnis fragen würde.

Nun verursacht mein erster Aufruf von [FBRequest requestForMe] diesen Fehler:

Antwort:

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

Ein paar Details:

Ich versuche, die Sitzung wie folgt zu öffnen:

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

Ich werde dann im Status FBSessionStateOpen zurückgerufen (zu diesem Zeitpunkt hat iOS keinen Anforderungsdialog angezeigt, ist das zu erwarten)? Facebook protokolliert dies:

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 

Sobald die Sitzung geöffnet ist, mache ich in presentPostOptions folgendes:

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

Bevor der obige Beendigungsblock zurückgerufen wird, wird mein Hauptzustandsbehandlungsblock mit einem FBSessionStateClosed-Status aufgerufen. In der Zwischenzeit hat das Facebook-SDK den obigen Fehler protokolliert.

Ich kann keinen Weg finden, das System zurückzusetzen. Ich verstehe auch nicht wirklich die Ursache.

Kann jemand bitte etwas Licht werfen?

36
tarmes

Das Facebook-Konto auf dem Gerät ist nicht mehr mit dem Server und dem Cache der App/des SDK synchronisiert. Dies kann durch Aufrufen der ACAccountStore-Methode renewCredentialsForAccount gelöst werden. Dadurch wird das Verständnis des Betriebssystems für den Tokenstatus aktualisiert.

Beim nächsten Update des SDK ruft das SDK diese API automatisch auf, wenn eine Antwort vom Server empfangen wird, die angibt, dass ein Token ungültig ist. Für die Version 3.1.0 des SDK müssen Anwendungen diese API explizit aufrufen. Hier ist ein Codebeispiel:

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){

            }
        }];
    }
}

Es gibt verschiedene Möglichkeiten, wo und wann die API aufgerufen werden soll. Am einfachsten wäre es, den Aufruf beim Start der Anwendung oder beim Laden von Ansichten opportunistisch durchzuführen. Ein Problem bei diesem Ansatz ist, dass dies zu einer Netzwerkrundfahrt führt, die häufig nicht erforderlich ist. Eine weitere Option ist, es aufzurufen, wenn eine Sitzungsänderungsbenachrichtigung auftritt, um anzuzeigen, dass eine Sitzung geschlossen wurde. Viele Anwendungen rufen auch einige grundlegende Informationen ab, z. B. graph.facebook.com/me, und zwar zum Zeitpunkt des Anwendungsstarts. Wenn dies der Fall ist, kann ein Aufruf dieser Methode im Falle einer Fehlerantwort ein vernünftiger Ort sein, um iOS zur Aktualisierung seines Token aufzufordern Status. 

Hoffentlich hilft das!

76
Jason Clark

Ich werde nur eine weitere Sache beitragen, um zu überprüfen, dass ich 3 Stunden verschwendet habe: Stellen Sie sicher, dass Ihre Einstellungen für die FB-App nicht die Option "Sandbox" haben, wenn Sie versuchen, sich mit einem Nicht-App-Login anzumelden. Entwickler FB-Benutzer ... Vielleicht offensichtlich, könnte aber andere hoffentlich ein paar Stunden sparen.

7
snowdragon

Fügen Sie, falls noch nicht geschehen, die ID Ihres iOS-App-Bundles im Einstellungsbereich Ihrer Facebook-App hinzu, wie vorgeschlagen hier .

Hoffe das hilft.

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

      }];   
1
user4431517

Ich bin mir ziemlich sicher, dass dies ein Facebook iOS SDK Fehler ist (auch in 3.1.1) und ich habe diesen Fehlerbericht eingereicht.

Bei dem Versuch, diesen Fehler mit der Beispiel-App Scrumptious zu reproduzieren, habe ich festgestellt, dass Sie damit erfolgreich erneut autorisieren können, wenn Sie openActiveSessionWithReadPermissions verwenden. Wenn Sie jedoch über openActiveSessionWithPublishPermissions nach Veröffentlichungsberechtigungen fragen, würde dies in com.facebook.sdk.error 5 hängen bleiben.

1
Min Kim

In Facebook SDK 3.7.1 hatte ich noch dieses Problem. Grundsätzlich habe ich mich entschieden, das Token aus dem Facebook-Cache zu löschen, wenn dies geschieht. So was:

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

Einfache Swift 2+ -Lösung für Facebook-Fehler beim Überprüfen des Zugriffs-Tokens

// Step 1: Logout 
FBSDKLoginManager().logOut()

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

// ...

}

Wenn dieser Fehler auftritt, müssen Sie eine neue Facebook-Sitzung erstellen, sodass Sie sich erneut anmelden müssen.

0
fatihyildizhan