วิธีการตั้งค่าส่วนหัวการอนุญาตโดยใช้ curl


คำตอบ:


394

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

ดูส่วนที่ 6 การพิสูจน์ตัวตน HTTP

การตรวจสอบสิทธิ์ HTTP

การตรวจสอบสิทธิ์ HTTP คือความสามารถในการบอกเซิร์ฟเวอร์ชื่อผู้ใช้และรหัสผ่านของคุณเพื่อให้สามารถตรวจสอบว่าคุณได้รับอนุญาตให้ทำตามคำขอที่คุณทำ การรับรองความถูกต้องเบื้องต้นที่ใช้ใน HTTP (ซึ่งเป็นประเภท curl ที่ใช้โดยค่าเริ่มต้น) เป็นข้อความธรรมดา ใช้ซึ่งหมายความว่าจะส่งชื่อผู้ใช้และรหัสผ่านที่สับสนเล็กน้อยเท่านั้น แต่ยังคงสามารถอ่านได้อย่างสมบูรณ์โดยทุกคนที่สูดดม

หากต้องการบอก curl ให้ใช้ผู้ใช้และรหัสผ่านสำหรับการตรวจสอบสิทธิ์:

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

ไซต์อาจต้องการวิธีการรับรองความถูกต้องที่แตกต่างกัน (ตรวจสอบส่วนหัวที่ส่งคืนโดยเซิร์ฟเวอร์) จากนั้น --ntlm, --digest, - เจรจาต่อรองหรือแม้กระทั่ง - anyauth อาจเป็นตัวเลือกที่เหมาะกับคุณ

บางครั้งการเข้าถึง HTTP ของคุณจะมีให้เฉพาะผ่านการใช้พร็อกซี HTTP เรื่องนี้ดูเหมือนจะเป็นเรื่องธรรมดาโดยเฉพาะอย่างยิ่งใน บริษัท ต่าง ๆ พร็อกซี HTTP อาจต้องการผู้ใช้และรหัสผ่านของตัวเองเพื่ออนุญาตให้ไคลเอนต์สามารถเข้าถึงอินเทอร์เน็ตได้ หากต้องการระบุผู้ที่มี curl ให้เรียกใช้ดังนี้:

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

หากพร็อกซีของคุณต้องการการรับรองความถูกต้องให้ทำโดยใช้วิธี NTLM ให้ใช้ --proxy-ntlm หากต้องการการใช้ Digest --proxy-digest

หากคุณใช้ตัวเลือกผู้ใช้ + รหัสผ่านเหล่านี้ แต่ไม่ได้ใส่ส่วนรหัสผ่าน Curl จะแจ้งให้ใส่รหัสผ่านแบบโต้ตอบ

โปรดทราบว่าเมื่อโปรแกรมทำงานพารามิเตอร์ของมันอาจเป็นไปได้ที่จะเห็นเมื่อแสดงรายการกระบวนการที่กำลังทำงานของระบบ ดังนั้นผู้ใช้รายอื่นอาจสามารถดูรหัสผ่านของคุณหากคุณผ่านตัวเลือกเหล่านี้เป็นบรรทัดคำสั่งธรรมดา มีวิธีหลีกเลี่ยงสิ่งนี้

เป็นที่น่าสังเกตว่าแม้ว่านี่จะเป็นวิธีการตรวจสอบสิทธิ์ HTTP แต่เว็บไซต์จำนวนมากจะไม่ใช้แนวคิดนี้เมื่อมีการลงชื่อเข้าใช้และอื่น ๆ โปรดดูบทการเข้าสู่ระบบทางเว็บด้านล่างเพื่อดูรายละเอียดเพิ่มเติม


16
@Vixed คำถามนี้ไม่ชัดเจนเกี่ยวกับ PHP [มีอะไรผิดปกติกับผลลัพธ์ของ Google] (s)
Oli

คำถามเกี่ยวกับการอนุญาตไม่ใช่การตรวจสอบดังนั้นบางที OP ควรเปลี่ยนชื่อคำถาม
jam

320

เพียงเพิ่มเพื่อให้คุณไม่ต้องคลิกผ่าน:

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

หรือถ้าคุณพยายามส่งการตรวจสอบสิทธิ์สำหรับ OAuth 2:

curl -H "Authorization: OAuth <ACCESS_TOKEN>" http://www.example.com

15
ตอนนี้ API จำนวนมากใช้โทเค็นการอนุมัติส่วนหัวแล้ว -Hตัวเลือกที่ดี
eliocs

14
หากคุณใช้ -u หรือ --user Curl จะเข้ารหัสข้อมูลประจำตัวใน Base64 และสร้างส่วนหัวเช่นนี้:-H Authorization: Basic <Base64EncodedCredentials>
Timothy Kanski

ฉันกำลังพยายามเพิ่มส่วนหัวการให้สิทธิ์ด้วยHMAC-SHA256การรับข้อผิดพลาดของส่วนหัวการอนุญาตที่ขาดหายไปเสมอ
Steven Aguilar

2
นอกจากนี้หากคุณต้องการ<Base64EncodedCredentials>ดังกล่าวโดย @ ทิโมธี-kansaki, cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.comคุณจะได้รับการเข้ารหัสข้อมูลประจำตัวที่ใช้คำสั่ง: สำหรับการอ้างอิงดูstackoverflow.com/questions/16918602/…
David Golembiowski

170

โทเค็นผู้ถือมีลักษณะเช่นนี้:

curl -H "Authorization: Bearer <ACCESS_TOKEN>" http://www.example.com

7
และหากคุณกำลังมองหาการอนุญาต 'พื้นฐาน' เพียงแค่เปลี่ยน 'ผู้ถือ' สำหรับ 'พื้นฐาน'
darren

ฉันมีสิ่งที่แปลกประหลาดที่สุดฉันได้รับ "รูปแบบส่วนหัวที่ไม่ถูกต้อง" และ "HTTP-200" ดังนั้นเซิร์ฟเวอร์ยอมรับการอนุญาตของฉัน แต่รูปแบบนั้นผิดหรือเปล่า?
Groostav

64

(สำหรับผู้ที่กำลังมองหาคำตอบ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);

64

สิ่งนี้ใช้ได้กับฉัน:

 curl -H "Authorization: Token xxxxxxxxxxxxxx" https://www.example.com/

คุณใช้ JWT ทำอะไร
Ciasto piekarz

1
คุณไม่หมายถึงAuthorization: bearer xxxxxxxxxเหรอ
jlh

@jlh คุณหมายถึงBearer
Daniel W.

ฉันเกือบจะแน่ใจว่ามันเป็นตัวพิมพ์เล็กและตัวพิมพ์ใหญ่ แต่ดูเหมือนว่าฉันผิด Bearerใช่ฉันหมายถึง
jlh

20

สำหรับ HTTP Auth พื้นฐาน:

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

แทนที่_your_token_และ URL


เมื่อใช้ oauth โทเค็นการอนุญาตมาจากที่ใด ฉันกำลังพยายามใช้ curl เพื่อดาวน์โหลดไฟล์จากเว็บไซต์ที่ฉันใช้ผู้ใช้และรหัสผ่าน แต่ดูเหมือนว่าจะล้มเหลวเนื่องจาก oauth2 ใช้งานอยู่
ctrl-alt-delete

@toasteez คุณต้องผ่านโฟลว์ Oauth2 เพื่อรับโทเค็น โดยทั่วไปแล้วเป็นกระบวนการสองขั้นตอนและควรมีรายละเอียดในเอกสารของเซิร์ฟเวอร์
Devaroop

13
คำตอบที่ดี. ผู้ช่วยขนาดเล็กecho -ne "<your-user>:<your-pass>" | base64 --wrap 0จะสร้างโทเค็นการตรวจสอบสิทธิ์ขั้นพื้นฐาน
Mike D

3
@MikeD ไม่ผลเช่นเดียวกับ-H "Authorization: Basic <_your_token_>" --user login:passwordคุณสามารถตรวจสอบกับcurl -v
vladkras

1
@ vladkras คำตอบของฉันเป็นผู้ช่วยสำหรับคำตอบนี้ ในประสบการณ์ของฉันมันจะดีกว่าที่จะเข้าใจวิธีการสร้างโทเค็นแทนการพึ่งพาขดเพื่อสร้างมัน
Mike D

14

ระวังว่าเมื่อคุณใช้: curl -H "Authorization: token_str" http://www.example.com

token_strและAuthorizationต้องคั่นด้วย white space มิฉะนั้นฝั่งเซิร์ฟเวอร์จะไม่ได้รับHTTP_AUTHORIZATIONสภาพแวดล้อม


2
ไม่เป็นความจริงหากต้องการพื้นที่สีขาวเซิร์ฟเวอร์ HTTP ของคุณเสีย นอกจากนี้คุณต้องมีสองสายประเภทและโทเค็น
Alexis Wilke

5

หากคุณไม่มีโทเค็นในขณะที่ทำการโทรคุณจะต้องทำการโทรสองครั้งหนึ่งครั้งเพื่อรับโทเค็นและอีกอันเพื่อแยกโทเค็นแบบฟอร์มการตอบกลับให้ใส่ใจกับ

โทเค็น grep ตัด -d, -f1 | ตัด -d \ "-f4

เนื่องจากเป็นส่วนที่เกี่ยวข้องกับการแยกโทเค็นออกจากการตอบสนอง

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()

หลังจากแยกโทเค็นคุณสามารถใช้โทเค็นเพื่อโทรตามมาดังนี้

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 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.