2012-09-05 12 views
7

Estoy intentando implementar la concesión implícita de OAuth 2.0 desde la aplicación de cliente de escritorio de Java usando la API REST de SkyDrive. Yo uso el siguiente código:Recuperando el token de acceso de OAuth 2.0 (concesión implícita) de Java Desktop Client utilizando la API REST de SkyDrive.

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

mi código abre el navegador web y pedir a los usuarios SignIn y luego SkyDrive envía el token de acceso a la URL del navegador de la siguiente forma:

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

Lo que yo quiero hacer es leer este token de acceso de mi programa java. Traté de leer HttpConnection desde la consola:

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

pero parece que HttpURLConnection java no maneja Javascript respuesta. Responde:

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

Entonces, ¿hay alguna manera de recuperar el token de acceso directamente desde java?

Respuesta

4

Tuve el mismo problema. Después de horas de tormenta de ideas, finalmente encontré una solución. Uso la biblioteca JavaFX para crear una WebView. Entonces puedes interceptar el cambio de ubicación.

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