8

私はAndroidアプリを開発しています。 Facebookのoffline_accessパーミッションが間もなく廃止されると、私はFacebook APIトークンを拡張するためにGraph APIを使用しようとしています。Androidアプリで更新された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トークンを取得する方法を示す詳細なコードを誰でも提供できますか?

ありがとうございます。

アップデート2:

進捗(と思います)!私はしかし、ベースURLにあるFacebookのリクエストメソッドの結果は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; 

完全なURLを使用して

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

を使用する必要があります{"エラー":{"メッセージ": "アプリケーションの検証エラーです。アプリケーションIDが無効です"、 "タイプ": "OAuthException"、 "コード":190}}

更新1:

これは私が試みたものです。コードは完了します。つまり、listernerの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); 
    } 

は、ここでそれが呼ばれlisternerにonCompleteのある、

//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 

コードが完了... RefreshListenerの私のバージョンですが、応答は新しいアクセストークンまたは有効期限値が含まれていません。私は応答がアクセストークンが含まれないWebブラウザに(英数字の現在のトークン値と)同じURLを入れたときの応答は...

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

です。 Facebookのoffline_access許可月1日に廃止される予定


関連情報

、2012

代わりに)(onResumeでextendAccessTokenIfNeeded機能を使用することをお勧めしないでください。その、それはなぜ私は、グラフAPIトークンさわやか:-)に探しています

関連スタックオーバーフローに関する質問

Is it possible to extend Facebook tokens with extendAccessTokenIfNeeded in an Android app?理由(私の質問)

How would offline_access work after deprecation after May 1st?

あると I am also having trouble

Facebook access token can not be extended

Protecting app secret for extendAccessToken usage (Java/Android)

Facebookは正直に言うと

Facebook Android Tutorial

Facebook offline_access permission deprecation

+0

上記のすべてのリンクで、なぜ詳細情報が必要ですか?あなたはこれを実装するための十分な文書を持っているように見えます。 – Shreeni

+0

あなたは私がそれをうまくいくと思うでしょうが、それはありません。 :-(スタックオーバーフローに関する簡単な質問はすべて、非常に迅速に答えられるので、これは最初のように簡単ではないと思います... – Mel

答えて

7

リンク関連、私は少し困惑している - と、それは簡単です - あなたはそれを成し遂げるためにすべてを持っているように見えます。しかし、あなたの質問に答えるようにしましょう。助け、およびJavaにこれを翻訳することは簡単です

string currentToken = "token from somewhere"; 

// WebClient is used to send GET request to the given URL 
// and receive the response 
using (var req = new System.Net.WebClient()) 
{ 
    // create URL string and fill it in with data (app Id, secret, and current token) 
    var extendTokenUrl = string.Format(
     "https://graph.facebook.com/oauth/access_token?client_id={0}&client_secret={1}&grant_type=fb_exchange_token&fb_exchange_token={2}", 
     FB_APP_ID, 
     FB_APP_SECRET, 
     currentToken); 

    // send GET request and download the response 
    var response = req.DownloadString(extendTokenUrl); 

    // if all is good, response will be a string which looks like this: 
    // access_token=<<THE TOKEN GOES HERE>> 
    var newToken = response.Substring("access_token=".Length); 

    // now save newToken in your DB INSTEAD of currentToken - 
    // so all calls will be made with extended token 
    SaveTokenInDB(newToken); 
} 

希望:ここでは、C#の言語とクラスに精通していない場合には、私は私のコメントでのアプリのトークンを拡張し、私のC#プロジェクトからのコードがあります。

+0

私は自分自身を混乱させています!簡単な作業は、Androidの開発者から何の反応も得られていません - 100ポイントの賞金を払っても!Facebookの回答にアクセスキーが含まれていないという問題があります。 – Mel

+0

すぐにRefreshListenerでJSONを解析していることに気がつきましたが、間違っています.JSONを元に戻すのではなく、生の文字列だけを取得しています。 "String refreshUrl"の値をブラウザに貼り付けると、適切なトークンが得られますか?POSTの代わりにGETリクエストをしていることを100%確信していますか?また、AsyncFacebookRunnerのソースがありますか? HTTPリクエストを送信し、正確なURLを記録する、HTTPメソッドがありますか?また、AsyncFacebookRunnerを使用せず、標準のHTTPリクエストコンポーネントだけを使用する場合は動作しますか? – avs099

+0

ありがとうございます、私は進歩しています... SDKのUtil.javaコード(実際にはhttpリクエストを行うクラス)のコードを変更すると、ブラウザーにアドレスを入力するのと同じ応答を得るようになります。しかし、私は現在、有効期限が非常に小さいことを認識しています(5143168)。私は図をリフレッシュするとき常に減少します...これに関する任意のアイデア?レスポンスの例... access_token = AAAEparERUxABAFSPLEI8VNAwo8FLsxOpR6bZAgyeRxj0JAtGBBqMv5y3gnMkvy0TMCrnKuF0Jp6S1DSpiO8ZZZ&expires = 5143168 – Mel

関連する問題