2013-06-17 17 views
16

Uygulamamda, Facebook oturum bilgilerini (jeton ve son kullanma tarihi) sunucumdan geçirerek kimlik doğrulamayı (oturum açma) deniyorum.Session.isOpened() == true ama Session.getAccessToken() == ""

  1. aktif facebook oturumu alma şöyledir: Uygulamanın sunucuya

    Benim giriş dizisidir.

  2. Oturum geçerliyse, jetonu alın ve sunucuya gönderin.

Ve kodunda:

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

Ben özellikle token bir olduğunu, aniden, sadece iyi çalışıyor bu bir kaç ay sonra, bilgi sunucusuna gönderiliyor olduğu zaman geçerli değildir fark etmiş boş dize ve expires geçersiz bir tarih.

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

Bu arada bir yerlerde, Facebook SDK yaratıyor anlamına gelir:

Facebook SDK üzerinden (versiyon 3.0.1) biraz gittikten sonra, herhalde benim hata temelinin ne benekli boş bir jeton ve SessionState.Category.OPENED_CATEGORY ile döndürme.

Gerçekte bilgi yokken neden true döndürüyor? Farklı bir mülk kontrol etmeli miyim? Bu Facebook'un SDK'sında bir hata mı?

DÜZENLEME: at Facebook'a bu Bildirilen
: https://developers.facebook.com/bugs/121924628017965

+0

nasıl aktif oturumu ayarı/oturumları açıyoruz doğru olup olmadığını kontrol? –

+0

"UiLifecycleHelper" sınıfını [Facebook geliştiricileri web sitesinde] belgelenmiş şekilde kullanıyorum (https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/) – thepoosh

+0

Belki de oturum OPENED_TOKEN_UPDATED durumunda, bu simge değişti, ancak oturum hala açık durumda. – 5agado

cevap

1

Facebook SDK'sı voodoo sihri gibi olmanın dışında, benim yaptığım şey benim hain akışımda yapmadığım bir şey var. Burada kod snippet'inizin Session.StatusCallback çağrısı işlevinde olmadığını varsayalım. Ne olursa olsun, her zaman geri aramadan belirtiye erişmeden önce okumak için oturumu açın. Bu istek, kullanıcı döndürmeden önce bir yükleme döndürücü ile birkaç milisaniye için sadece sakıncaya neden olur. Ayrıca, kullanıcının Facebook ayarları sayfasından izinleri silmesi durumunda da yardımcı olur.

Benim auth akışı böyle bir şeydir:

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

Ve eğer oturum null değilse, op'in durumu gibi ... Bu kod örneğini almıyorum ... – Renetik

2

bu yöntemi kullanın ve karma

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

anahtar karması doğruydu, bu soruya cevap vermiyor ama diğerleri – thepoosh