2010-08-31 6 views
13

Я использую Facebook SDK для прошивки в моем приложении: http://github.com/facebook/facebook-ios-sdkкак обновить маркер OAuth при использовании Facebook iPhone SDK

Токен OAuth истекает примерно через 2 часа. Как я могу «обновить» токен oAuth без повторного вызова метода [Facebook authorize ...] - который показывает пустой диалог Facebook, если пользователь ранее вошел в систему? То, что я хочу избежать, требует от пользователя повторного входа в FB каждый раз, когда они используют приложение, скажем, день за днем.

Я уже сохраняю/восстанавливаю токены OAuth, когда приложение выходит/запускается. И я могу проверить, действителен ли токен, используя [Facebook isSessionValid], или проверять время истечения срока действия на токене. Но что делать, если токен истек? Я читал, что можно «обновить» токен, но я не понимаю, как это делается.

Я не хочу запрашивать разрешение «offline_access», которое даст мне токен «навсегда».

Помогите !?

+0

Были ли вы готовы ответить на этот вопрос? –

ответ

3

реализация Facebook по OAuth не поддерживает маркера обновления.

У вас есть 2 вида access_tokens в Facebook. Краткосрочный токен, который задается по умолчанию и долгосрочный токен, который предоставляется, если вы запрашиваете offline_access. Если обновлен токен обновления, он был таким же, как предоставление токена offline_access для всех приложений.

До тех пор, пока у пользователя есть активный сеанс facebook в вашем веб-элементе управления, вы можете запросить новый access_token, просто получив доступ к https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token или, возможно, к какой-либо команде SDK для iOS, которая делает то же самое (никогда не работал с ней, поэтому я не могу сказать). Такой запрос не будет запрашивать у пользователя логин снова, но будет использовать предыдущий сеанс, который был создан во время первого входа.

0

Вобще [[FBSession сессии] резюме], если вернуться ложным делать снова войти в

+2

Это то, что я раньше делал. последний FB SDK на github удалил объект FBSession, и я нигде не вижу метода «возобновления». – TomSwift

0

Facebook IOS SDK не обрабатывает хранения сессии. FBSessionDelegate - это интерфейс обратного вызова, который должно выполнять ваше приложение. его методы будут вызываться при успешном входе в систему или выходе из системы.

Смотрите пример приложения facebook-ios-sdk/sample/DemoApp/Classes/DemoAppViewController.m для fbDidLogin, fbDidNotLogin и fbDidLogout методов

0

Согласно документации Facebook SDK:

The Facebook SDK автоматически обновляет сеанс пользователя, если необходимо. Когда он это делает, состояние также переходит в состояние FBSessionStateOpenTokenExtended.

также для дальнейшего уточнения (с SDK версии 3.1):

В SDK обновляет сеанс автоматически на вызовы API.

Он также обновляет данные маркера по мере необходимости при последующих проверках подлинности или вызовах API Facebook, созданных с использованием SDK.

+0

Да; мой вопрос сейчас несколько лет. С тех пор FBSDK развился довольно много! – TomSwift

+0

Ищет этот ответ, и эта нить подошла, поэтому я подвел итог тому, что я исследовал сам. – lipka

3

Поскольку ни один из этих ответов на самом деле не затронул вопрос, я подробно расскажу о том, как я обновил токен OAuth, используя The Facebook SDK.

SDK автоматически обновит ваши жетоны, когда вы делаете запросы, однако в моем сценарии мы отправляем токены на наши серверы, и нам нужно использовать последний токен. Поэтому, когда наш сервер указывает на то, что нам нужны новые маркеры это то, что мы делаем:

Примечание Вы можете либо передать AppID в FBSession или вы можете добавить FacebookAppID ключ к вашему PLIST App (это то, что мы делаем) ,

- (void)renewFacebookCredentials { 
    if (FBSession.activeSession.state == FBSessionStateOpen || 
     FBSession.activeSession.state == FBSessionStateOpenTokenExtended) { 
     [self sessionStateChanged:[FBSession activeSession] state:[FBSession activeSession].state error:nil]; 
    } else { 
     // Open a session showing the user the login UI 
     // You must ALWAYS ask for public_profile permissions when opening a session 
     [FBSession openActiveSessionWithReadPermissions:@[@"public_profile",@"email"] 
              allowLoginUI:NO 
             completionHandler:^(FBSession *session, FBSessionState state, NSError *error) { 
              //this block will run throughout the lifetime of the app. 
              [self sessionStateChanged:session state:state error:error]; 
             }]; 
    } 
} 

вы можете использовать метод sessionStateChanged:, что Facebook включать в их документации, но упрощенный обработчик выглядит следующим образом:

- (void)sessionStateChanged:(FBSession *)session state:(FBSessionState) state error:(NSError *)error { 
    // If the session was opened successfully 
    NSString *accessToken; 
    if (!error && state == FBSessionStateOpen && [[session accessTokenData] accessToken]){ 
     // Show the user the logged-in UI 

     //@see http://stackoverflow.com/questions/20623728/getting-username-and-profile-picture-from-facebook-ios-7 
     accessToken = [[session accessTokenData] accessToken]; 
     //Now we have an access token, can send this to the server... 
    } else { 
     //No access token, show a dialog or something 
    } 

    //either call a delegate or a completion handler here with the accessToken 
} 

Имейте в виду, что некоторые API вызовов FBSession проверить сродством нить, так что я что мне пришлось обернуть все мои вызовы FBSession внутри dispatch_async(dispatch_get_main_queue(), ^{...

Смежные вопросы