JSL/JMP 17: OAuth aparentemente genera una solicitud no válidaActualmente estoy intentando obtener un token OAuth2 para autenticarme para un servicio externo (base de datos Snowflake), pero me estoy encontrando con algunos problemas con esto.
Según la documentación , esto debería funcionar:
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 />);
Sin embargo, cada vez que ejecuto esto, obtengo un HTTP/1.1 400 Bad Request INVALID_REQUEST:INVALID_REQUESTDESCRIPTION
Para depurar esto, inicié un servidor de eco HTTP que se ejecuta localmente y envié solicitudes desde Python (código funcional, verificado con un servidor OAuth2 real) y JMP, y obtuve esto:
Pitón
127.0.0.1 - - [05/02/2025 13:36:00] "POST / HTTP/1.1" 200 -
Anfitrión: localhost:8008
Agente de usuario: python-requests/2.32.3
Aceptar codificación: gzip, deflate
Aceptar: */*
Conexión: mantener viva
Contenido-Longitud: 91
Tipo de contenido: aplicación/x-www-form-urlencoded
Autorización: Básica =
grant_type=contraseña&nombre de usuario= &contraseña= &scope=sesión%3Arole-cualquiera
JMP17
127.0.0.1 - - [05/02/2025 13:36:56] "POST / HTTP/1.1" 200 -
Anfitrión: localhost:8008
Agente de usuario: libcurl-agent/1.0 (Windows NT 10.0.22631;x64)
Aceptar: */*
Contenido-Longitud: 102
Tipo de contenido: aplicación/x-www-form-urlencoded
id_cliente= &uri_de_redirección=&tipo_de_respuesta=token&alcance=&estado=
Como puede ver, no hay ningún encabezado de Autorización y, además, faltan la mayoría de los parámetros de solicitud (tipo de concesión, nombre de usuario, contraseña, alcance).
A mí me parece que JMP genera una solicitud falsa y, por lo tanto, la comunicación con el servidor falla. ¿Es correcta esta suposición? ¿O estoy haciendo algo mal?
Cualquier ayuda sería muy apreciada.
Atentamente
Franco
Automatización y scriptingRe: JSL/JMP 17: OAuth aparentemente genera una solicitud no válida@bryan_boone
No estoy seguro de si estos enlaces serán útiles, pero la integración de Google Drive con JMP mediante una solicitud HTTP podría brindar algunas ideas. Consulte también Obtener encabezado de autorización + Nuevo OAuth2 desde el índice de secuencias de comandos (Bryan los mencionó aquí https://community.jmp.com/t5/Discussions/Open-file-from-private-github-repository-authentication-needed/mp/777304/highlight/true#M95860 ). También hay un poco más de documentación en la Referencia de sintaxis de JSL, pero no tengo idea de si esto es útil en absoluto https://www.jmp.com/support/help/en/18.1/#page/jmp/utility-functions.shtml?os=win&source=application#ww7957559
Re: JSL/JMP 17: OAuth aparentemente genera una solicitud no válidaSí,
Nuevo OAuth2
es el camino a seguir. Estoy viendo si puedo crear un alias para el nuevo token OAuth2.
De lo contrario, dejaré obsoleto el nuevo token OAuth2.
El nuevo OAuth2 realiza todo el protocolo de enlace del navegador por usted.
Re: JSL/JMP 17: OAuth aparentemente genera una solicitud no válidaGracias, el nuevo OAuth2() luce mucho mejor. Pude obtener un token de actualización con el flujo "Credenciales del cliente".
Sin embargo, tengo problemas para que funcione el flujo de contraseñas. Mi código actual se ve así:
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>Sin embargo, esto da como resultado HTTP/1.1 401 No autorizado.
A modo de comparación, aquí hay un ejemplo práctico 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"]Supongo que, de alguna manera, JMP no establece la autenticación básica HTTP con client_id/client_secret. ¿Qué estoy haciendo mal?
Re: JSL/JMP 17: OAuth aparentemente genera una solicitud no válidaCreo que estás hablando de:
https://oauth.net/2/grant-types/contraseña/
Esta discusión (sobre la referencia) dice que hay un alejamiento de esto.
Probablemente puedas hacerlo todo con HTTPRequest (sin New OAuth2) ya que no es necesario solicitar el uso del tipo de concesión de contraseña (es decir, va directamente contra la URL del token).
Creo que el JSL equivalente (a Python) se parece a esto, pero no puedo probarlo.
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 aparentemente genera una solicitud no válidaCon algunos ajustes logré que funcionara; cambios clave con respecto a su sugerencia:
- incluye autenticación básica
- utilizar codificación de formulario en lugar de JSON (aunque no estoy 100% seguro de por qué JSON no funcionó)
Ejemplo de trabajo:
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>
Por el momento, eso está bien (estamos usando un usuario técnico, por lo que no es necesario obtener la contraseña personal del usuario), pero definitivamente buscaremos enfoques más seguros.
¡Muchas gracias por tu ayuda!
Re: JSL/JMP 17: OAuth aparentemente genera una solicitud no válida¡Gran hallazgo! No estaba muy seguro de cuál de los 17 métodos de autorización introduje (¿quizás un método de mantenimiento?)
Re: JSL/JMP 17: OAuth aparentemente genera una solicitud no válidaPequeña (pero importante) corrección: parece que mi enfoque sólo funciona con JMP 18, no con JMP 17.
Aparentemente, el "Método de autorización" se introdujo recién en JMP 18. Cuando intento utilizar el enfoque en JMP 17, obtengo lo siguiente:
Mensaje no reconocido en el acceso o evaluación de 'Método de autenticación', Método de autenticación ("BASIC") /*###*/
Volví a revisar la documentación:
- Los documentos de JMP 17 no contienen ninguna mención al "Método de autenticación"
- Los documentos JMP 18 contienen un ejemplo de "Método de autenticación" en una llamada PI
(No me había dado cuenta de esto antes porque aparentemente, el token de mis pruebas JMP 18 estaba almacenado dentro del archivo JMP/tabla de datos y, por lo tanto, JMP 17 usó felizmente el token antiguo a pesar de que su propio intento de obtener uno nuevo falló)