2012-09-05 30 views
7

Tôi đang cố triển khai trợ cấp ngầm OAuth 2.0 từ ứng dụng máy khách java dành cho máy tính để bàn bằng cách sử dụng API RESTDrive REST. Tôi sử dụng đoạn mã sau:Truy xuất mã thông báo truy cập của OAuth 2.0 (trợ cấp ngầm định) từ Máy khách Java Desktop bằng cách sử dụng API RESTDrive REST.

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

mã của tôi mở trình duyệt web và yêu cầu người dùng đăng nhập và sau đó SkyDrive gửi access token để url trình duyệt theo hình thức sau:

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

Những gì tôi muốn làm là đọc mã thông báo truy cập này từ chương trình java của tôi. Tôi đã cố đọc httpconnection từ bảng điều khiển:

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

nhưng có vẻ như java httpurlconnection không xử lý phản hồi javascript. Trả lời:

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

Vì vậy, có cách nào để truy xuất mã thông báo truy cập trực tiếp từ java không?

Trả lời

4

Tôi gặp sự cố tương tự. Sau nhiều giờ động não, cuối cùng tôi đã tìm được một giải pháp. Tôi sử dụng thư viện JavaFX để tạo một WebView. Sau đó, bạn có thể chặn thay đổi vị trí.

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); 
    } 
} 
Các vấn đề liên quan