In Jira-API Autentifizieren?

PinkMuffin

Bekanntes Mitglied
Also: Ich muss einen Client für Jira machen, da Jira ein login erfordert, muss ich mich also authentifizieren.
Laut der Atlassian-Docu, werden alle Werte von Jira im JSON-Format zurückgegeben, allerdings gibt mir dieser Code schlicht und einfach die HTML-Struktur der besagten Webseite zurück. Die Webseite findet er also eigentlich, allerdings macht es keinen Unterschied, ob ich meine Userdaten eingebe oder nicht, daher vermute ich, dass er nicht mal versucht, mich anzumelden. Eigentlich soll er mir eine JSession-ID mitgeben, damit ich dieses login für alle meine Requests nutzen kann (soweit ich das verstanden habe)

Code:
  public static void main(String[] args)
    {
        String loginResponse = "";
        String JsessionID = "";
        String JsonData = "";
        String csvData = "";
        String writeToFileOutput = "";
        String baseURL = "hier steht normal die URL";
        String loginURL = "Erweiterung der URL auf die login-Seite";
        String loginUsername = "admin";
        String loginPasswort = "admin";

        loginResponse = logIntoJIRA(baseURL, loginURL, loginUsername, loginPasswort);
        //JsessionID = parseJsessionID();
        JsonData = getJsonData();
        csvData = formatAsCsv();
        writeToFileOutput = writeToFile();

    }
    public static String logIntoJIRA(String baseURL, String loginURL, String loginUsername, String loginPasswort)
    {
        String loginResponse = "";
        URL url= null;
        HttpURLConnection conn = null;
        String input ="";
        OutputStream os = null;
        BufferedReader reader = null;
        String output = null;
        try{
            url = new URL (baseURL + loginURL);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoOutput(true);
            conn.setRequestMethod("POST");
            conn.setRequestProperty("Content-Type", "application/json");
            input = "{\"username\":\"" + loginUsername + "\", \"password\":\"" + loginPasswort + "\"}";

            os = conn.getOutputStream();
            os.write(input.getBytes());
            os.flush();

            if(conn.getResponseCode() == 200){ //wird erreicht, webseite wird anscheinend aufgerufen
                reader = new BufferedReader(new InputStreamReader((conn.getInputStream())));

                while((output = reader.readLine()) != null) //Schleife wird 624 durchlaufen, nicht gewollt
                {
                    loginResponse += output;
                }

                conn.disconnect();
            }

        }
        catch (Exception e)
        {
            System.out.println("Fehler bei loginToJIRA: " + e.getMessage());
            loginResponse = "FEHLER";
        }
        System.out.println("\nloginResponse:");
        System.out.println(loginResponse);
        return loginResponse;

    }

Da dieser Code penetrant das Falsche macht, habe ich noch einen anderen Code direkt aus der Atlassian-Doku zusammengeschraubt, allerdings kann ich da nicht einmal wirklich beurteilen, ob die Authentifizierung funktioniert, weil der Code einfach nur BufferedStrings zurückschickt..

Code:
    public static void main(String [] args) throws IOException {

        //Erstellung und encoden von Passwort+Username-Kombination
        Base64.Encoder encoder = Base64.getEncoder();
        String originalString = "username:passwort";
        String encodedString = encoder.encodeToString(originalString.getBytes());
        //System.out.println(encodedString);

        String command = "curl -H \"Authorization: Basic dXNlcm5hbWU6cGFzc3dvcnQ= \" -X POST -H \"Content-Type: application/json\"url-der seite/login-                  erweiterung/rest/auth/latest";
        Process process = Runtime.getRuntime().exec(command);
        process.getInputStream();
        //System.out.println(process.toString());

        command = "curl -H \"Authorization: Basic dXNlcm5hbWU6cGFzc3dvcnQ= \" -X GET -H \"Content-Type: application/json\"/rest/agile/1.0/board";
        process = Runtime.getRuntime().exec(command);
        process.getInputStream();
        //System.out.println(process.getInputStream().toString());

Nicht über den encoder wundern, da überall Fehlermeldungen auftauchen, wenn ich versuche, ihn einzubinden, habe ich ihn durch das "print" dann manuell aus der Konsole an die richtige(?) Stelle kopiert. Nicht ideal, aber ich hab gedacht, zum Testen reicht es, darum kümmere ich mich dann, wenn erstmal was funktioniert.

Kann einer von euch erkennen, warum meine Konsole mir im ersten Fall die HTML-Struktur der Seite und im zweiten Fall Java.io.BufferedInputstream+StreamID zurückgibt? woher bekomme ich den Content von dem Stream?
 

Thallius

Top Contributor
Da du die URL nicht angibst kann ich nur raten aber ich denke mal du nutzt nicht die API sondern die Webseite. Das kann natürlich nicht funktionieren.
 

PinkMuffin

Bekanntes Mitglied
Da du die URL nicht angibst kann ich nur raten aber ich denke mal du nutzt nicht die API sondern die Webseite. Das kann natürlich nicht funktionieren.
Ich bin den Schritten von einem Tutorial gefolgt, derjenige hat ebenfalls die Startseite genutzt. Da wir (bzw die Firma) allerdings einen lokalen Server dafür betreiben, sah das etwas anders aus. In der Atlassian-Doku wird geschrieben, man soll die Server-Site nutzen (in ihrem Fall "localhost:8080"). Allerdings habe ich keinen Zugriff auf diese Informationen (man braucht admin-rechte auf Jira), kann also nicht die Server-ID heraudfinden.
 

Thallius

Top Contributor
Also ihr habe Jira auf einem eigenen lokalen Server installiert? Habt ihr denn da überhaupt auch die API mit installiert?
 

PinkMuffin

Bekanntes Mitglied
Also ihr habe Jira auf einem eigenen lokalen Server installiert? Habt ihr denn da überhaupt auch die API mit installiert?
Muss im Prinzip ja, da andere Leute das ja auch nutzen. Ich hab jetzt die Adresse mitbekommen, zusammen mit den Daten von einem Issue, allerdings hilft mir das auch nicht wirklich weiter.
Code:
      Base64.Encoder encoder = Base64.getEncoder();
        String originalString = "meinJiraNutzername:MeinJiraPasswort";
        String encodedString = encoder.encodeToString(originalString.getBytes()); //TGVuYS1NYTZWl0ejpGcVkZHkgRbmRlcg==

        String curlCommand =    "curl -D- \\\n" +
                                "   -X GET \\\n" +
                                "   -H \"Authorization: Basic TGVuJpZS5TZWl0ejpmVkmx1Rlcg==\" \\\n" +
                                "   -H \"Content-Type: application/json\" \\\n" +
                                "   \"die adresse, die eigentlich stimmen muss/rest/api/latest/issue/issueID(die auch vorgegeben war)\"";
        Process process = Runtime.getRuntime().exec(curlCommand);
        process.getInputStream();
        System.out.println(process.getErrorStream());
        System.out.println(process.toString());

Den authorization-Header hab ich dazugefügt, weil es ohne gemeint hat, es kann den gesuchten File nicht finden. Vorher sah es so aus:

Code:
       // String command= "adresse, die prinzipiell funktionieren sollte/rest/api/latest/issue/vorgegebene IssueID";
       // Process process = Runtime.getRuntime().exec(command);
       // process.getInputStream();
       // System.out.println(process.toString());
Wie gesagt, ich hab nicht so viel Ahnung von der Materie und in der Docu wird davon ausgegangen, dass man die ganze Syntax bereits kennt und nur noch die Befehle braucht. Ich hab nämlich nicht mal eine genaue Vorstellung, was passieren würde, wenn der Befehl endlich mal funktionieren würde.
Ich muss die Daten aus dem JSon-Format schließlich noch irgendwo reinschreiben =/
 
B

BestGoalkeeper

Gast
Wieso machst du denn zwei Themen?
 

PinkMuffin

Bekanntes Mitglied
Wieso machst du denn zwei Themen?
Weil ich bei der vorherigen Frage nach Ressourcen gesucht habe, mit denen man das lernen kann, da (wie ich bereits erwähnt habe) die offiziellen Ressourcen davon ausgehen, dass man bereits alles über APIs weiß, bzw den allgemeinen Ablauf kennt.
Da dort keine hilfreiche Antwort kam, habe ich jetzt eine spezifische Frage zu einem spezifischen Problem gestellt. Die Fragen gehen nur um das gleiche Projekt, der Frageinhalt ist jedoch grundverschieden.
 

Thallius

Top Contributor
Ich würde Dir ans Herz legen erstmal das ganze mit Postman zu machen um die ganzen Fehlermöglichkeiten des Codes schon mal auszuschließen. So mache ich das zumindest immer. Erstmal mit Postman connecten und die api testen und dann ist es einfach aus der Postman console heraus den eigentlich request zu nehmen und in Code umzusetzen
 

Neue Themen


Oben