2013-06-17 10 views
16

Nella mia app, sto tentando di autenticare (accesso) passando le informazioni sulla sessione di Facebook (token e data di scadenza) sul mio server.Session.isOpened() == true ma Session.getAccessToken() == ""

mia sequenza di login al server app è come segue:

  1. Diventa sessione facebook attiva.
  2. Se la sessione è valida, ottenere il token e inviarlo al server.

E in codice:

Session session = Session.getActiveSession(); 
if(session != null && session.isOpened() && !didLogin) { 
    didLogin = true; 
    String token = session.getAccessToken(); 
    Date expires = session.getExpirationDate(); 
    loginWithFacebookSession(token, expires); 
} 

ho notato che improvvisamente, dopo alcuni mesi di questo lavoro bene, le informazioni che vengono inviate al server è di tanto in tanto non è valida, in particolare il token è un stringa vuota e expires è una data non valida.

Dopo aver un po 'attraverso l'SDK di Facebook (versione 3.0.1), ho notato quello che probabilmente è alla base del mio errore:

private static final Date MIN_DATE = new Date(Long.MIN_VALUE); 
private static final Date ALREADY_EXPIRED_EXPIRATION_TIME = MIN_DATE; 
private static final Date DEFAULT_LAST_REFRESH_TIME = new Date(); 

static AccessToken createEmptyToken(List<String> permissions) { 
    return new AccessToken("", ALREADY_EXPIRED_EXPIRATION_TIME, permissions, AccessTokenSource.NONE, 
      DEFAULT_LAST_REFRESH_TIME); 
} 

Ciò significa che da qualche parte lungo la strada, il Facebook SDK è la creazione di un token vuoto e restituendolo con un SessionState.Category.OPENED_CATEGORY.

Perché session.isOpened() restituisce true quando in effetti non è disponibile l'informazione accessToken? Dovrei controllare una proprietà diversa? Si tratta di un bug nell'SDK di Facebook?

EDIT:
riferito l'accaduto a Facebook a: https://developers.facebook.com/bugs/121924628017965

+0

Come stai aprendo le sessioni/impostare la sessione attiva? –

+0

Sto usando la classe 'UiLifecycleHelper' come documentata [nel sito web degli sviluppatori di Facebook] (https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/) – thepoosh

+0

Forse dovresti controllare se la sessione è nello stato OPENED_TOKEN_UPDATED, ovvero il token è stato modificato, ma la sessione è ancora in uno stato aperto. – 5agado

risposta

1

A parte l'SDK di Facebook che è come la magia del voodoo, ci sono alcune cose che stai facendo che non faccio nel mio flusso di autenticazione. Presumo qui che il tuo snippet di codice non sia nella funzione Session.StatusCallback call. Qualunque cosa accada, apro sempre la sessione per la lettura prima di accedere al token dal callback. Questa richiesta disturba l'utente per pochi millisecondi con uno spinner di caricamento prima che ritorni. Aiuta anche nel caso in cui l'utente abbia cancellato le autorizzazioni dalla propria pagina delle impostazioni di Facebook.

Il mio flusso di autenticazione è qualcosa di simile:

private void startFbAuth() { 
    Session session = Session.getActiveSession(); 
    if (session == null) { 
     session = new Session(getApplicationContext()); 
     Session.setActiveSession(session); 

     Session.OpenRequest openReadRequest = new Session.OpenRequest(this); 
     openReadRequest.setPermissions(Arrays.asList({ "email" })); 
     openReadRequest.setCallback(statusCallback); 

     Session.NewPermissionsRequest permissionReadRequest = new Session.NewPermissionsRequest(this, Arrays.asList(EMAIL_PERMISSIONS)); 
     permissionReadRequest.setCallback(statusCallback); 

     if (!session.isOpened() && !session.isClosed()) { 
      session.openForRead(openReadRequest); 
     } else { 
      session.requestNewReadPermissions(permissionReadRequest); 
     } 
    } 

    private Session.StatusCallback statusCallback = new SessionStatusCallback(); 

    private class SessionStatusCallback implements Session.StatusCallback { 
     @Override 
     public void call(Session session, SessionState state, Exception exception) { 
      if (session.isClosed()) { 
       session.closeAndClearTokenInformation(); 
       Session.setActiveSession(null); 
       SessionStore.clearFacebookInformation(Activity.this); 
       // Either throw an error or try reconnecting by calling startFbAuth 
      } 
      if (exception != null) { 
       session.closeAndClearTokenInformation(); 
       Session.setActiveSession(session); 
       // Either throw an error or try reconnecting by calling startFbAuth 
      } else { 
       if (session.isOpened()) { 
        String token = session.getAccessToken(); 
        // It shouldn't be null or empty here 
       } 
      } 
     } 
    } 
+0

E se la sessione non è nullo, come nel caso di op ... Non ho punti con questo esempio di codice ... – Renetik

2

Utilizzare questo metodo e controllare se il vostro hash è corretto

public void getHashKeyForFacebook(Activity activity, String packageName){ 
    try{ 
     PackageInfo info = activity.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES); 

     for (Signature signature : info.signatures){ 
       MessageDigest md = MessageDigest.getInstance("SHA"); 
       md.update(signature.toByteArray()); 
       Log.d("KeyHash:", Base64.encodeToString(md.digest(), Base64.DEFAULT)); 
     } 
    } catch (Exception ex){ 

    } 
} 
+0

l'hash della chiave era corretto, questo non risponde a questa domanda ma altri – thepoosh

Problemi correlati