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 Bad Request INVALID_REQUEST:INVALID_REQUESTDESCRIPTIONが返されます。
これをデバッグするために、ローカルで実行されている HTTP エコー サーバーを起動し、Python (実際の OAuth2 サーバーで検証された動作コード) と JMP からリクエストを送信したところ、次のような結果が返されました。
パイソン
127.0.0.1 - - [2025年2月5日 13:36:00] 「POST / HTTP/1.1」 200 -
ホスト: localhost:8008
ユーザーエージェント: python-requests/2.32.3
Accept-Encoding: gzip、deflate
受け入れる: */*
接続: キープアライブ
コンテンツの長さ: 91
コンテンツタイプ: application/x-www-form-urlencoded
承認: 基本=
grant_type=パスワードとユーザー名= &パスワード= &scope=セッション%3Arole-any
JMP17
127.0.0.1 - - [2025年2月5日 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= &redirect_uri=&response_type=トークン&scope=&state=
ご覧のとおり、Authorization ヘッダーがなく、リクエスト パラメーター (許可タイプ、ユーザー名、パスワード、スコープ) のほとんどが欠落しています。
JMP が偽のリクエストを生成し、サーバーとの通信が失敗するように見えます。この仮定は正しいでしょうか? それとも、私が何か間違っているのでしょうか?
どのような助けでも大歓迎です。
敬具
フランク
自動化とスクリプトRe: JSL / JMP 17: OAuth が無効なリクエストを生成するようですブライアン・ブーン
これらのリンクが役に立つかどうかはわかりませんが、 「HTTP リクエストを使用して Google ドライブを 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
これが正しい方法です。新しい OAuth2 トークンをこれにエイリアスできるかどうかを確認します。
そうでない場合は、新しい OAuth2 トークンを廃止します。
新しい OAuth2 は、すべてのブラウザ ハンドシェイクを実行します。
Re: JSL / JMP 17: OAuth が無効なリクエストを生成するようですありがとうございます。新しい OAuth2() ははるかに良くなりました。「クライアント資格情報」フローで更新トークンを正常に取得できました。
しかし、パスワードフローを機能させるのに苦労しています。現在のコードは次のようになります。
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 Unauthorized が発生します。
比較のために、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 (Python の場合) は次のようになると思いますが、テストできません。
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 の代わりにフォーム エンコーディングを使用します (ただし、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 では機能しないようです。
どうやら、「認証方法」は JMP 18 でのみ導入されたようです。JMP 17 でこのアプローチを使用しようとすると、次のメッセージが表示されます。
「認証方法」のアクセスまたは評価で認識できないメッセージ、認証方法 (「BASIC」) /*###*/
ドキュメントを再確認しました:
- JMP 17のドキュメントには「認証方法」については一切触れられていない
- JMP 18 のドキュメントには、PI 呼び出しにおける「認証方法」の例が1 つ含まれています。
(以前はこれに気付いていませんでしたが、どうやら JMP 18 テストのトークンは JMP ファイル/データ テーブル内に保存されていたため、JMP 17 は新しいトークンを取得しようとして失敗したにもかかわらず、古いトークンを使用していました)