
コマンドラインを使用して 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/login
CASサーバーのログインページにリダイレクトされ、認証後にリダイレクトされます。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<=$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
おそらく、次のような複数のリクエストとワークフローを含むスクリプトが必要になります。
- クッキーファイルから既存のクッキーを使用してAPIリクエストを行う
- 応答コードをチェックし、OK であればセッション クッキーはまだ期限切れではないので、これ以上何もする必要はありません。 やった!
- 応答コードが認証エラー状態を示している場合(認証セッションが空であるか期限切れである)、ログインする必要があります。
- CAS サーバーのログイン フォームに資格情報を投稿します。
- 応答コードを確認し、ログインが成功したかどうかを確認し、Cookieファイルを更新します。
またはdie();
- 1へ進む。
標準のChrome開発者ツールプラグインは、次のようなcurlスクリプトの基礎を作成するのに役立ちます。すべてを cURL としてコピーネットワーク コンソールのオプション。