JSL / JMP 17 : OAuth génère apparemment une requête non valideJ'essaie actuellement d'obtenir un jeton OAuth2 pour m'authentifier auprès d'un service externe (base de données Snowflake), mais je rencontre quelques problèmes avec cela.
D'après la documentation , cela est censé fonctionner :
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 />);
Cependant, chaque fois que j'exécute ceci, je reçois une erreur HTTP/1.1 400 Bad Request INVALID_REQUEST:INVALID_REQUESTDESCRIPTION
Pour déboguer cela, j'ai démarré un serveur d'écho HTTP exécuté localement et envoyé des requêtes depuis Python (code fonctionnel, vérifié avec un vrai serveur OAuth2) et JMP, et j'ai obtenu ceci :
Python
127.0.0.1 - - [05/févr./2025 13:36:00] "POST / HTTP/1.1" 200 -
Hôte : localhost:8008
Agent utilisateur : python-requests/2.32.3
Accepter-Encodage : gzip, deflate
Accepter: */*
Connexion : keep-alive
Contenu-Longueur: 91
Type de contenu : application/x-www-form-urlencoded
Autorisation : de base =
grant_type=mot de passe&nom d'utilisateur= &mot de passe= &scope=session%3Arole-tout
JMP 17
127.0.0.1 - - [05/févr./2025 13:36:56] "POST / HTTP/1.1" 200 -
Hôte : localhost:8008
Agent utilisateur : libcurl-agent/1.0 (Windows NT 10.0.22631 ; x64)
Accepter: */*
Contenu-Longueur : 102
Type de contenu : application/x-www-form-urlencoded
client_id= &redirect_uri=&response_type=jeton&scope=&state=
Comme vous pouvez le voir, il n’y a pas d’en-tête d’autorisation et, de plus, la plupart des paramètres de demande (type d’octroi, nom d’utilisateur, mot de passe, portée) sont manquants.
Il me semble que JMP génère une requête erronée et que, par conséquent, la communication avec le serveur échoue. Cette hypothèse est-elle correcte ? Ou est-ce que je fais quelque chose de mal ?
Toute aide serait grandement appréciée.
Cordialement
Franc
Automatisation et scriptsRe: JSL / JMP 17 : OAuth génère apparemment une requête non valide@bryan_boone
Je ne sais pas si ces liens seront utiles, mais l'intégration de Google Drive avec JMP à l'aide d'une requête HTTP peut donner quelques idées. Consultez également Get Authorization Header + New OAuth2 à partir de Scripting Index (Bryan les a mentionnés ici https://community.jmp.com/t5/Discussions/Open-file-from-private-github-repository-authentication-needed/mp/777304/highlight/true#M95860 ). Il existe également un peu plus de documentation dans la référence de syntaxe JSL, mais je ne sais pas si cela est 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 génère apparemment une requête non valideOui,
Nouveau OAuth2
c'est la voie à suivre. Je cherche à voir si je peux lui attribuer un alias New OAuth2 Token.
Sinon, je supprimerai le nouveau jeton OAuth2.
Le nouveau OAuth2 effectue toutes les opérations de négociation du navigateur pour vous.
Re: JSL / JMP 17 : OAuth génère apparemment une requête non valideMerci, le nouveau OAuth2() a l'air bien meilleur. J'ai réussi à obtenir un jeton d'actualisation avec le flux « Informations d'identification du client ».
Cependant, j'ai du mal à faire fonctionner le flux de mots de passe. Mon code actuel ressemble à ceci :
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>Cependant, cela génère une erreur HTTP/1.1 401 non autorisée.
À titre de comparaison, voici un exemple fonctionnel en 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"]Je suppose que d'une manière ou d'une autre, JMP n'établit pas l'authentification HTTP Basic avec client_id / client_secret. Qu'est-ce que je fais mal ?
Re: JSL / JMP 17 : OAuth génère apparemment une requête non valideJe pense que tu parles de :
https://oauth.net/2/grant-types/password/
Cette discussion (sur la référence) indique qu'il y a un éloignement de cela.
Vous pouvez probablement tout faire avec HTTPRequest (sans New OAuth2) car il n'est pas nécessaire d'utiliser le type d'octroi de mot de passe (c'est-à-dire qu'il va directement à l'URL du jeton)
Je crois que l'équivalent JSL (du python) ressemble à ceci, mais je ne peux pas le tester.
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 génère apparemment une requête non valideAvec quelques ajustements, j'ai réussi à le faire fonctionner ; les principaux changements par rapport à votre suggestion :
- inclure l'authentification de base
- utiliser l'encodage de formulaire au lieu de JSON (je ne suis pas sûr à 100 % de la raison pour laquelle JSON ne fonctionne pas, cependant)
Exemple de travail :
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>
Pour le moment, cela ne pose aucun problème (nous utilisons un utilisateur technique, donc pas besoin d'obtenir le mot de passe personnel de l'utilisateur), mais nous allons certainement rechercher des approches plus sécurisées.
Merci beaucoup pour votre aide !
Re: JSL / JMP 17 : OAuth génère apparemment une requête non valideBelle découverte ! Je n'étais pas tout à fait sûr de la méthode d'autorisation 17 que j'avais introduite (peut-être une maintenance ?)
Re: JSL / JMP 17 : OAuth génère apparemment une requête non validePetite (mais importante) correction : il semble que mon approche ne fonctionne qu'avec JMP 18, pas avec JMP 17.
Apparemment, la « méthode d'autorisation » n'a été introduite que dans JMP 18. Lorsque j'essaie d'utiliser l'approche dans JMP 17, j'obtiens :
Message non reconnu lors de l'accès ou de l'évaluation de « Méthode d'authentification », méthode d'authentification (« BASIC ») /*###*/
J'ai revérifié la documentation :
- les documents JMP 17 ne contiennent aucune mention de « méthode d'authentification »
- les documents JMP 18 contiennent un exemple de « méthode d'authentification » dans un appel PI
(Je n'avais pas remarqué cela auparavant car apparemment, le jeton de mes tests JMP 18 était stocké dans le fichier / la table de données JMP, et par conséquent, JMP 17 utilisait joyeusement l'ancien jeton même si sa propre tentative d'en obtenir un nouveau échouait)