2010-08-31 14 views
13

estoy usando el SDK de Facebook para iOS en mi aplicación: http://github.com/facebook/facebook-ios-sdkcómo actualizar un token OAuth cuando se utiliza el SDK de Facebook iPhone

El token OAuth expira después de aproximadamente 2 horas. ¿Cómo puedo "actualizar" el token oAuth sin tener que volver a llamar al método [autorizar de Facebook ...], que muestra un diálogo de Facebook vacío brevemente si el usuario había iniciado sesión anteriormente? Lo que quiero evitar es que el usuario vuelva a iniciar sesión en FB cada vez que usa la aplicación, por ejemplo, día a día.

Ya estoy guardando/restaurando tokens de OAuth cuando la aplicación sale/comienza. Y puedo verificar si el token es válido usando [Facebook isSessionValid], o verificando el tiempo de caducidad en el token. ¿Pero qué hacer si el token ha caducado? He leído que es posible "actualizar" el token, pero no entiendo cómo se hace esto.

No deseo solicitar el permiso "acceso_externo", que me daría un token "para siempre".

¡Ayuda !?

+0

¿Habría sido capaz de encontrar una respuesta a esto? –

Respuesta

3

implementación de OAuth de Facebook no admite la actualización de fichas.

Tiene 2 tipos de access_tokens en Facebook. Token a corto plazo, que se otorga por defecto y un token a largo plazo que se otorga si solicita offline_access. Si el token de actualización era compatible, era lo mismo que dar un token offline_access para todas las aplicaciones.

Mientras el usuario tenga una sesión de Facebook activa en su control web, puede solicitar un nuevo access_token simplemente accediendo al https://www.facebook.com/dialog/oauth?client_id=YOUR_APP_ID&redirect_uri=http://www.facebook.com/connect/login_success.html&response_type=token o probablemente algún comando iOS SDK que haga lo mismo (nunca funcionó con él, así que no puedo) Este tipo de solicitud no le pedirá al usuario que vuelva a iniciar sesión, sino que usará la sesión anterior que se creó durante el primer inicio de sesión.

0

Eso sí, [sesión de FBSession [] curriculum vitae] si return false hacer ingresar nuevamente

+2

esto es lo que solía hacer. el último SDK de FB en github eliminó el objeto de FBSession, y no veo ningún método de "reanudación" en ninguna parte. – TomSwift

0

Facebook iOS SDK no controla el almacenamiento de sesión. FBSessionDelegate es una interfaz de devolución de llamada que su aplicación debe implementar. sus métodos se invocarán en el inicio de sesión o cierre de sesión de la aplicación.

Véase el ejemplo de aplicación facebook-ios-sdk/sample/DemoApp/Classes/DemoAppViewController.m para fbDidLogin, fbDidNotLogin y fbDidLogout métodos

0

De acuerdo con la documentación del SDK de Facebook:

El SDK de Facebook se actualiza automáticamente la sesión del usuario si necesario. Cuando hace esto, el estado también pasa al estado FBSessionStateOpenTokenExtended.

también para aclarar aún más (desde la versión 3.1 del SDK):

El SDK se actualiza la sesión automáticamente en llamadas a la API.

También actualiza los datos del token según sea necesario cuando la autenticación de seguimiento o las llamadas a la API de Facebook se realizan con el SDK.

+0

Sí; mi pregunta tiene algunos años ahora. ¡El FBSDK ha evolucionado bastante desde entonces! – TomSwift

+0

Estaba buscando esta respuesta y surgió este SO, así que resumí lo que investigué a mí mismo. – lipka

3

Dado que ninguna de estas respuestas en realidad aborda la pregunta, voy a detallar cómo he implementado la actualización de tokens de OAuth usando The Facebook SDK.

El SDK actualizará automáticamente sus tokens cuando realice solicitudes, sin embargo, en mi caso, enviamos los tokens a nuestros servidores y necesitamos usar el último token. Por eso, cuando nuestro servidor indica que necesitamos nuevas fichas de esto es lo que hacemos:

Nota Puede pasar el AppID en el FBSession o puede agregar la clave FacebookAppID a su plist de aplicación (esto es lo que hacemos) .

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

La puedes usar el método sessionStateChanged: que Facebook incluir en su documentación pero un encargado simplificada se ve así:

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

Tenga en cuenta que algunas de las llamadas a la API FBSession comprobar si hay afinidad hilo por lo que descubrí que tenía que envolver todas mis llamadas de FBSession dentro de un dispatch_async(dispatch_get_main_queue(), ^{...

Cuestiones relacionadas