2017-04-13 103 views
0

我一直在嘗試使用Jsoup API登錄到JIRA,但由於某種原因它不工作。如何使用Jsoup進行JIRA登錄?

我試圖找出用戶名和密碼標籤,但仍然沒有好處。

有人能幫我弄清楚我做錯了什麼嗎?

public class test 
{ 
public static void main(String[] args) throws IOException{ 
    final String USER_AGENT = "\"Mozilla/5.0 (Windows NT\" +\n" + 
    "   \" 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36\""; 
    String loginFormUrl = "https://jira.aciworldwide.com/login.jsp"; 
    String loginActionUrl = "https://jira.aciworldwide.com/login.jsp"; 
    String username = "[email protected]"; 
    String password = "XXXXXX"; 

    HashMap<String, String> cookies = new HashMap<>(); 
    HashMap<String, String> formData = new HashMap<>(); 

    Connection.Response loginForm = Jsoup.connect(loginFormUrl).method(Connection.Method.GET).userAgent(USER_AGENT).execute(); 
    Document loginDoc = loginForm.parse(); // this is the document that contains response html 

    cookies.putAll(loginForm.cookies()); // save the cookies, this will be passed on to next request 

    formData.put("login", "Log In"); 
    formData.put("os_username", username); 
    formData.put("os_password", password); 

    Connection.Response homePage = Jsoup.connect(loginActionUrl) 
     .cookies(cookies) 
     .data(formData) 
     .method(Connection.Method.POST) 
     .userAgent(USER_AGENT) 
     .execute(); 

    System.out.println(homePage.parse().html()); 


    } 
} 

如果不是JSoup,是否還有其他可用的API?

任何幫助將不勝感激!

+0

你可以添加一些堆棧跟蹤或輸出,「但仍然沒有好」相關: getFullName只是搜索的服務器響應的全名(全成登錄全名後會出現在響應)的方法?你得到了什麼結果/錯誤? – exoddus

+1

爲什麼不使用jira的rest api? – slowy

+0

我被要求只使用JAVA。 –

回答

1

你是在正確的方向,但有時「僞造」一些webapps的登錄過程可能是相當棘手或難以成功,因爲你缺少設置一個特定的標題,cookie或一些特殊的參數...

如果你看看Jira的documentation,你會發現很多例子。除了將用戶名和密碼作爲表單發送外,您最好還是使用REST POST來獲取有效的Cookie。

如在文檔表示:

  • (1)客戶端爲用戶創建新的會話,經由JIRA REST API。
  • (2)JIRA返回一個會話對象,其中包含會話信息,包括會話cookie。客戶端存儲這個會話對象。 (3)客戶現在可以在標題中爲所有對JIRA REST API的後續請求設置cookie。

我已經創建了用於測試的簡單類,我已經確保正在與吉拉(不知道有什麼版本,但可能是最後一個)。

import org.jsoup.Connection.Method; 
import org.jsoup.Connection.Response; 
import org.jsoup.Jsoup; 
import org.jsoup.nodes.Document; 
import org.jsoup.nodes.Element; 

import java.io.IOException; 
import java.util.Map; 
import java.util.Optional; 

public class JiraLogin { 

private final static String USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/57.0.2987.133 Safari/537.36"; 
private final static String JIRA_REST_LOGIN = "https://youdomain.com/rest/auth/1/session"; 

private final static String HOME_URL = "https://youdomain.com/"; 
private final static String USERNAME = "your_username"; 
private final static String PASSWORD = "your_password"; 

public static void main(String[] args) throws IOException { 
    JiraLogin app = new JiraLogin(); 
    app.doLogin(); 
} 

public void doLogin() throws IOException { 
    // (1) 
    Response postResult = doLoginPost(); 
    System.out.println("POST credentials result: " + postResult.body()); 
    // (2) 
    Map<String, String> cookies = postResult.cookies(); 

    Document loggedDocument = Jsoup.connect(HOME_URL) 
      .cookies(cookies) // (3) 
      .method(Method.GET) 
      .userAgent(USER_AGENT) 
      .validateTLSCertificates(false) 
      .get(); 

    System.out.println("FullName: " + getFullName(loggedDocument)); 
} 

private Response doLoginPost() throws IOException { 
    return Jsoup.connect(JIRA_REST_LOGIN) 
      .validateTLSCertificates(false) 
      .method(Method.POST) 
      // if use regular USER_AGENT gets a 403 error 
      // http://stackoverflow.com/questions/10120849/jsoup-connect-throws-403-error-while-apache-httpclient-is-able-to-fetch-the-cont 
      .userAgent("Mozilla") 
      .ignoreContentType(true) 
      .requestBody("{ \"username\": \"" + USERNAME +"\", \"password\": \"" + PASSWORD +"\" }") 
      .header("Content-Type", "application/json") 
      .execute(); 
} 

private String getFullName(Document document) { 
    Optional<Element> fullNameOpt = document.getElementsByTag("meta") 
      .stream() 
      .filter(e -> e.hasAttr("name") && "ajs-remote-user-fullname".equals(e.attr("name"))).findFirst(); 

    return fullNameOpt.isPresent() ? fullNameOpt.get().attr("content") : "Not found"; 
} 

}