2013-07-26 13 views
6

Mam usługę backendu, która zaloguje się do mojej aplikacji i zwróci rozszerzony token facebookowy z poprzedniego logowania, prawdopodobnie z innego urządzenia (więc żadne dane uwierzytelniające nie są buforowane na tym urządzeniu). Chcę użyć tego tokena, aby rozpocząć sesję Facebooka. Używam coś takiego:Otwórz FBSession z istniejącymi danymi tokenów na iOS

FBSession* session = [[FBSession alloc] initWithPermissions:@[@"publish_actions"]]; 
FBAccessTokenData* tokenData = 
[FBAccessTokenData createTokenFromString:token 
          permissions:@[@"publish_actions"] 
          expirationDate:nil 
           loginType:FBSessionLoginTypeTestUser 
          refreshDate:nil]; 


[session openFromAccessTokenData:tokenData completionHandler:nil]; 

jestem tutaj przechodzącej „nil” dla jasności, w moim kodu mam obchodzenia zakończenie i zalogowaniu przedmiotem sesji powrócił który wydaje się być w stanie otwartym bez błędów. Kiedy próbuję korzystać z sesji, pojawia się komunikat o błędzie:

Error Domain=com.facebook.sdk Code=5 "The operation couldn’t be completed. (com.facebook.sdk error 5.)" UserInfo=0xb8b1680 {com.facebook.sdk:HTTPStatusCode=403, com.facebook.sdk:ParsedJSONResponseKey={ 
    body =  { 
     error =   { 
      code = 200; 
      message = "(#200) The user hasn't authorized the application to perform this action"; 
      type = OAuthException; 
     }; 
    }; 
    code = 403; 
}, com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    email, 
    "publish_actions" 
)>} 

Jakieś sugestie ...?

+0

To podejście działa poprawnie w wersji SDK 3.21.1. Możliwe, że token nie został wygenerowany z FBSessionLoginTypeTestUser i dlatego mówi, że użytkownik nie jest autoryzowany. –

Odpowiedz

5

znalazłem rozwiązanie: (pod warunkiem, masz już tokena)

Pierwszą podklasę klasy FBSessionTokenCachingStrategy jak MySessionTokenCachingStrategy i zastąpić poniższą metodę:

- (FBAccessTokenData *)fetchFBAccessTokenData 
{ 
    NSMutableDictionary *tokenInformationDictionary = [NSMutableDictionary new]; 

    // Expiration date 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationExpirationDateKey"] = [NSDate dateWithTimeIntervalSinceNow: 3600]; 

    // Refresh date 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationRefreshDateKey"] = [NSDate date]; 

    // Token key 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationTokenKey"] = self.token; 

    // Permissions 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationPermissionsKey"] = self.permissions; 

    // Login key 
    tokenInformationDictionary[@"com.facebook.sdk:TokenInformationLoginTypeLoginKey"] = @0; 

    return [FBAccessTokenData createTokenFromDictionary: tokenInformationDictionary]; 
} 

następnie wykorzystać klasę wyżej stworzyć

MySessionTokenCachingStrategy* tokenCachingStrategy = 
[[MySessionTokenCachingStrategy alloc] initWithToken:token 
             andPermissions:@[@"read_stream"]]; 



FBSession *session = [[FBSession alloc] initWithAppID: nil 
              permissions: @[@"read_stream"]] 
             urlSchemeSuffix: nil 
            tokenCacheStrategy: tokenCachingStrategy]; 

    if (session.state == FBSessionStateCreatedTokenLoaded) 
    { 
     // Set the active session 
     [FBSession setActiveSession: session]; 

     // Open the session, but do not use iOS6 system acount login 
     // if the caching strategy does not store info locally on the 
     // device, otherwise you could use: 
     // FBSessionLoginBehaviorUseSystemAccountIfPresent 
     [session openWithBehavior: FBSessionLoginBehaviorWithFallbackToWebView 
       completionHandler: ^(FBSession *session, 
            FBSessionState state, 
            NSError *error) { 
        if (!error) 
        { 
         if (session.isOpen) 
         { 
          successBlock(); 
         } 
        } 
        else 
        { 
         failureBlock([error description]); 
        } 
       }]; 
    } 
+0

Dzięki @Mike M zaoszczędzisz mi dużo czasu! – sonxurxo

+1

Zalecam sprawdzanie każdej zmiennej dla zer PRZED dodaniem jej do NSMutableDictionary, widziałem awarie z dodawania łańcucha zerowego do pola TokenInformationTokenKey. Zaufałem ACAccountStore, aby dać mi konto Z niezerowym tokenem OAuth, ale to nie zawsze jest prawdą. –

+0

Sugerowałbym, że robi się to przed faktycznym utworzeniem strategii tokena, ponieważ nie powiedzie się to w sposób cichy, jeśli jedna z zmiennych nie jest obecne lub poprawne. Spowoduje to trudniejsze debugowanie niż rozgałęzianie przed wywołaniem kodu. –

0

Czy nie jest to spowodowane tym, że najpierw potrzebujesz uprawnień do odczytu i dopiero wtedy możesz poprosić o inne?

0

Wykonujesz [[FBSession alloc] initWithPermissions:@[@"publish_actions"]], co oznacza, że ​​Twoja sesja prosi o pozwolenie i ma tylko "uprawnienia" dla publish_actions, ale spojrzeć na żeton ze swojego błędu:

com.facebook.sdk:ErrorSessionKey=<FBSession: 0xa2b62a0, state: FBSessionStateOpen, loginHandler: 0xa29e9b0, appID: 131721883664256, urlSchemeSuffix: , tokenCachingStrategy:<FBSessionTokenCachingStrategy: 0xa273f60>, expirationDate: 4001-01-01 00:00:00 +0000, refreshDate: 2013-07-26 16:21:10 +0000, attemptedRefreshDate: 0001-12-30 00:00:00 +0000, permissions:(
    email, 
    "publish_actions" 
) 

token ma już email uprawnienia zbyt. Czy uważasz, że to może być problem?

Spróbuj utworzyć instancję z numerem [[FBSession alloc] initWithPermissions:@[@"publish_actions", @"email"]] i sprawdź, czy nadal występują problemy.

Powiązane problemy