如何使用Jsoup进行JIRA登录?

时间:2017-04-13 09:32:49

标签: java jsoup jira

我一直在尝试使用Jsoup API登录JIRA,但由于某种原因它无法正常工作。

我试图识别用户名和密码标签,但仍然没有用。

有人可以帮我弄清楚我做错了吗?

mediainfo

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

非常感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

你是在正确的方向,但有时"假装"一些webapps的登录过程可能非常棘手或难以成功,因为你缺少设置一个特定的标题,cookie或一些特殊的参数......

如果你看一下Jira的documentation,你会发现很多例子。不是将用户名和密码作为表单发送,而是最好进行REST POST以获取有效的cookie。

如文档中所述:

  
      
  • (1)客户端通过JIRA REST API为用户创建新会话。
  •   
  • (2)JIRA返回一个会话对象,该对象包含有关会话的信息,包括会话cookie。客户端存储此会话对象。
  •   
  • (3)客户端现在可以在标头中为JIRA REST API的所有后续请求设置cookie。
  •   

我已经创建了一个简单的测试类,我确保与Jira合作(不确定版本是什么,但可能是最后一个版本)。 方法getFullName只是在服务器的响应中搜索fullName(成功登录fullName后会出现在响应中):

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

}