Какой код используется для получения обновленного токена Facebook в приложении для Android?

Я разрабатываю приложение для Android. В связи с предстоящим устареванием разрешения Facebook offline_access я пытаюсь использовать Graph API для расширения токена Facebook.

        https://graph.facebook.com/oauth/access_token?             
        client_id=APP_ID&
        client_secret=APP_SECRET&
        grant_type=fb_exchange_token&
        fb_exchange_token=EXISTING_ACCESS_TOKEN

Может ли кто-нибудь предоставить подробный код, демонстрирующий, как внедрить приведенный выше код в приложение для Android и получить обновленный токен Facebook?

Спасибо за ваше время.

Второе обновление:

Прогресс (кажется)!

Использование полного URL-адреса с методом запроса facebook приводит к тому, что базовый URL-адрес добавляется в начало URL-адреса. Поэтому вместо

String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken;

следует использовать

String refreshUrl = "oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken;

. Однако теперь я получаю ответ {"error":{"message":"Ошибка проверки приложения. Недопустимый идентификатор приложения.","type":"OAuthException","code" :190}}

Обновление первое:

Вот что я пробовал. Код завершается, то есть вызывается OnComplete на листере, НО ответ не содержит нового токена доступа или значения истечения срока действия.

    void refreshWithGraph() {
        AsyncFacebookRunner extendingAsyncRunner = new AsyncFacebookRunner(facebook);
        Bundle parameters = new Bundle();

        //the variable currentAccessToken is obtained after authorisation is complete using currentAccessToken = facebook.getAccessToken();

        String refreshUrl = "https://graph.facebook.com/oauth/access_token?client_id=12345678910&client_secret=abcdefghijklmnopqrstuvwxyz&grant_type=fb_exchange_token&fb_exchange_token="+currentAccessToken;


    extendingAsyncRunner.request(refreshUrl, parameters, new RefreshListener(), null );
   }

Вот моя версия RefreshListener...

  //REFRESH LISTENER
    public class RefreshListener extends BaseRequestListener {

        public void onComplete(final String response, Object state) {


            try {
               final JSONObject json = Util.parseJson(response);

                runOnUiThread(new Runnable() {

                    @Override
                    public void run() {             
                        tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE\nResponse is " + response);
                        tvRefreshToken.setText("IN REFRESH LISTENER ONCOMPLETE\nToken is " + facebook.getAccessToken());
                        tvRefreshExpiry.setText("IN REFRESH LISTENER ONCOMPLETE\nFacebook expiry is " + millisecToDate(facebook.getAccessExpires()));

                    }

                }); //end runOnUiThread



            } catch (JSONException e) {
                runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT JSON EXCEPTION \nResponse is " + response);

                            }

                         }); //end runOnUiThread

            } catch (FacebookError fe) {
                runOnUiThread(new Runnable() {


                            @Override
                            public void run() {
                                tvRefreshResponse.setText("IN REFRESH LISTENER ONCOMPLETE CAUGHT FACEBOOK ERROR \nResponse is " + response);

                            }

                         }); //end runOnUiThread
            } //end catch Facebook error

        }  //end onComplete


        @Override
        public void onIOException(IOException e, Object state) {
            tvRefreshResponse.setText("IN REFRESH LISTENER IOEXCEPTION \nException is "+ e.getLocalizedMessage());

        }

        @Override
        public void onFileNotFoundException(FileNotFoundException e, Object state) {
            tvRefreshResponse.setText("IN REFRESH LISTENER FILE NOT FOUND EXCEPTION \nException is "+ e.getLocalizedMessage());
        }

        @Override
        public void onMalformedURLException(MalformedURLException e, Object state) {
            tvRefreshResponse.setText("IN REFRESH MALFORMED URL \nException is "+ e.getLocalizedMessage());

        }

        @Override
        public void onFacebookError(FacebookError e, Object state) {
            tvRefreshResponse.setText("IN REFRESH ONFACEBOOK ERROR \nException is "+ e.getLocalizedMessage());

        }
    } //end RefreshListener

Код завершается, то есть вызывается OnComplete на листере, НО ответ не содержит нового маркера доступа или значения истечения срока действия. Ответ:...

 {"id":"https:\/\/graph.facebook.com\/oauth\/access_token","shares":78,"comments":1}

Когда я помещаю тот же URL-адрес (с буквенно-цифровым текущим значением маркера) в веб-браузер, ответ ДЕЙСТВИТЕЛЬНО включает маркер доступа.


Связанная информация

Разрешение Facebook offline_access будет прекращено 1 мая 2012 г.

Пожалуйста, не предлагайте вместо этого использовать функцию extendAccessTokenIfNeeded в onResume(). У меня также возникают проблемыс этим, и именно по этой причине я изучаю обновление токена Graph API :-)

Связанные вопросы о переполнении стека

Можно ли расширить токены Facebook с помощью extendAccessTokenIfNeeded в приложении для Android?(мой вопрос)

Как будет работать offline_access после устаревания после 1 мая?

Токен доступа Facebook не может быть расширен

Защита секрета приложения для использования extendAccessToken (Java/Android)

Соответствующие ссылки Facebook

Учебник Facebook Android

Устаревание разрешений Facebook offline_access

8
задан Community 23 May 2017 в 12:34
поделиться