8

Tôi đang phát triển một ứng dụng Android. Với việc không còn sử dụng quyền truy cập offline_access của Facebook, tôi đang cố sử dụng Graph API để mở rộng mã thông báo Facebook.Mã để nhận mã thông báo Facebook được làm mới trong ứng dụng Android là gì?

 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 

Có thể cung cấp mã chi tiết thể hiện cách triển khai mã ở trên vào ứng dụng Android và nhận mã thông báo Facebook được làm mới không?

Cảm ơn bạn đã dành thời gian.

Cập nhật thứ hai:

Progress (tôi nghĩ)!

Sử dụng URL đầy đủ với phương pháp kết quả facebook yêu cầu trong URL cơ sở được thêm vào đầu của URL Vì vậy, thay vì

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

nên sử dụng

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

Tuy nhiên tôi bây giờ nhận được phản hồi {"lỗi": {"nội dung": "Lỗi xác thực ứng dụng. ID ứng dụng không hợp lệ", "type": "OAuthException", "code": 190}}

Cập nhật một:

Đây là những gì tôi đã thử. Mã hoàn thành, đó là OnComplete trên listerner được gọi, NHƯNG phản hồi không chứa một mã thông báo truy cập mới hoặc giá trị hết hạn.

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

Đây là phiên bản của tôi về 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 

Mã này hoàn tất, đó là onComplete trên listerner được gọi, NHƯNG phản ứng không chứa một truy cập mới giá trị thẻ hoặc hết hạn. Câu trả lời là ...

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

Khi tôi đặt cùng một URL (với giá trị mã thông báo hiện tại chữ và số) vào trình duyệt web, câu trả lời CÓ bao gồm mã thông báo truy cập.


liên quan Thông tin

phép offline_access Facebook sẽ bị phản đối trên 01 tháng 5 năm 2012

Xin đừng đề nghị sử dụng các chức năng extendAccessTokenIfNeeded trong onResume() để thay thế.I am also having trouble với điều đó và đó là lý do tại sao tôi đang tìm kiếm vào Graph API :-) làm mới thẻ

liên quan Stack Overflow câu hỏi

Is it possible to extend Facebook tokens with extendAccessTokenIfNeeded in an Android app? (câu hỏi của tôi)

How would offline_access work after deprecation after May 1st?

Facebook access token can not be extended

Protecting app secret for extendAccessToken usage (Java/Android)

liên quan Facebook liên kết

Facebook Android Tutorial

Facebook offline_access permission deprecation

+0

Với tất cả các liên kết ở trên, tại sao bạn cần thêm thông tin chi tiết? Có vẻ như bạn có đủ tài liệu để thực hiện điều này .. – Shreeni

+0

Bạn nghĩ tôi có thể làm việc đó, nhưng không. :-(Tất cả các câu hỏi dễ dàng trên Stack Overflow nhận được trả lời đầy đủ rất nhanh chóng vì vậy tôi đoán điều này là không dễ dàng như nó có vẻ đầu tiên ... – Mel

Trả lời

7

Thành thật mà nói, tôi là một chút bối rối - có vẻ như bạn có tất cả mọi thứ để làm cho nó thực hiện - và nó đơn giản . Nhưng hãy để tôi cố gắng trả lời câu hỏi của bạn. Đây là đoạn mã từ dự án # C của tôi, nơi tôi mở rộng thẻ ứng dụng với ý kiến ​​của tôi trong trường hợp bạn không quen thuộc với C# ngôn ngữ và các lớp:

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

hy vọng rằng sẽ giúp, và dịch này vào Java nên đơn giản.

+0

Hi cảm ơn bạn đã trả lời của bạn Tôi bối rối bản thân mình! một nhiệm vụ dễ dàng là không nhận được bất kỳ phản hồi nào từ các nhà phát triển Android - ngay cả với tiền thưởng 100 điểm! Vấn đề mã hóa của tôi là phản hồi từ Facebook không chứa khóa truy cập. Tuy nhiên, khi tôi chỉ đặt toàn bộ URL vào trình duyệt, tôi nhận được Tôi đã cập nhật câu trả lời của mình để bao gồm các nỗ lực trước đó của tôi – Mel

+0

Tôi nhận thấy ngay lập tức rằng bạn phân tích cú pháp JSON trong Trình làm mới của bạn - nhưng điều đó sai, tôi tin rằng bạn không nhận được JSON nhưng chỉ là một chuỗi thô. bạn dán giá trị của "String refreshUrl" trong trình duyệt, bạn sẽ nhận được đúng token? Bạn có chắc chắn 100% bạn đang làm GET request (thay vì POST)? Ngoài ra - bạn có nguồn cho AsyncFacebookRunner? bạn có thể tìm ra WHERE nó thực sự không? gửi yêu cầu HTTP - và ghi lại URL chính xác , Phương pháp HTTP ở đó? Ngoài ra - nếu bạn KHÔNG sử dụng AsyncFacebookRunner nhưng chỉ thành phần yêu cầu HTTP tiêu chuẩn - nó có hoạt động không? – avs099

+0

Cảm ơn bạn, tôi đang tiến bộ ... Khi tôi thay đổi mã trong mã Util.java của SDK (là lớp thực sự thực hiện yêu cầu http), tôi bắt đầu nhận được phản hồi tương tự như khi nhập địa chỉ trong trình duyệt. Nhưng bây giờ tôi nhận ra rằng con số hết hạn là rất nhỏ (5143168). Khi tôi làm mới hình luôn luôn giảm ... Bất kỳ ý tưởng về điều này? Ví dụ phản hồi ... access_token = AAAEparERUxABAFSPLEI8VNAwo8FLsxOpR6bZAgyeRxj0JAtGBBqMv5y3gnMkvy0TMCrnKuF0Jp6S1DSpiO8mmiy3JMBV2XZASAimYwZDZD & hết hạn = 5143168 – Mel

Các vấn đề liên quan