Sync Cookies With cURL
I wanted to reuse authenticated sessions from the browser to call protected APIs with cURL (curlie to be precise). Fortunately cURL can use Netscape HTTP Cookie File as a cookie jar. There are extensions for Firefox that can export cookies in this format. Unfortunately they require too much manual clicking. We can do better, right? Well… I came up with semi-automatic process.
Extracting cookies from Firefox
FF keeps cookies in SQLite database. There is a script you can use to convert this database to Netscape format.
Session cookies
The script is not able to extract session cookies since they are not stored
in the database. Luckily Firefox stores the content of session cookies in
sessionstore-backups/recovery.baklz4
file. The file is basically json in
Firefox’s weird lz4 envelope. lz4cat
is not able to read it - you will need
lz4jsoncat
utility (lz4json
package on Debian based systems).
Conversion from recovery.baklz4
to Netscape format is trivial with jq
lz4jsoncat "$SESSION_FILE" |
jq --raw-output '
.cookies[] |
(.host | if test("^[.]") then "TRUE" else "FALSE" end) as $flag |
(.secure | tostring | ascii_upcase) as $secure |
"\(.host)\t\($flag)\t\(.path)\t\($secure)\t0\t\(.name)\t\(.value)"
'
The forked hackerb9’s script with session cookies extraction is available as gist.
Fair warning tho: it seems that sometimes Firefox is not flushing cookies to disk immediately. You can try clicking extension’s icon. It seems that it forces cookies to be stored on disk. I haven’t found any workaround for this issue yet.
curlrc
You can configure cURL to use the Netscape cookies file as cookie jar. cURL
reads configuration from ~/.curlrc
file:
# Save cokies to file
cookie-jar <PATH TO COOKIES FILE>
# Attach cookies to sent requests
cookie <PATH TO COOKIES FILE>
More info about curlrc is available on curl’s manpage.
Published: