2013-06-17 3 views
16

В моем приложении я пытаюсь пройти аутентификацию (логин), передавая информацию о сеансе Facebook (токен и срок действия) на мой сервер.Session.isOpened() == true, но Session.getAccessToken() == ""

Моя последовательность Войти на сервер приложений выглядит следующим образом:

  1. Получить активный сеанс facebook.
  2. Если сеанс действителен, получите токен и отправьте его на сервер.

И в коде:

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

Я заметил, что вдруг, через несколько месяцев это работает просто отлично, информация отправляется на сервер иногда не действует, в частности, token является пустая строка, а expires - недопустимая дата.

Пройдя немного через SDK Facebook (версия 3.0.1), я заметил, что, вероятно, является основой моей ошибки:

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

Это означает, что где-то по пути, то Facebook SDK создает пустой токен и возврат его с помощью SessionState.Category.OPENED_CATEGORY.

Почему session.isOpened() возвращение true, когда на самом деле нет accessToken информации? Должен ли я проверять другое свойство? Это ошибка в SDK для Facebook?

EDIT:
Сообщил это Facebook по адресу: https://developers.facebook.com/bugs/121924628017965

+0

Как вы открытия сессии/установка активного сеанса? –

+0

Я использую класс 'UiLifecycleHelper', как описано [на веб-сайте разработчиков Facebook] (https://developers.facebook.com/docs/tutorials/androidsdk/3.0/scrumptious/authenticate/) – thepoosh

+0

Возможно, вам нужно проверить, сеанс находится в состоянии OPENED_TOKEN_UPDATED, то есть токен изменился, но сеанс все еще находится в открытом состоянии. – 5agado

ответ

0

Я решил проблему. Проблема была в ключевом Хэше.

Следуйте этому руководству

Перейти к шагу нет. 4 Запустите образцы.

, наконец, вы найдете раздел «Поиск и устранение неисправностей», и это решение.

Спасибо! https://developers.facebook.com/docs/getting-started/facebook-sdk-for-android/3.0/

+0

он не имеет ничего общего с хэш-ключом. приложение в порядке, это телефон, приложение SDK. – thepoosh

1

Помимо Facebook SDK, подобный магии вуду, есть кое-что, что вы делаете, чего я не делаю в своем потоке auth. Я предполагаю, что ваш фрагмент кода не находится в функции вызова Session.StatusCallback. Независимо от того, я всегда открываю сеанс для чтения, прежде чем обращаться к токену из обратного вызова. Этот запрос просто неудобно для пользователя в течение нескольких миллисекунд с загрузчиком, прежде чем он вернется. Это также помогает в случае, если пользователь удалил разрешения со своей страницы настроек Facebook.

Мой Auth поток что-то вроде этого:

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

И что, если сессия не является нулевой, как случай с операцией ... Я не получаю точку с этим примером кода ... – Renetik

2

Используйте этот метод, и проверить, если ваш хэш правильно

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

ключевой хэш был верным, это не отвечает на этот вопрос, но другие – thepoosh