JSL/JMP 17: OAuth generiert offenbar ungültige AnfrageIch versuche derzeit, ein OAuth2-Token zur Authentifizierung bei einem externen Dienst (Snowflake-Datenbank) zu erhalten, habe dabei jedoch einige Probleme.
Laut Dokumentation sollte dies funktionieren:
oauth2_token = New OAuth2 Token(<BR /> User( username ),<BR /> Password( password),<BR /> Client ID( client_id ),<BR /> Client Secret( client_secret ),<BR /> Token URL( "http://localhost:8008" ),<BR /> Grant Type("password"),<BR /> Scope("session:role-any")<BR />);
Wenn ich dies jedoch ausführe, erhalte ich die Antwort HTTP/1.1 400 Bad Request INVALID_REQUEST:INVALID_REQUESTDESCRIPTION
Um dies zu debuggen, habe ich einen lokal laufenden HTTP-Echoserver gestartet und Anfragen von Python (funktionierender Code, verifiziert mit echtem OAuth2-Server) und JMP gesendet und Folgendes zurückbekommen:
Python
127.0.0.1 - - [05/Feb/2025 13:36:00] "POST / HTTP/1.1" 200 -
Host: localhost:8008
Benutzer-Agent: python-requests/2.32.3
Akzeptierte Kodierung: gzip, deflate
Akzeptieren: */*
Verbindung: Keep-Alive
Inhaltslänge: 91
Inhaltstyp: Anwendung/x-www-form-urlencoded
Autorisierung: Basic =
grant_type=Passwort&Benutzername= &Passwort= &scope=session%3Arole-any
JMP 17
127.0.0.1 - - [05/Feb/2025 13:36:56] "POST / HTTP/1.1" 200 -
Host: localhost:8008
Benutzer-Agent: libcurl-agent/1.0 (Windows NT 10.0.22631;x64)
Akzeptieren: */*
Inhaltslänge: 102
Inhaltstyp: Anwendung/x-www-form-urlencoded
Client-ID = &Umleitungs-URI=&Antworttyp=Token&Umfang=&Status=
Wie Sie sehen, gibt es keinen Autorisierungsheader und auch die meisten Anforderungsparameter (Gewährungstyp, Benutzername, Kennwort, Umfang) fehlen.
Für mich sieht es so aus, als ob JMP eine falsche Anfrage generiert und deshalb die Kommunikation mit dem Server fehlschlägt. Ist diese Annahme richtig? Oder mache ich etwas falsch?
Für jede Hilfe wäre ich sehr dankbar.
Mit freundlichen Grüße
Frank
Automatisierung und SkriptingBetreff: JSL / JMP 17: OAuth generiert anscheinend ungültige Anfrage@bryan_boone
Ich bin nicht sicher, ob diese Links hilfreich sind, aber die Integration von Google Drive mit JMP über HTTP-Anfragen könnte einige Ideen liefern. Sehen Sie sich auch Get Authorization Header + New OAuth2 von Scripting Index an (Bryan hat diese hier erwähnt: https://community.jmp.com/t5/Discussions/Open-file-from-private-github-repository-authentication-needed/mp/777304/highlight/true#M95860 ). Es gibt auch etwas mehr Dokumentation in der JSL Syntax Reference, aber ich weiß nicht, ob diese überhaupt hilfreich ist: https://www.jmp.com/support/help/en/18.1/#page/jmp/utility-functions.shtml?os=win&source=application#ww7957559
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageJa,
Neues OAuth2
ist der richtige Weg. Ich schaue, ob ich ihm einen Alias mit dem neuen OAuth2-Token zuweisen kann.
Wenn nicht, werde ich das neue OAuth2-Token ablehnen.
Das neue OAuth2 übernimmt den gesamten Browser-Handshake für Sie.
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageDanke, das neue OAuth2() sieht viel besser aus. Ich konnte mit dem Flow „Client Credentials“ erfolgreich ein Aktualisierungstoken erhalten.
Ich habe jedoch Probleme, den Passwortfluss zum Laufen zu bringen. Mein aktueller Code sieht folgendermaßen aus:
client_id = "<REDACTED>";
client_secret = "<REDACTED>";
token_url = "https://someurl/token";
auth_url = "https://someurl/auth";
username = "<REDACTED>";
password = "<REDACTED>";
grant_type = "password";
scope = "session:role-any";
auth_fields = [=> ];
token_fields = [=> ];
oauth2 = New OAuth2();
oauth2 << Grant Type( "Password" );
oauth2 << Auth URL( auth_url );
oauth2 << Token URL( token_url );
oauth2 << Username(username);
oauth2 << Password(password);
auth_fields["scope"] = scope;
auth_fields["client_id"] = client_id;
token_fields["client_secret"] = client_secret;
oauth2 << Auth Fields( auth_fields );
oauth2 << Token Fields( token_fields );</REDACTED></REDACTED></REDACTED></REDACTED>Dies führt jedoch zu HTTP/1.1 401 Unauthorized.
Zum Vergleich hier ein funktionierendes Beispiel in Python:
def get_token(username: str, password: str, client_secret: str) -> str:
client_auth = requests.auth.HTTPBasicAuth(CLIENT_ID, client_secret)
post_data = {
"grant_type": "password",
"username": username,
"password": password,
"scope": "session:role-any",
}
response = requests.post(TOKEN_URL, auth=client_auth, data=post_data)
token_json = response.json()
print(f"Got token: {token_json}")
return token_json["access_token"]Ich vermute, dass JMP die HTTP-Basisauthentifizierung mit Client-ID/Client-Geheimnis irgendwie nicht herstellt. Was mache ich falsch?
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageIch glaube, Sie meinen:
https://oauth.net/2/grant-types/password/
Diese Diskussion (zur Referenz) besagt, dass man davon abrücken möchte.
Sie können wahrscheinlich alles mit HTTPRequest erledigen (ohne neues OAuth2), da keine Aufforderung zur Verwendung des Kennwort-Grant-Typs erforderlich ist (d. h. es erfolgt direkt über die Token-URL).
Das entsprechende JSL (zum Python) sieht meiner Meinung nach so aus, aber ich kann es nicht testen.
client_id = "<REDACTED>";
client_secret = "<REDACTED>";
token_url = "https://someurl/token";
username = "<REDACTED>";
password = "<REDACTED>";
grant_type = "password";
scope = "session:role-any";
payload =[=>];
payload["grant_type"] = "password";
payload["username"] = username;
payload["password"] = password;
payload["scope"] = scope;
request = New HTTP Request(
URL(token_url),
Username(client_id),
Passwordlient_id),
JSON(payload)
);
data = request << Send();
json = ParseJSON(data);</REDACTED></REDACTED></REDACTED></REDACTED>
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageMit etwas Herumprobieren habe ich es zum Laufen gebracht. Wichtige Änderungen gegenüber Ihrem Vorschlag:
- Basic Auth einbinden
- Formularkodierung statt JSON verwenden (bin mir allerdings nicht 100 % sicher, warum JSON nicht funktioniert hat)
Arbeitsbeispiel:
client_id = "<REDACTED>";
client_secret = "<REDACTED>";
token_url = "https://someurl/token";
username = "<REDACTED>";
password = "<REDACTED>";
grant_type = "password";
scope = "session:role-any";
request = New HTTP Request(
Method("POST"),
URL(token_url),
Username(client_id),
Password(client_secret),
Form(
Fields([[
"grant_type" => grant_type,
"username" => username,
"password" => password,
"scope" => scope
]]
)
)
);
request << Authentication Method( "BASIC" );
data = request << Send();
json = ParseJSON(data);</REDACTED></REDACTED></REDACTED></REDACTED>
Vorerst ist das in Ordnung (wir verwenden einen technischen Benutzer, daher ist es nicht erforderlich, das persönliche Passwort des Benutzers abzurufen), aber wir werden auf jeden Fall nach sichereren Ansätzen suchen.
Vielen Dank für Ihre Hilfe!
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageToller Fund! Ich war mir nicht ganz sicher, welche 17 Autorisierungsmethoden ich eingeführt habe (vielleicht eine Wartung?)
Betreff: JSL / JMP 17: OAuth generiert anscheinend ungültige AnfrageKleine (aber wichtige) Korrektur: Es scheint, dass mein Ansatz nur mit JMP 18 funktioniert, nicht mit JMP 17.
Anscheinend wurde die „Autorisierungsmethode“ erst in JMP 18 eingeführt. Beim Versuch, den Ansatz in JMP 17 zu verwenden, erhalte ich:
Unbekannte Meldung beim Zugriff oder bei der Auswertung von 'Authentifizierungsmethode' , Authentifizierungsmethode( "BASIC" ) /*###*/
Ich habe die Dokumentation noch einmal überprüft:
- die JMP 17-Dokumente enthalten keinerlei Erwähnung der „Authentifizierungsmethode“
- die JMP 18-Dokumente enthalten ein Beispiel für eine „Authentifizierungsmethode“ in einem PI-Aufruf
(Das war mir vorher nicht aufgefallen, da das Token aus meinen JMP 18-Tests anscheinend in der JMP-Datei/Datentabelle gespeichert war und JMP 17 daher problemlos das alte Token verwendete, obwohl sein eigener Versuch, ein neues zu erhalten, fehlschlug.)