2012-09-05 28 views
7

मैं SkyDrive REST API का उपयोग कर जावा डेस्कटॉप क्लाइंट एप्लिकेशन से OAuth 2.0 निहित अनुदान को लागू करने का प्रयास कर रहा हूं। मैं निम्नलिखित कोड का उपयोग करें:स्काईडाइव आरईएसटी एपीआई का उपयोग कर जावा डेस्कटॉप क्लाइंट से ओएथ 2.0 (निहित अनुदान) के एक्सेस टोकन को पुनर्प्राप्त करना।

Desktop.getDesktop().browse(new URL(st.toString()).toURI()); 
JOptionPane.showMessageDialog(null, "Press ok to continue once you have authenticated."); 

मेरी कोड वेब ब्राउज़र को खोलता है और उन प्रवेश द्वारा के लिए पूछना और फिर SkyDrive निम्नलिखित रूप में ब्राउज़र यूआरएल को पहुँच टोकन भेजता है:

https://login.live.com/oauth20_desktop.srf?lc=1033#access_token=EwAwAq1DBAAUlbRW..... 

मैं आपकी क्या अपेक्षाएं हैं मेरे जावा प्रोग्राम से इस एक्सेस टोकन को पढ़ना है। मैं कंसोल से httpconnection पढ़ने के लिए करने की कोशिश की:

HttpURLConnection con = (HttpURLConnection) url.openConnection(); 
BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream())); 
while(reader.readLine()!=null){ 
System.out.println(reader.readLine()); 

लेकिन ऐसा लगता है कि जावा httpurlconnection जावास्क्रिप्ट प्रतिक्रिया संभाल नहीं करता है। यह जवाब देता है:

<html dir="..... Windows Live ID requires JavaScript to sign in. This web browser either does not support JavaScript, or scripts are being blocked......<body onload="evt_LoginHostMobile_onload(event);"> 

तो, क्या जावा से सीधे पहुंच टोकन पुनर्प्राप्त करने का कोई तरीका है?

उत्तर

4

मुझे एक ही समस्या थी। Brainstorming के घंटों के बाद, मुझे अंततः एक समाधान मिला है। मैं WebView बनाने के लिए JavaFX लाइब्रेरी का उपयोग करता हूं। फिर आप स्थान परिवर्तन को रोक सकते हैं।

import java.net.MalformedURLException; 
import java.net.URL; 
import java.util.HashMap; 
import java.util.Map; 

import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Scene; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.web.WebEngine; 
import javafx.scene.web.WebEvent; 
import javafx.scene.web.WebView; 
import javafx.stage.Stage; 

public class Authenticate extends Application { 

    static final String APP_ID = "..."; 
    static final String REDIRECT_URL = "https://login.live.com/oauth20_desktop.srf"; 
    static final String RESPONSE_TYPE = "token"; 
    static final String SCOPE = "wl.signin%20wl.offline_access"; 

    private Scene scene; 

    @Override 
    public void start(final Stage stage) throws Exception { 
     final String url = "https://login.live.com/oauth20_authorize.srf?client_id="+APP_ID 
       +"&scope="+SCOPE+"&response_type="+RESPONSE_TYPE+"&oauth_callback=oob&redirect_uri="+REDIRECT_URL; 
     BorderPane borderPane = new BorderPane(); 

     WebView browser = new WebView(); 
     WebEngine webEngine = browser.getEngine(); 

     webEngine.load(url); 
     borderPane.setCenter(browser); 

     webEngine.setOnStatusChanged(new EventHandler<WebEvent<String>>() { 
      public void handle(WebEvent<String> event) { 
       if (event.getSource() instanceof WebEngine) { 
        WebEngine we = (WebEngine) event.getSource(); 
        String location = we.getLocation(); 
        if (location.startsWith(REDIRECT_URL) && location.contains("access_token")) { 
         try { 
          URL url = new URL(location); 
          String[] params = url.getRef().split("&"); 
          Map<String, String> map = new HashMap<String, String>(); 
          for (String param : params) { 
           String name = param.split("=")[0]; 
           String value = param.split("=")[1]; 
           map.put(name, value); 
          } 
          System.out.println("The access token: "+map.get("access_token")); 
          stage.hide(); 
         } catch (MalformedURLException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      } 
     }); 

     // create scene 
     stage.setTitle("Skydrive"); 
     scene = new Scene(borderPane, 750, 500); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
}