2010-08-31 5 views
13

J'utilise le SDK Facebook pour iOS dans mon application: http://github.com/facebook/facebook-ios-sdkcomment actualiser un jeton OAuth lorsque vous utilisez l'iPhone SDK Facebook

Le jeton oAuth expire après environ 2 heures. Comment puis-je "actualiser" le jeton oAuth sans avoir à rappeler la méthode [Facebook authorize ...] - ce qui affiche brièvement une boîte de dialogue Facebook vide si l'utilisateur s'était déjà connecté? Ce que je veux éviter, c'est d'obliger l'utilisateur à se reconnecter à FB chaque fois qu'il utilise l'application - disons, au jour le jour.

Je sauvegarde/restaure déjà des jetons oAuth lorsque l'application quitte/démarre. Et je peux vérifier si le jeton est valide en utilisant [Facebook isSessionValid], ou en vérifiant l'heure d'expiration sur le jeton. Mais que faire si le jeton a expiré? J'ai lu qu'il est possible de "rafraîchir" le jeton, mais je ne comprends pas comment cela est fait.

Je ne souhaite pas demander l'autorisation "offline_access", ce qui me donnerait un jeton "forever".

Aide !?

+0

Avez-vous trouvé une réponse à cela? –

Répondre

3

la mise en œuvre de Facebook de OAuth ne prend pas en charge l'actualisation du jeton.

Vous avez 2 types de access_tokens dans Facebook. Jeton à court terme, qui est donné par défaut et un jeton à long terme qui est donné si vous demandez offline_access. Si le jeton d'actualisation était pris en charge, c'était comme si vous donniez un jeton offline_access pour toutes les applications. Tant que l'utilisateur a une session facebook active sur votre contrôle web, vous pouvez demander un nouveau access_token simplement en accédant à https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token ou probablement à une commande iOS SDK qui fait la même chose (jamais travaillé avec ça donc je ne peux pas dire). Ce type de requête ne demandera pas à l'utilisateur de se reconnecter, mais utilisera la session précédente créée lors de la première connexion.

0

Il suffit de faire [[session FBSession] CV] si elle return false do se connecter à nouveau

+2

c'est ce que je faisais. le dernier FB SDK sur github a supprimé l'objet FBSession, et je ne vois aucune méthode "resume" nulle part. – TomSwift

0

Facebook iOS SDK ne gère pas le stockage de session. FBSessionDelegate est une interface de rappel que votre application doit implémenter. ses méthodes seront invoquées lors de la connexion ou de la déconnexion réussie de l'application.

Voir l'exemple d'application facebook-ios-sdk/sample/DemoApp/Classes/DemoAppViewController.m pour fbDidLogin, fbDidNotLogin et fbDidLogout méthodes

0

Selon la documentation SDK Facebook:

Le SDK Facebook actualise automatiquement la session de l'utilisateur si nécessaire . Lorsqu'il le fait, l'état passe également à l'état FBSessionStateOpenTokenExtended.

également de préciser davantage (depuis la version SDK 3.1):

Le SDK rafraichit automatiquement la session sur les appels API.

Il actualise également les données de jeton si nécessaire lors de l'authentification de suivi ou des appels d'API Facebook effectués à l'aide du SDK.

+0

Yep; Ma question a quelques années maintenant. Le FBSDK a beaucoup évolué depuis lors! – TomSwift

+0

Était la recherche de cette réponse et ce sujet SO est venu, donc j'ai résumé ce que je me suis renseigné. – lipka

3

Étant donné qu'aucune de ces réponses ne répondait réellement à la question, je vais détailler comment j'ai implémenté l'actualisation de jeton OAuth à l'aide de Facebook SDK.

Le SDK actualisera automatiquement vos jetons lorsque vous ferez des requêtes. Dans mon scénario, nous envoyons les jetons à nos serveurs et nous devons utiliser le dernier jeton. Ainsi, lorsque notre serveur indique que nous avons besoin de nouveaux jetons c'est ce que nous faisons:

Remarque Vous pouvez passer le AppID dans le FBSession ou vous pouvez ajouter la FacebookAppID clé de votre plist de App (ce qui est ce que nous faisons) .

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

Le vous pouvez utiliser la méthode sessionStateChanged: que Facebook inclure dans leur documentation, mais un gestionnaire simplifié ressemble à ceci:

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

Soyez conscient que certains des appels API FBSession vérifier l'affinité de fil, donc je trouvé que je devais emballer tous mes appels FBSession à l'intérieur d'un dispatch_async(dispatch_get_main_queue(), ^{...