JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.현재 외부 서비스(Snowflake 데이터베이스)를 인증하기 위해 OAuth2 토큰을 얻으려고 노력하고 있지만, 이 과정에서 몇 가지 문제가 발생했습니다.
설명서 에 따르면 이 작업은 다음과 같이 실행됩니다.
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 />);
하지만 이것을 실행할 때마다 HTTP/1.1 400 잘못된 요청 INVALID_REQUEST:INVALID_REQUESTDESCRIPTION이 반환됩니다.
이를 디버깅하기 위해 로컬에서 실행되는 HTTP 에코 서버를 시작하고 Python(작동하는 코드, 실제 OAuth2 서버로 검증됨)과 JMP에서 요청을 보냈고 다음과 같은 결과를 받았습니다.
파이썬
127.0.0.1 - - [2025-02-05 13:36:00] "POST / HTTP/1.1" 200 -
호스트: localhost:8008
사용자 에이전트: python-requests/2.32.3
Accept-Encoding: gzip, deflate
수용하다: */*
연결: keep-alive
콘텐츠 길이: 91
콘텐츠 유형: application/x-www-form-urlencoded
권한: 기본 =
grant_type=비밀번호&사용자이름= &비밀번호= &scope=세션%3Arole-any
제이엠피 17
127.0.0.1 - - [2025-02-05 13:36:56] "POST / HTTP/1.1" 200 -
호스트: localhost:8008
사용자 에이전트: libcurl-agent/1.0(Windows NT 10.0.22631;x64)
수용하다: */*
콘텐츠 길이: 102
콘텐츠 유형: application/x-www-form-urlencoded
클라이언트_ID= &리디렉션_uri=&응답_유형=토큰&범위=&상태=
보시다시피 Authorization 헤더가 없고 대부분의 요청 매개변수(허용 유형, 사용자 이름, 비밀번호, 범위)가 없습니다.
제 생각에는 JMP가 허위 요청을 생성해서 서버와의 통신이 실패하는 것 같습니다. 이 가정이 맞는 걸까요? 아니면 제가 뭔가 잘못하고 있는 걸까요?
어떠한 도움도 주시면 감사하겠습니다.
감사합니다
솔직한
자동화 및 스크립팅Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.@브라이언_분
이 링크들이 도움이 될지 잘 모르겠지만 HTTP 요청을 사용하여 Google Drive와 JMP를 통합하면 몇 가지 아이디어를 얻을 수 있습니다. 또한 Scripting Index에서 Get Authorization Header + New OAuth2를 확인하세요(Bryan이 여기에서 언급했습니다 https://community.jmp.com/t5/Discussions/Open-file-from-private-github-repository-authentication-needed/mp/777304/highlight/true#M95860 ). JSL 구문 참조에 약간 더 많은 문서가 있지만 이것이 도움이 될지 전혀 모르겠습니다 https://www.jmp.com/support/help/en/18.1/#page/jmp/utility-functions.shtml?os=win&source=application#ww7957559
Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.예,
새로운 OAuth2
가는 길입니다. New OAuth2 Token에 별칭을 지정할 수 있는지 살펴보겠습니다.
그렇지 않으면 새로운 OAuth2 토큰을 더 이상 사용하지 않을 것입니다.
새로운 OAuth2는 모든 브라우저 핸드셰이킹을 대신 처리합니다.
Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.고맙습니다. New OAuth2()가 훨씬 좋아 보입니다. "클라이언트 자격 증명" 흐름으로 새로 고침 토큰을 성공적으로 얻을 수 있었습니다.
하지만, 저는 Password flow를 작동시키는 데 어려움을 겪고 있습니다. 현재 코드는 다음과 같습니다.
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>그러나 이로 인해 HTTP/1.1 401 인증되지 않음이 발생합니다.
비교를 위해 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"]어떻게 된 일인지, JMP가 client_id / client_secret으로 HTTP 기본 인증을 설정하지 않는 것 같습니다. 내가 뭘 잘못하고 있는 걸까요?
Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.당신이 말하는 것은 바로 이것입니다.
https://oauth.net/2/grant-types/password/
이 토론(참고문헌에 대한)에서는 이런 방향에서 벗어나는 움직임이 있다고 말합니다.
암호 부여 유형을 사용하여 메시지를 표시할 필요가 없으므로(즉, 토큰 URL에 직접 적용됨) 아마도 HTTPRequest(새로운 OAuth2 없음)로 모든 작업을 수행할 수 있을 것입니다.
제 생각에 동등한 JSL(파이썬에 해당)은 다음과 같습니다. 하지만 테스트할 수 없습니다.
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가 잘못된 요청을 생성하는 것 같습니다.약간의 조정을 거쳐 작동하게 되었습니다. 제안하신 내용에서 주요 변경 사항은 다음과 같습니다.
- 기본 인증 포함
- JSON 대신 Form 인코딩을 사용합니다(하지만 JSON이 작동하지 않는 이유는 100% 확실하지 않음)
실제 예:
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>
지금으로서는 괜찮습니다(기술 사용자를 사용하고 있으므로 사용자의 개인 비밀번호를 얻을 필요가 없습니다). 하지만 더욱 안전한 방법을 반드시 모색하겠습니다.
귀하의 도움에 감사드립니다!
Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.대단한 발견! 어떤 17을 도입했는지 잘 모르겠어요. 권한 부여 방법(아마도 유지 관리?)
Re: JSL / JMP 17: OAuth가 잘못된 요청을 생성하는 것 같습니다.작지만 중요한 수정 사항: 제 접근 방식은 JMP 18에서만 작동하고 JMP 17에서는 작동하지 않는 것 같습니다.
분명히 "Authorization Method"는 JMP 18에서만 도입되었습니다. JMP 17에서 이 접근 방식을 사용하려고 하면 다음과 같은 결과가 나옵니다.
'인증 방법'에 대한 액세스 또는 평가에서 인식할 수 없는 메시지, 인증 방법( "BASIC") /*###*/
문서를 다시 확인했습니다.
- JMP 17 문서에는 "인증 방법"에 대한 언급이 전혀 없습니다.
- JMP 18 문서 에는 PI 호출의 "인증 방법"에 대한 한 가지 예가 포함되어 있습니다.
(저는 이전에 이것을 알아차리지 못했습니다. JMP 18 테스트의 토큰이 JMP 파일/데이터 테이블 내부에 저장되어 있었기 때문인데, 따라서 JMP 17은 새 토큰을 얻으려는 시도가 실패했음에도 불구하고 기꺼이 이전 토큰을 사용했습니다.)