2016-07-22 13 views
1

Ich versuche, Bitbucket-API zu verwenden, um einen neuen Zugriffsschlüssel aus einem Aktualisierungsschlüssel zu generieren. Ich kann dies erfolgreich tun im Terminal:Was ist der Unterschied zwischen Groovys "execute" -Methode und normalen bash-Befehlen?

curl -X POST -u "${client_id}:${secretKey}" https://bitbucket.org/site/oauth2/access_token -d grant_type=refresh_token -d refresh_token=${refreshToken} 

Wo $ {...} haben durch ihre Literalwerte ersetzt. Es gibt richtig etwas Ähnliches wie folgt aus:

{"access_token": "xxxxx", "scopes": "pullrequest", "expires_in": 3600, "refresh_token": "xxxxx", "token_type": "bearer"} 

Ich Groovy mit diesem auszuführen:

def getAccessToken = "curl -X POST -u \"${client_id}:${secret}\" https://bitbucket.org/site/oauth2/access_token -d grant_type=refresh_token -d refresh_token=${refreshToken}" 
def getAccessTokenResult = getAccessToken.execute().text 

Wenn ich den Befehl, und führen Sie das Ergebnis println wird es funktionieren, es ist also kein malformed URL Als ich das Ergebnis des Befehls selbst println, kommt es mit dieser zurück:

{"error_description": "Invalid OAuth client credentials", "error": "unauthorized_client"} 

Es gibt keinen Grund sollte dies geschehen, es sei denn es einen fundamentalen Unterschied zwischen dem, wie ist die Befehle das ausgeführt wird, wenn jemand kennt den Unterschied oder kann dieses Problem sogar lösen, wäre ich sehr dankbar.

+1

Sie verwenden eine Menge von Shell-Variablen in der 'curl'-Befehl in Groovy. Haben sie Werte, wenn Sie den Groovy-Code ausführen? (Wahrscheinlich müssen Sie sie vor dem Ausführen exportieren. Andernfalls sieht der Befehl "curl", der tatsächlich ausgeführt wird, wahrscheinlich wie folgt aus: "curl -X POST -u": "https://bitbucket.org/site/oauth2/access_token -d grant_type = refresh_token -d refresh_token = '. – chepner

+1

@chepner Beantworten von OP hier - das Parsen des Strings wird ausgeführt, bevor es ausgeführt wird Ein' println' von 'getAccessToken' zeigt den vollen 'curl'-Befehl mit allen korrekt aufgefüllten Werten; Dieser Befehl kann in das Terminal eingefügt und direkt ausgeführt werden (und gibt das Ergebnis an, das wir erwarten). –

Antwort

2

Ich testete beide Methoden mit https://httpbin.org/ und festgestellt, dass die Authorization Header vom Server zurückgegeben wurde mit jeder Methode unterschiedlich.

Ich glaube, dass das Wrapping Ihrer Anmeldeinformationen (-u) in doppelte Anführungszeichen in Ihrer Shell einfach die Shell sagt, dass sie als ein einzelnes Argument behandelt werden sollen. Sie werden nicht an curl übergeben.

Es sieht so aus, als ob Groovy die Anführungszeichen als Teil des Arguments enthält. Entfernen von ihnen erzeugt die gleiche Authorization Header sowohl in der Schale und Groovy, aber natürlich jetzt können Sie bestimmte Zeichen in der Client-ID und geheimen Schlüssel Werte entkommen müssen:

... -u ${client_id}:${secretKey} ...