Подтвердить что ты не робот

Facebook SDK 3.1 - Ошибка проверки маркера доступа

Я пытаюсь перевести свое приложение в новый Facebook SDK 3.1 (с поддержкой проверки подлинности iOS6).

У меня было все нормально, поэтому я решил удалить приложение из своего списка авторизованных приложений на веб-сайте FB, чтобы проверить, что iOS снова попросит разрешения.

Теперь мой первый вызов [FBRequest requestForMe] вызывает эту ошибку:

Ответ:

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

Некоторые сведения:

Я пытаюсь открыть сеанс следующим образом:

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

Затем я получаю обратный вызов в состоянии FBSessionStateOpen (на данный момент iOS не представила диалоговое окно запроса, это следует ожидать)? Facebook регистрирует это:

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 

Как только сеанс открыт, в presentPostOptions я делаю это:

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

Прежде чем вызывается предыдущий блок завершения, мой блок обработчика основного состояния вызывается с состоянием FBSessionStateClosed. Тем временем, в SDK Facebook зарегистрирована ошибка выше.

Я не могу найти способ reset системы; и я действительно не понимаю причину.

Кто-нибудь может пролить свет?

4b9b3361

Ответ 1

Учетная запись Facebook на устройстве перестала синхронизироваться с сервером, а также с кешем App/SDK. Это можно решить, вызвав метод ACAccountStore renewCredentialsForAccount, который обновит ОС понимание состояния токена.

В следующем обновлении SDK SDK автоматически вызовет этот API, когда получит ответ от сервера, указав, что токен стал недействительным. Для версии SDK 3.1.0 приложениям необходимо будет явно вызвать этот API. Вот пример кода:

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

            }
        }];
    }
}

Существует несколько вариантов того, где/когда вызывать API. Простейшим местом было бы оппортунистически сделать вызов при запуске приложения или при загрузке вида. Одна из проблем с этим подходом заключается в том, что это вызовет круговую поездку в сеть, которая часто не нужна. Другой вариант - вызвать его, когда происходит уведомление о смене сеанса, что указывает на закрытие сеанса. Также многие приложения получают некоторую базовую информацию, такую ​​как graph.facebook.com/me, во время запуска приложения, и если это так - вызов этого метода в случае ответа об ошибке может быть разумным местом, чтобы попросить iOS обновить его токен положение дел.

Надеюсь, это поможет!

Ответ 2

Я просто собираюсь внести еще одну вещь, чтобы проверить, что заставило меня потратить 3 часа: Убедитесь, что в настройках вашего приложения FB нет опции "Песочница", если вы пытаетесь войти в систему с пользователем FB без приложения-разработчика... Возможно, очевидно, но можно сэкономить несколько часов, надеюсь.

Ответ 4

Я уверен, что это ошибка SDK для iOS для Facebook (даже на 3.1.1), и я подал этот отчет об ошибках.

При попытке воспроизвести эту ошибку с помощью своего примерного приложения Scrumptious, я обнаружил, что он позволяет успешно повторить авторизацию, если вы используете openActiveSessionWithReadPermissions. Однако, если вы запрашиваете разрешения на публикацию через openActiveSessionWithPublishPermissions, он будет застревать в com.facebook.sdk.error 5.

Ответ 5

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

      }];   

Ответ 6

В facebook SDK 3.7.1 У меня все еще была эта проблема. В основном я решил очистить токен от кеша facebook, когда это произойдет. Вот так:

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

Ответ 7

Простое решение Swift 2+ для Facebook Ошибка проверки маркера доступа

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

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

// ...

}

Если эта ошибка возникает, вам нужно создать новый сеанс Facebook, поэтому вам нужно снова войти в систему.