2013-06-17 6 views
16

In meiner App versuche ich mich zu authentifizieren (Login), indem ich Facebook-Sitzungsinformationen (Token und Ablaufdatum) an meinen Server übergebe.Session.isOpened() == true, aber Session.getAccessToken() == ""

Meine Login-Sequenz an den App-Server ist wie folgt:

  1. aktive Facebook-Sitzung Holen.
  2. Wenn die Sitzung gültig ist, Token abrufen und an den Server senden.

Und in Code:

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

Ich habe, dass plötzlich bemerkt, nach ein paar Monaten dieses nur gut arbeiten, werden die Informationen an den Server, eine der token ist speziell gelegentlich nicht gültig gesendet werden leere Zeichenfolge und die expires ist ein ungültiges Datum.

Nach ein wenig durch die Facebook-SDK gehen (Version 3.0.1), entdeckte ich, was wahrscheinlich der Grund meiner Fehler ist:

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

Das bedeutet, dass irgendwo auf dem Weg, die Facebook-SDK ist die Schaffung ein leeres Token und es mit einer SessionState.Category.OPENED_CATEGORY zurückgeben.

Warum gibt session.isOpened()true zurück, obwohl es in der Tat keine accessToken Informationen gibt? Sollte ich eine andere Eigenschaft überprüfen? Ist das ein Fehler in Facebooks SDK?

EDIT:
berichtete dies Facebook unter: https://developers.facebook.com/bugs/121924628017965

+0

Wie werden Sie die Sitzungen Öffnen/die aktive Sitzung einstellen? –

+0

Ich benutze die 'UiLifecycleHelper'-Klasse wie dokumentiert [auf der Facebook-Entwickler-Website] (https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/) – thepoosh

+0

Vielleicht müssen Sie überprüfen, ob Die Sitzung befindet sich im Status OPENED_TOKEN_UPDATED, dh das Token wurde geändert, die Sitzung befindet sich jedoch noch in einem geöffneten Status. – 5agado

Antwort

1

Abgesehen von dem Facebook SDK, das wie Voodoo-Magie ist, gibt es einige Dinge, die du tust, die ich in meinem Authentifizierungsfluss nicht tue. Ich nehme an, dass Ihr Code-Snippet nicht in der Session.StatusCallback-Aufruffunktion ist. Egal was, ich öffne die Sitzung immer zum Lesen, bevor ich vom Callback auf das Token zugreife. Diese Anforderung stört den Benutzer nur für einige Millisekunden mit einem Lade-Spinner, bevor er zurückkehrt. Es hilft auch, wenn der Benutzer die Berechtigungen von seiner Facebook-Einstellungsseite gelöscht hat.

Mein Authentifizierungsablauf ist so etwas wie dieses:

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

Und was, wenn die Sitzung nicht null ist, wie der Fall von op ... Ich bekomme keinen Punkt mit diesem Codebeispiel ... – Renetik

2

Mit dieser Methode können und überprüfen Sie, ob Ihre Hash korrekt ist

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

der Schlüssel Hash war korrekt, das beantwortet diese Frage nicht, sondern andere – thepoosh

Verwandte Themen