Cách đặt tiêu đề ủy quyền bằng cách sử dụng curl


397

Làm cách nào để vượt qua tiêu đề ủy quyền bằng cURL? (thực thi trong /usr/bin/curl).

Câu trả lời:


394

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

Xem phần 6. Xác thực HTTP

Xác thực HTTP

Xác thực HTTP là khả năng cho máy chủ biết tên người dùng và mật khẩu của bạn để nó có thể xác minh rằng bạn được phép thực hiện yêu cầu bạn đang thực hiện. Xác thực cơ bản được sử dụng trong HTTP (loại curl sử dụng theo mặc định) là văn bản thuần túy , có nghĩa là nó chỉ gửi tên người dùng và mật khẩu hơi bị xáo trộn, nhưng vẫn có thể đọc được hoàn toàn bởi bất kỳ ai đánh hơi trên mạng giữa bạn và máy chủ từ xa.

Để báo cho curl sử dụng người dùng và mật khẩu để xác thực:

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

Trang web có thể yêu cầu một phương thức xác thực khác (kiểm tra các tiêu đề được máy chủ trả về) và sau đó --ntlm, --digest, --negotiate hoặc thậm chí --anyauth có thể là các tùy chọn phù hợp với bạn.

Đôi khi quyền truy cập HTTP của bạn chỉ khả dụng thông qua việc sử dụng proxy HTTP. Điều này dường như đặc biệt phổ biến tại các công ty khác nhau. Một proxy HTTP có thể yêu cầu người dùng và mật khẩu riêng của mình để cho phép khách hàng truy cập Internet. Để chỉ định những người có curl, hãy chạy một cái gì đó như:

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

Nếu proxy của bạn yêu cầu xác thực được thực hiện bằng phương pháp NTLM, hãy sử dụng --proxy-ntlm, nếu nó yêu cầu Digest sử dụng --proxy-digest.

Nếu bạn sử dụng bất kỳ tùy chọn người dùng + mật khẩu nào nhưng bỏ phần mật khẩu, curl sẽ nhắc nhập mật khẩu một cách tương tác.

Xin lưu ý rằng khi một chương trình được chạy, các tham số của nó có thể được nhìn thấy khi liệt kê các quy trình đang chạy của hệ thống. Do đó, những người dùng khác có thể xem mật khẩu của bạn nếu bạn chuyển chúng dưới dạng tùy chọn dòng lệnh đơn giản. Có nhiều cách để phá vỡ điều này.

Điều đáng chú ý là mặc dù đây là cách HTTP xác thực hoạt động, rất nhiều trang web sẽ không sử dụng khái niệm này khi họ cung cấp thông tin đăng nhập, v.v. Xem thêm chương Đăng nhập web bên dưới để biết thêm chi tiết về điều đó.


16
@Vixed Câu hỏi này rõ ràng không phải về PHP. [Có gì sai với kết quả của Google] (s)?
Oli

Câu hỏi là về Ủy quyền không xác thực, vì vậy có lẽ OP nên thay đổi tiêu đề của câu hỏi
kẹt

320

Chỉ cần thêm để bạn không phải nhấp qua:

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

hoặc nếu bạn đang cố gửi xác thực cho OAuth 2:

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

15
Nhiều API hiện sử dụng mã thông báo ủy quyền tiêu đề. Các -Htùy chọn là tuyệt vời.
eliocs

14
Nếu bạn sử dụng -u hoặc --user, Curl sẽ mã hóa thông tin đăng nhập vào Base64 và tạo một tiêu đề như thế này:-H Authorization: Basic <Base64EncodedCredentials>
Timothy Kanski

Tôi đang cố gắng thêm tiêu đề ủy quyền mà HMAC-SHA256luôn gặp lỗi về tiêu đề ủy quyền bị thiếu
Steven Aguilar

2
Ngoài ra, nếu bạn cần <Base64EncodedCredentials>được đề cập bởi @ timothy-kansaki, bạn có thể nhận thông tin được mã hóa bằng lệnh : cred="$( echo $NAME:$PASSWORD | base64 )"; curl -H "Authorization: Basic $cred" https://example.com. Để tham khảo, xem stackoverflow.com/questions/16918602/
Mạnh

170

Mã thông báo mang giống như thế này:

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

7
Và nếu bạn đang muốn thực hiện ủy quyền 'Cơ bản', chỉ cần trao đổi 'Người mang' cho 'Cơ bản'
một người yêu dấu

Tôi đã có một điều kỳ lạ nhất, tôi đang nhận được "Định dạng sai của tiêu đề ủy quyền" và "HTTP-200". Vì vậy, máy chủ chấp nhận ủy quyền của tôi, nhưng định dạng là sai?
Groostav

65

(dành cho những người đang tìm kiếm câu trả lời 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

Điều này làm việc cho tôi:

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

Bạn đang sử dụng gì cho JWT?
Ciasto piekarz

1
Ý bạn là Authorization: bearer xxxxxxxxxsao?
jlh

@jlh ý bạn làBearer
Daniel W.

Tôi gần như chắc chắn rằng nó không phân biệt chữ hoa chữ thường, nhưng có vẻ như tôi đã sai. Có, tôi có nghĩa Bearer.
jlh

20

Đối với Xác thực cơ bản HTTP:

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

thay thế _your_token_và URL.


Khi sử dụng oauth, mã thông báo ủy quyền sẽ đến từ đâu? Tôi đang cố gắng sử dụng curl để tải xuống các tệp từ một trang web nơi tôi sử dụng người dùng và mật khẩu nhưng có vẻ như nó bị lỗi do sử dụng oauth2.
ctrl-alt-xóa

@toasteez bạn phải đi qua luồng Oauth2 để nhận mã thông báo. Thông thường, đây là quy trình gồm hai bước và cần được nêu chi tiết trong tài liệu của máy chủ.
Devaroop

13
câu trả lời tốt. một người trợ giúp nhỏ echo -ne "<your-user>:<your-pass>" | base64 --wrap 0sẽ tạo mã thông báo xác thực cơ bản.
Mike D

3
@MikeD -H "Authorization: Basic <_your_token_>"có tác dụng tương tự như --user login:password. Bạn có thể kiểm tra nó vớicurl -v
vladkras

1
@vladkras câu trả lời của tôi là một người trợ giúp cho câu trả lời này. theo kinh nghiệm của tôi, tốt hơn là hiểu cách tạo mã thông báo thay vì dựa vào curl để tạo ra nó.
Mike D

14

Hãy cẩn thận khi bạn sử dụng: curl -H "Authorization: token_str" http://www.example.com

token_strAuthorizationphải được phân tách bằng khoảng trắng, nếu không phía máy chủ sẽ không nhận được HTTP_AUTHORIZATIONmôi trường.


2
Không đúng, nếu cần một khoảng trắng, máy chủ HTTP của bạn bị hỏng. Ngoài ra, bạn cần hai chuỗi một loại và sau đó là mã thông báo.
Alexis Wilke

5

Nếu bạn không có mã thông báo tại thời điểm cuộc gọi được thực hiện, Bạn sẽ phải thực hiện hai cuộc gọi, một cuộc gọi để nhận mã thông báo và cuộc gọi khác để trích xuất mã thông báo, hãy chú ý đến

mã thông báo grep | cắt -d, -f1 | cắt -d \ "-f4

vì nó là phần liên quan đến việc trích xuất mã thông báo từ phản hồi.

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

Sau khi trích xuất mã thông báo, bạn có thể sử dụng mã thông báo để thực hiện các cuộc gọi tiếp theo như sau.

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 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.