JSL / JMP 17: OAuth apparentemente genera una richiesta non validaAl momento sto cercando di ottenere un token OAuth2 per autenticarmi per un servizio esterno (database Snowflake), ma sto riscontrando alcuni problemi.
Secondo la documentazione , questo dovrebbe funzionare:
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 />);
Tuttavia, ogni volta che eseguo questo, ottengo un HTTP/1.1 400 Bad Request INVALID_REQUEST:INVALID_REQUESTDESCRIPTION
Per risolvere il problema, ho avviato un server echo HTTP in esecuzione localmente e ho inviato richieste da Python (codice funzionante, verificato con un server OAuth2 reale) e JMP, e ho ottenuto questo risultato:
Pitone
127.0.0.1 - - [05/feb/2025 13:36:00] "POST / HTTP/1.1" 200 -
Host: localhost:8008
Agente utente: python-requests/2.32.3
Codifica di accettazione: gzip, deflate
Accetta: */*
Collegamento: keep-alive
Lunghezza del contenuto: 91
Tipo di contenuto: application/x-www-form-urlencoded
Autorizzazione: Base =
grant_type=password&nomeutente= &parola d'ordine= &ambito=sessione%3Arole-qualsiasi
17 anni
127.0.0.1 - - [05/feb/2025 13:36:56] "POST / HTTP/1.1" 200 -
Host: localhost:8008
Agente utente: libcurl-agent/1.0 (Windows NT 10.0.22631;x64)
Accetta: */*
Lunghezza del contenuto: 102
Tipo di contenuto: application/x-www-form-urlencoded
ID_cliente= &redirect_uri=&response_type=token&ambito=&stato=
Come puoi vedere, non c'è alcuna intestazione Authorization e, inoltre, mancano la maggior parte dei parametri di richiesta (tipo di concessione, nome utente, password, ambito).
A me sembra che JMP generi una richiesta fasulla e, di conseguenza, la comunicazione con il server fallisce. Questa ipotesi è corretta? O sto sbagliando qualcosa?
Ogni aiuto sarà molto apprezzato.
Cordiali saluti
Franco
Automazione e scriptingRe: JSL / JMP 17: OAuth apparentemente genera una richiesta non valida@bryan_boone
Non so se questi link saranno utili, ma Integrazione di Google Drive con JMP tramite richiesta HTTP potrebbe dare qualche idea. Dai un'occhiata anche a Get Authorization Header + New OAuth2 from Scripting Index (Bryan li ha menzionati qui https://community.jmp.com/t5/Discussions/Open-file-from-private-github-repository-authentication-needed/mp/777304/highlight/true#M95860 ). C'è anche un po' più di documentazione in JSL Syntax Reference, ma non ho idea se sia utile https://www.jmp.com/support/help/en/18.1/#page/jmp/utility-functions.shtml?os=win&source=application#ww7957559
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaSÌ,
Nuovo OAuth2
è la strada da seguire. Cerco di vedere se posso creare un alias per New OAuth2 Token.
In caso contrario, ritirerò il nuovo token OAuth2.
Il nuovo OAuth2 esegue per te l'handshaking del browser.
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaGrazie, il nuovo OAuth2() sembra molto meglio. Sono riuscito a ottenere con successo un token di aggiornamento con il flusso "Cridenziali client".
Tuttavia, sto avendo difficoltà a far funzionare il flusso di password. Il mio codice attuale è simile a questo:
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>Tuttavia, il risultato è HTTP/1.1 401 Unauthorized.
Per fare un confronto, ecco un esempio funzionante 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"]Immagino che in qualche modo JMP non stabilisca l'autenticazione HTTP Basic con client_id / client_secret. Cosa sto sbagliando?
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaPenso che tu stia parlando di:
https://oauth.net/2/grant-types/password/
Questa discussione (sul riferimento) afferma che ci si sta allontanando da questo.
Probabilmente puoi fare tutto con HTTPRequest (senza il nuovo OAuth2) poiché non c'è bisogno di chiedere di usare il tipo di concessione della password (vale a dire, va direttamente all'URL del token)
Credo che l'equivalente JSL (di Python) sia simile a questo, ma non riesco a testarlo.
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>
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaCon qualche modifica, sono riuscito a farlo funzionare; modifiche chiave rispetto al tuo suggerimento:
- includere autenticazione di base
- utilizzare la codifica Form invece di JSON (non sono sicuro al 100% del motivo per cui JSON non ha funzionato, però)
Esempio pratico:
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>
Per il momento va bene (stiamo utilizzando un utente tecnico, quindi non c'è bisogno di ottenere la password personale dell'utente), ma sicuramente prenderemo in considerazione approcci più sicuri.
Grazie mille per il tuo aiuto!
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaOttima scoperta! Non ero sicuro di quale 17 avevo introdotto Authorization Method (forse una manutenzione?)
Re: JSL / JMP 17: OAuth apparentemente genera una richiesta non validaPiccola (ma importante) correzione: sembra che il mio approccio funzioni solo con JMP 18, non con JMP 17.
A quanto pare, "Authorization Method" è stato introdotto solo in JMP 18. Quando provo a usare l'approccio in JMP 17, ottengo:
Messaggio non riconosciuto nell'accesso o nella valutazione di 'Metodo di autenticazione', Metodo di autenticazione( "BASIC" ) /*###*/
Ho ricontrollato la documentazione:
- la documentazione JMP 17 non contiene alcuna menzione del "metodo di autenticazione"
- la documentazione JMP 18 contiene un esempio di "Metodo di autenticazione" in una chiamata PI
(Non me ne ero accorto prima perché, a quanto pare, il token dei miei test JMP 18 era memorizzato all'interno del file JMP/tabella dati e, pertanto, JMP 17 utilizzava felicemente il vecchio token, anche se il suo tentativo di ottenerne uno nuovo era fallito)