Грешка при валидиране на токена за достъп: Потребителят не е упълномощил приложението. Facebook SDK 4

Ето случая:

Ако преди това съм предоставил разрешения за четене на моето приложение чрез

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));

След това, когато трябва да споделя, искам разрешения за публикуване чрез:

LoginManager.getInstance().logInWithPublishPermissions(getActivity(), Arrays.asList("publish_actions"));

Всичко работи добре, докато не премахнах разрешенията за моето приложение в мрежата.

Ако приложението е било унищожено или спряно и трябва да споделя, ще проверя дали все още имам разрешенията:

if(userAuthorizedMyApp()){
    LoginManager.getInstance().logInWithPublishPermissions(this, Arrays.asList("publish_actions"));
} else {
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));
}

Методът userAuthorizedMyApp() връща false (accessToken null):

private boolean userAuthorizedMyApp() {
    boolean authorized;
    AccessToken accessToken = AccessToken.getCurrentAccessToken();
    if(DEBUG) Log.v(TAG, "accessToken [" + accessToken +"]");

    if(accessToken != null){
        Set<String> currentPermissions = accessToken.getPermissions();
        authorized = currentPermissions.contains("public_profile");
    } else {
        authorized = false;
    }
    if(DEBUG) Log.v(TAG, "userAuthorizedMyApp[" + authorized +"]");

    return authorized;
}

И се опитвам да направя обичайно влизане, сякаш е за първи път:

LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"));

И получавам:

public void onError(FacebookException error)

onError, грешка {HttpStatus: -1, errorCode: 190, errorType: null, errorMessage: Грешка при валидиране на токена за достъп: Потребителят не е упълномощил приложение 123456789123456.}

Някакви идеи какво правя погрешно?


person Danylo Volokh    schedule 23.04.2015    source източник
comment
Когато получите тази грешка, можете ли да опитате да изчистите токена за достъп LoginManager.logout() и да повторите влизането?   -  person Ming Li    schedule 23.04.2015
comment
Всъщност, като извършите същото действие за втори път, всичко работи добре - екранът за влизане се отваря. Но получаването на грешка при първия опит е объркващо за потребителя.   -  person Danylo Volokh    schedule 26.04.2015
comment
Не забравяйте, че токенът за достъп се кешира на клиента, така че освен ако не направите заявка, няма начин да проверите дали все още е валиден. Това, което се случва тук е, че в случай на неуспех вие извиквате loginWithPublishPermissions (по същество искане за допълнителни разрешения, когато вече имате токен), това се проваля, защото потребителят е премахнал приложението. Вторият път (случай на успех) вие извиквате loginWithRead и това се третира като изцяло нова заявка за удостоверяване, която е успешна.   -  person Ming Li    schedule 27.04.2015


Отговори (2)


Просто направете нещо като:

@Override
public void onError(FacebookException error) {
    Timber.e(error, "Error during facebook login");
    AccessToken.setCurrentAccessToken(null);
    LoginManager.getInstance().logInWithReadPermissions(this, Arrays.asList("email"))
}
person Divers    schedule 01.03.2016
comment
Съжалявам за късния отговор: искам да персонализирам това съобщение. drive.google.com/open?id=0B7xjlHVL47MbWVVKY1JSbWJGdk0 - person K.Sopheak; 08.12.2016
comment
Не можете да персонализирате това съобщение - person Divers; 08.12.2016
comment
Значи не можем да го скрием и вместо това да използваме друго съобщение? - person K.Sopheak; 08.12.2016
comment
Можете - превключване на приложението от режим на разработка в производствен режим. - person Divers; 08.12.2016

Обаждането до AccessToken.refreshCurrentAccessTokenAsync() ми свърши работа. Получавам грешката при внедряването на FacebookCallback.onError(), където извиквам AccessToken.refreshCurrentAccessTokenAsync(), което изчиства маркера за достъп във Facebook SDK.

Тъй като това е асинхронно повикване, не мога да извикам loginManager.logInWithReadPermissions() веднага; Няма обратно извикване, така че показвам AlertDialog на потребителя и когато потребителят щракне върху „OK“, по това време извиквам loginManager.logInWithReadPermissions().

Така че потребителското изживяване не е много лошо и е приемливо за edge case.

person bentobox    schedule 06.07.2015