
我想使用命令列執行一個 API,但需要傳遞 Cookie: JSESSIONID=<>; auth_cookie=<> 執行時的值。我們對目標 API 進行了 CAS 身份驗證。
請告訴我取得 Cookie 的curl 或其他指令:JSESSIONID=<>; auth_cookie=<> 值,以便我可以在執行 API 時傳遞它。
我嘗試過
curl -v -s --cacert /etc/ssl/certs/cacert.crt https://example.com/login -c cookiefile -d "[email protected]&password=xxxx" -X POST
但它只是將 JSESSIONID 儲存在 cookie 檔案中。在瀏覽器中登入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 應該有位置 URL 並附加票證 ID。需要對該位置進行最終呼叫以取得 auth_cookie。但就我而言,它本身並沒有給出位置 URL。
我參考解決方案這裡
我正在編輯這個問題,因為我得到了使用 python 的解決方案。使用 mechanize.Browser() 可以輕鬆取得需要驗證的 cookie。
答案1
事實上,您需要先登入才能存取 API,這意味著單一curl 請求可能是不夠的。
您可能需要一個具有多個請求和工作流程的腳本,curl
類似於:
- 使用 cookiefile 中的現有 cookie 發出 API 請求
- 檢查回應代碼,如果正常,會話 cookie 尚未過期,您不需要執行更多操作。是的!
- 如果回應代碼指示身份驗證錯誤狀態(您的身份驗證工作階段為空或已過期);然後你需要登入。
- 將您的憑證發佈到 CAS 伺服器登入表單。
- 檢查回應碼,查看登入是否成功,並更新cookie檔案。
或者die();
- 轉到 1。
標準 Chrome 開發者工具外掛程式可以標準幫助您使用以下命令建立此類curl腳本的基礎全部複製為 cURL網路控制台中的選項。