Cara mengatur header otorisasi menggunakan curl

398

Bagaimana cara meneruskan tajuk otorisasi menggunakan cURL? (dapat dieksekusi di /usr/bin/curl).

Vidya
sumber

Jawaban:

395

http://curl.haxx.se/docs/httpscripting.html

Lihat bagian 6. Otentikasi HTTP

Otentikasi HTTP

Otentikasi HTTP adalah kemampuan untuk memberi tahu server nama pengguna dan kata sandi Anda sehingga dapat memverifikasi bahwa Anda diizinkan untuk melakukan permintaan yang Anda lakukan. Otentikasi dasar yang digunakan dalam HTTP (yang merupakan tipe penggunaan curl secara default) adalah berbasis teks biasa , yang berarti mengirimkan nama pengguna dan kata sandi hanya sedikit dikaburkan, tetapi masih dapat sepenuhnya dibaca oleh siapa saja yang mengendus jaringan antara Anda dan server jarak jauh.

Untuk memberi tahu curl agar menggunakan pengguna dan kata sandi untuk otentikasi:

curl --user name:password http://www.example.com

Situs ini mungkin memerlukan metode otentikasi yang berbeda (periksa header yang dikembalikan oleh server), dan kemudian --ntlm, --digest, --negotiate atau bahkan --anyauth mungkin merupakan opsi yang cocok untuk Anda.

Terkadang akses HTTP Anda hanya tersedia melalui penggunaan proxy HTTP. Ini tampaknya sangat umum di berbagai perusahaan. Proxy HTTP mungkin memerlukan pengguna dan kata sandi sendiri untuk memungkinkan klien untuk bisa masuk ke Internet. Untuk menentukan mereka yang memiliki ikal, jalankan sesuatu seperti:

curl --proxy-user proxyuser:proxypassword curl.haxx.se

Jika proksi Anda mengharuskan otentikasi dilakukan menggunakan metode NTLM, gunakan --proxy-ntlm, jika itu memerlukan Digest use --proxy-digest.

Jika Anda menggunakan salah satu opsi pengguna + kata sandi ini tetapi tidak memasukkan bagian kata sandi, curl akan meminta kata sandi secara interaktif.

Perhatikan bahwa ketika suatu program dijalankan, parameternya mungkin dapat dilihat saat mendaftar proses yang sedang berjalan dari sistem. Dengan demikian, pengguna lain mungkin dapat menonton kata sandi Anda jika Anda meneruskannya sebagai opsi baris perintah biasa. Ada cara untuk menghindari ini.

Perlu dicatat bahwa sementara ini adalah cara Otentikasi HTTP bekerja, sangat banyak situs web tidak akan menggunakan konsep ini ketika mereka memberikan login dll. Lihat bab Web Login lebih lanjut di bawah ini untuk rincian lebih lanjut tentang itu.

Oli
sumber
16
@Vixed Pertanyaan ini secara eksplisit bukan tentang PHP. [Apa yang salah dengan hasil Google]?
Oli
Pertanyaannya adalah tentang Otorisasi bukan otentikasi, jadi mungkin OP harus mengubah judul pertanyaan
jam
321

Cukup tambahkan sehingga Anda tidak perlu mengklik:

curl --user name:password http://www.example.com

atau jika Anda mencoba mengirim otentikasi untuk OAuth 2:

curl -H "Authorization: OAuth <ACCESS_TOKEN>" http://www.example.com
Tony
sumber
15
Banyak API sekarang menggunakan token otorisasi header. The -Hpilihan besar.
eliocs
14
Jika Anda menggunakan -u atau --user, Curl akan menyandikan kredensial ke Base64 dan menghasilkan header seperti ini:-H Authorization: Basic <Base64EncodedCredentials>
Timothy Kanski
Saya mencoba menambahkan tajuk otorisasi dengan HMAC-SHA256selalu mendapatkan kesalahan tajuk otorisasi yang hilang
Steven Aguilar
2
Selain itu, jika Anda membutuhkan <Base64EncodedCredentials>seperti yang disebutkan oleh @ timothy-kansaki, Anda bisa mendapatkan encoded credential menggunakan perintah: cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.com. Untuk referensi, lihat stackoverflow.com/questions/16918602/…
David Golembiowski
170

Token pembawa terlihat seperti ini:

curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://www.example.com
Steve Tauber
sumber
7
Dan jika Anda ingin melakukan otorisasi 'Dasar', cukup tukar 'Pembawa' dengan 'Dasar'
a darren
Saya mendapatkan hal yang paling aneh, saya mendapatkan "Format header Otorisasi yang salah" dan "HTTP-200". Jadi server menerima otorisasi saya, tetapi formatnya salah?
Groostav
65

(bagi mereka yang mencari jawaban php-curl )

$service_url = 'https://example.com/something/something.json';
$curl = curl_init($service_url);
curl_setopt($curl, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt($curl, CURLOPT_USERPWD, "username:password"); //Your credentials goes here
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_POST, true);
curl_setopt($curl, CURLOPT_POSTFIELDS, $curl_post_data);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false); //IMP if the url has https and you don't want to verify source certificate

$curl_response = curl_exec($curl);
$response = json_decode($curl_response);
curl_close($curl);

var_dump($response);
Rao
sumber
64

Ini bekerja untuk saya:

 curl -H "Authorization: Token xxxxxxxxxxxxxx" https://www.example.com/
timj98
sumber
apa yang kamu gunakan untuk JWT?
Ciasto piekarz
1
Bukankah maksud Anda Authorization: bearer xxxxxxxxx?
jlh
@ jlh maksudmuBearer
Daniel W.
Saya hampir yakin itu case-insensitive, tapi sepertinya saya salah. Ya saya maksudkan Bearer.
jlh
20

Untuk HTTP Basic Auth:

curl -H "Authorization: Basic <_your_token_>" http://www.example.com

ganti _your_token_dan URL-nya.

Devaroop
sumber
Saat menggunakan oauth dari mana token Otorisasi akan berasal? Saya mencoba menggunakan curl untuk mengunduh file dari situs tempat saya menggunakan pengguna dan kata sandi tetapi tampaknya gagal karena oauth2 digunakan.
ctrl-alt-delete
@ toasteez Anda harus melalui alur Oauth2 untuk menerima token. Biasanya ini proses dua langkah dan harus dirinci dalam dokumentasi server.
Devaroop
13
jawaban yang bagus. pembantu kecil echo -ne "<your-user>:<your-pass>" | base64 --wrap 0akan menghasilkan token autentikasi dasar.
Mike D
3
@MikeD -H "Authorization: Basic <_your_token_>"melakukan efek yang sama dengan --user login:password. Anda dapat memeriksanya dengancurl -v
vladkras
1
@vladkras tanggapan saya adalah penolong untuk jawaban ini. dalam pengalaman saya, lebih baik untuk memahami cara membuat token daripada mengandalkan curl untuk menghasilkannya.
Mike D
14

Hati-hati saat Anda menggunakan: curl -H "Authorization: token_str" http://www.example.com

token_strdan Authorizationharus dipisahkan oleh ruang putih, jika tidak sisi server tidak akan mendapatkan HTTP_AUTHORIZATIONlingkungan.

jianpx
sumber
2
Tidak benar, jika ruang putih diperlukan, server HTTP Anda rusak. Anda juga perlu dua string tipe dan kemudian token.
Alexis Wilke
5

Jika Anda tidak memiliki token pada saat panggilan dilakukan, Anda harus melakukan dua panggilan, satu untuk mendapatkan token dan yang lainnya untuk mengekstrak token dari respons, perhatikan

grep token | cut -d, -f1 | cut -d \ "-f4

karena itu adalah bagian yang berurusan dengan mengekstraksi token dari respons.

echo "Getting token response and extracting token"    
def token = sh (returnStdout: true, script: """
    curl -S -i -k -X POST https://www.example.com/getToken -H \"Content-Type: application/json\" -H \"Accept: application/json\" -d @requestFile.json | grep token | cut -d, -f1 | cut -d\\" -f4
""").split()

Setelah mengekstrak token, Anda dapat menggunakan token untuk melakukan panggilan berikutnya sebagai berikut.

echo "Token : ${token[-1]}"       
echo "Making calls using token..."       
curl -S -i -k  -H "Accept: application/json" -H "Content-Type: application/json" -H "Authorization: Bearer ${token[-1]}" https://www.example.com/api/resources 
Upul Doluweera
sumber