2012-09-05 18 views
7

Próbuję zaimplementować niejawny grant OAuth 2.0 z aplikacji klienckiej java desktop przy użyciu interfejsu REST API usługi SkyDrive. Używam następujący kod:Pobieranie znacznika dostępu OAuth 2.0 (niejawny grant) z klienta java Desktop przy użyciu interfejsu REST API usługi SkyDrive.

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

mój kod otwiera przeglądarkę internetową i poprosić użytkownikom signin a następnie SkyDrive wysyła token dostępu do adresu URL przeglądarki w następującej formie:

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

Co chcę zrobić jest odczytywanie tego tokenu dostępu z mojego programu java. Próbowałem czytać httpconnection z konsoli:

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

ale wydaje się, że java HttpURLConnection nie obsługuje javascript odpowiedź. Odpowiada:

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

Czy istnieje sposób na odzyskanie tokena dostępu bezpośrednio z java?

Odpowiedz

4

Miałem ten sam problem. Po wielu godzinach burzy mózgów znalazłem rozwiązanie. Używam biblioteki JavaFX do tworzenia WebView. Następnie możesz przechwycić zmianę lokalizacji.

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); 
    } 
} 
Powiązane problemy