Cookie を取得するための問題: JSESSIONID と auth_cookie

Cookie を取得するための問題: JSESSIONID と auth_cookie

コマンドラインを使用して 1 つの API を実行したいのですが、実行中に Cookie: JSESSIONID=<>; auth_cookie=<> 値を渡す必要があります。対象 API には CAS 認証があります。

API 実行時に渡すことができるように、Cookie: JSESSIONID=<>; auth_cookie=<> 値を取得するための curl または別のコマンドを教えてください。

私は試してみました

 curl -v -s --cacert /etc/ssl/certs/cacert.crt https://example.com/login -c cookiefile -d "[email protected]&password=xxxx" -X POST

しかし、それはJSESSIONIDをクッキーファイルに保存するだけです。ブラウザログインではhttps://example.com/loginCASサーバーのログインページにリダイレクトされ、認証後にリダイレクトされます。https://example.com/index

私は @HBruijn が示したアプローチに従いました。

ENCODED_DEST=`echo "https://example.com/login/login" | perl -p -e 's/([^A-Za-z0-9])/sprintf("%%%02X", ord($1))/seg' | sed 's/%2E/./g' | sed 's/%0A//g'`
CAS_ID=`curl -L -s --cacert /etc/ssl/certs/cacertga.crt -c $COOKIE_JAR https://cas-server.example2.com/cas/login?service=$ENCODED_DEST | grep name=.lt | sed 's/.*value..//' | sed 's/\".*//'`

このCAS_IDとJSESSIONIDは次の呼び出しで使用する必要があります

curl -L -s --cacert /etc/ssl/certs/cacertga.crt --data "username=$USERNAME&password=$PASSWORD&lt=$CAS_ID&execution=e1s1&_eventId=submit" -i -b $COOKIE_JAR -c $COOKIE_JAR https://cas-server.example2.com/cas/login?service=$ENCODED_DEST -D .header.txt -o /dev/null

そして最後に、.header.txt にはチケット ID が追加された場所の URL が必要です。auth_cookie を取得するには、その場所で最終呼び出しを行う必要があります。ただし、私のケースでは、場所の URL 自体は提供されていません。

解決策を参照するここ

Python を使用した解決策を見つけたので、この質問を編集しています。mechanize.Browser() を使用すると、認証 Cookie を簡単に取得できます。

答え1

API にアクセスする前にまずログインする必要があるということは、単一の curl リクエストではおそらく不十分であることを意味します。

curlおそらく、次のような複数のリクエストとワークフローを含むスクリプトが必要になります。

  1. クッキーファイルから既存のクッキーを使用してAPIリクエストを行う
  2. 応答コードをチェックし、OK であればセッション クッキーはまだ期限切れではないので、これ以上何もする必要はありません。 やった!
  3. 応答コードが認証エラー状態を示している場合(認証セッションが空であるか期限切れである)、ログインする必要があります。
  4. CAS サーバーのログイン フォームに資格情報を投稿します。
  5. 応答コードを確認し、ログインが成功したかどうかを確認し、Cookieファイルを更新します。
    またはdie();
  6. 1へ進む。

標準のChrome開発者ツールプラグインは、次のようなcurlスクリプトの基礎を作成するのに役立ちます。すべてを cURL としてコピーネットワーク コンソールのオプション。

ここに画像の説明を入力してください

関連情報