Facebook Graph Api OAuthException, но токен доступа действителен

У меня проблема, и я не знаю, почему, я надеюсь, что вы могли бы мне помочь!

Я разрабатываю приложение для Android, которое использует API-интерфейс facebook. Он использует разрешение на чтение «user_likes». Когда я делаю этот запрос: "мне/нравится", все работает нормально. Но когда я делаю это: me/likes?fields=events{cover},name

Я получаю OAuthException. errorMessage: для запроса информации о текущем пользователе необходимо использовать активный токен доступа

В заключении:

  1. Я получаю действительный токен доступа со всеми необходимыми разрешениями.
  2. Я являюсь администратором своего приложения, поэтому политика конфиденциальности Facebook не должна играть никакой роли!
  3. Запрос

мне/нравится

работает, но

мне/нравится?поля=события

не работает!

Ответ я получаю:

{Ответ: responseCode: 400, graphObject: null, error: {HttpStatus: 400, errorCode: 2500, errorType: OAuthException, errorMessage: для запроса информации о текущем пользователе необходимо использовать токен активного доступа.}, isFromCache:false}

Итак, я отладил свой токен доступа:

Выпущено: 1420803216 (4 часа назад)

Истекает: 1425987216 (примерно через 2 месяца)

Действительный: правда

Происхождение: Мобильная сеть Faceweb

Области: public_profile, basic_info, электронная почта, user_birthday, user_location, user_likes, user_friends


Я действительно не понимаю, почему мой токен доступа имеет так много областей действия? Я только что установил "user_likes"!

loginBtn.setReadPermissions(Arrays.asList("user_likes"));

Это мой код:

 private LoginButton loginBtn;
    private TextView username;
    private UiLifecycleHelper uiHelper;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        uiHelper = new UiLifecycleHelper(this, statusCallback);
        uiHelper.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

        username = (TextView) findViewById(R.id.username);
        loginBtn = (LoginButton) findViewById(R.id.fb_login_button);
        loginBtn.setReadPermissions(Arrays.asList("user_likes"));
        loginBtn.setUserInfoChangedCallback(new UserInfoChangedCallback() {
            public void onUserInfoFetched(GraphUser user) {
                if (user != null) {
                    username.setText("You are currently logged in as "
                            + user.getName());
                } else {
                    username.setText("You are not logged in.");
                }
            }
        });
    }

    private Session.StatusCallback statusCallback = new Session.StatusCallback() {
        public void call(Session session, SessionState state,
                Exception exception) {
            if (state.isOpened()) {
                Log.d("MainActivity", "Facebook session opened.");
            } else if (state.isClosed()) {
                Log.d("MainActivity", "Facebook session closed.");
            }
        }
    };

    @Override
    public void onResume() {
        super.onResume();
        Session session = Session.getActiveSession();
        if (session != null && (session.isOpened() || session.isClosed())) {
            onSessionStateChange(session, session.getState(), null);
        }
        uiHelper.onResume();
    }

    private void onSessionStateChange(final Session session,
            SessionState state, Exception exception) {

        if (state.isOpened()) {
            // userInfoTextView.setVisibility(View.VISIBLE);
            String token = session.getAccessToken();
            Log.d("SESSION_TOKEN", token);
            new Request(session, "me/likes?fields=events", null, HttpMethod.GET,
                    new Request.Callback() {
                        public void onCompleted(Response response) {
                            Log.i("INFO", response.toString());
                            // new
                            // GetResponses(userInfoTextView).execute(response);
                        }
                    }).executeAsync();

        } else if (state.isClosed()) {
            // userInfoTextView.setVisibility(View.INVISIBLE);
        }
    }

Что я делаю неправильно? Я предполагаю, что что-то с моей сессией или запросом разрешения не так... надеюсь, кто-нибудь может мне помочь!

с уважением Кристоф




Ответы (2)


Это связано с тем, что в Facebook SDK для Android вы должны передавать дополнительные параметры как Bundle.

Итак, в вашем случае вы должны вызывать объект Graph следующим образом:

Bundle bundle = new Bundle();
bundle.putString("fields", "events");

new GraphRequest(AccessToken.getCurrentAccessToken(), "me/likes", bundle, HttpMethod.GET, new GraphRequest.Callback() {
    public void onCompleted(GraphResponse response) {
        // Your stuff here
    }
}).executeAsync();
person Luca Fagioli    schedule 26.07.2015

Вызов API кажется правильным и работает в API Explorer. Единственным логическим объяснением ошибки является то, что токен доступа недействителен.

Поместите токен в отладчик и посмотрите, действителен ли он и доступен ли user_likes: https://developers.facebook.com/tools/debug/

person luschn    schedule 09.01.2015
comment
Уже сделано... срок действия истекает примерно через 2 месяца, он действителен и все разрешения доступны! Области видимости public_profile, user_birthday, user_location, user_likes, user_events - person user3490546; 09.01.2015
comment
тогда вы не используете токен доступа в вызове, это было бы единственным объяснением, поскольку он отлично работает в проводнике API. - person luschn; 09.01.2015
comment
Я попробовал токен доступа из приложения для Android в графическом обозревателе, и это сработало! Но когда я делаю тот же запрос в приложении для Android, я всегда получаю сообщение об ошибке. скриншот - person user3490546; 10.01.2015
comment
@luschn - я столкнулся с аналогичной проблемой, когда я создаю веб-приложение для страниц facebook с помощью JavaScript SDK, и хотя я запросил список сообщений, отправленных моей страницей, и у меня был действительный токен доступа к странице с соответствующим разрешением publish_pages, публикация сообщения поскольку страница потерпит неудачу... пока я не передам access_token в вызов POST FB.api("/page_id/feed", "post", {message: message, access_token: page_access_token}, callback_handler(response){}) - person afsheenirani; 28.11.2016