Làm cách nào để xác định chính xác xác thực HTTP bằng cURL?


161

Tôi đang học Apigility ( Apigility docu -> REST Service Tutorial ) và cố gắng gửi yêu cầu POST với xác thực cơ bản qua cURL:

$ curl -X POST -i -H "Content-Type: application/hal+json" -H "Authorization: Basic YXBpdXNlcjphcGlwd2Q=" http://apigilityhw.sandbox.loc/status

YXBpdXNlcjphcGlwd2Q=là chuỗi 64 được mã hóa cơ sở với thông tin đăng nhập của tôi apiuser:apipwd. Thông tin đăng nhập được lưu trong /data/htpasswd( apiuser:$apr1$3J4cyqEw$WKga3rQMkxvnevMuBaekg/).

Trông như thế này:

HTTP/1.1 401 Unauthorized
Server: nginx/1.4.7
Date: Mon, 22 Sep 2014 07:48:47 GMT
Content-Type: application/problem+json
Transfer-Encoding: chunked
Connection: keep-alive
X-Powered-By: PHP/5.5.12-1~dotdeb.1
WWW-Authenticate: Basic realm="api"

Lỗi ở đây là ở đâu? Làm thế nào để nó hoạt động?

Câu trả lời:


291
curl -u username:password http://
curl -u username http://

Từ trang tài liệu:

-u, - người dùng <người dùng: mật khẩu>

Chỉ định tên người dùng và mật khẩu để sử dụng cho xác thực máy chủ. Ghi đè -n, --netrc và --netrc-tùy chọn.

Nếu bạn chỉ cần chỉ định tên người dùng, curl sẽ nhắc nhập mật khẩu.

Tên người dùng và mật khẩu được chia ra trên dấu hai chấm đầu tiên, điều này khiến cho không thể sử dụng dấu hai chấm trong tên người dùng với tùy chọn này. Mật khẩu có thể, vẫn còn.

Khi sử dụng Kerberos V5 với máy chủ chạy Windows, bạn nên bao gồm tên miền Windows trong tên người dùng, để máy chủ thành công có được Vé Kerberos. Nếu bạn không thì bắt tay xác thực ban đầu có thể thất bại.

Khi sử dụng NTLM, tên người dùng có thể được chỉ định đơn giản là tên người dùng, không có tên miền, nếu có một tên miền và rừng trong thiết lập của bạn chẳng hạn.

Để chỉ định tên miền, hãy sử dụng các định dạng Tên đăng nhập cấp thấp hoặc UPN (Tên gốc của người dùng). Ví dụ: EXAMPLE \ user và user@example.com tương ứng.

Nếu bạn sử dụng nhị phân curl hỗ trợ Windows SSPI và thực hiện xác thực Kerberos V5, đàm phán, NTLM hoặc Digest thì bạn có thể yêu cầu curl chọn tên người dùng và mật khẩu từ môi trường của mình bằng cách chỉ định một dấu hai chấm với tùy chọn này: "-u:" .

Nếu tùy chọn này được sử dụng nhiều lần, cái cuối cùng sẽ được sử dụng.

http://curl.haxx.se/docs/manpage.html#-u

Lưu ý rằng bạn không cần --basiccờ vì nó là mặc định.


14
Nếu mật khẩu của bạn có chứa một số ký tự đặc biệt như thế nào? hoặc @ sau đó bạn phải đặt nó vào một tích tắc. curl -u 'tên người dùng :? p @ ssword' http: //
Mirko Ebert

2
Nhưng yêu cầu thực tế này trông như thế nào? Tôi cảm thấy rất nhiều người thử nghiệm với curl nhưng sau đó viết mã ect bằng bất cứ ngôn ngữ nào họ sử dụng. thông tin --user có được gửi làm tiêu đề không? Nếu vậy thì tiêu đề đó sẽ như thế nào
Verty00

@GautamKathrotiya trong Postman có một tùy chọn Auth cơ bản trong tab Ủy quyền của một yêu cầu, nó sẽ chèn tiêu đề Ủy quyền này cho bạn.
Kyle Calica-St

1
@ Verty00 bạn có thể sử dụng cờ -v với curl để xem nội dung yêu cầu.
Zach

17

làm tiêu đề

AUTH=$(echo -ne "$BASIC_AUTH_USER:$BASIC_AUTH_PASSWORD" | base64 --wrap 0)

curl \
  --header "Content-Type: application/json" \
  --header "Authorization: Basic $AUTH" \
  --request POST \
  --data  '{"key1":"value1", "key2":"value2"}' \
  https://example.com/
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.