Xác thực mã thông báo mang và HTTP cơ bản


115

Tôi hiện đang phát triển REST-API được bảo vệ HTTP-Basic cho môi trường phát triển. Vì xác thực thực được thực hiện thông qua mã thông báo, tôi vẫn đang cố gắng tìm ra cách gửi hai tiêu đề ủy quyền.

Tôi đã thử cái này:

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Authorization: Bearer mytoken123"

Ví dụ, tôi có thể vô hiệu hóa Xác thực HTTP cho IP của mình nhưng vì tôi thường làm việc trong các môi trường khác nhau với các IP động, đây không phải là một giải pháp tốt. Vậy tôi có thiếu gì không?


2
Tôi cần xác thực qua HTTP Basic vì máy chủ Dev được bảo vệ bằng nó và tôi cần xác thực dựa trên mã thông báo cho api. Nhưng khi tôi sử dụng curl để kiểm tra api, tôi cần một cách để gửi cả hai tiêu đề xác thực. Vì vậy, cái đầu tiên (cơ bản) để chuyển HTTP Basic và cái thứ hai (mã thông báo) để xác thực cho ứng dụng của tôi. Và vâng, nó là do chính tôi tạo ra.
Azngeek

1
Bạn đã bao giờ tìm ra điều này? Tôi thêm một bounty
Adam Waite

4
Xin chào Adam, rất tiếc là không. Bây giờ tôi đã thay đổi cách xác thực hoạt động bằng cách thay đổi Tiêu đề ủy quyền cho mã thông báo thành "x-auth", đây không phải là tiêu đề chuẩn.
Azngeek

1
Máy chủ nginx của tôi thậm chí sẽ không chấp nhận 2 tiêu đề Ủy quyền. Nó trả về a 400 Bad request. Ngớ ngẩn.
Rudie

1
Có gì sai khi sử dụng tiêu đề tùy chỉnh cho mã thông báo API của bạn? Tôi không hiểu tại sao mọi người ở đây lại "loại bỏ" việc sử dụng HTTP Basic Auth để giữ cho các máy chủ phát triển / dàn dựng của họ tránh khỏi những con mắt tò mò.
Sunil D.

Câu trả lời:


68

Hãy thử cái này để đẩy xác thực cơ bản tại url:

curl -i http://username:password@dev.myapp.com/api/users -H "Authorization: Bearer mytoken123"
               ^^^^^^^^^^^^^^^^^^

Nếu ở trên không hoạt động, thì bạn không có gì để làm với nó. Vì vậy, hãy thử các cách thay thế sau.

Bạn có thể chuyển mã thông báo dưới một tên khác. Vì bạn đang xử lý ủy quyền từ Ứng dụng của mình. Vì vậy, bạn có thể dễ dàng sử dụng linh hoạt này cho mục đích đặc biệt này.

curl -i http://dev.myapp.com/api/users \
  -H "Authorization: Basic Ym9zY236Ym9zY28=" \
  -H "Application-Authorization: mytoken123"

Lưu ý rằng tôi đã thay đổi tiêu đề thành Application-Authorization. Vì vậy, từ ứng dụng của bạn, bắt mã thông báo dưới tiêu đề đó và xử lý những gì bạn cần làm.

Một điều khác bạn có thể làm là chuyển tokenqua các POSTtham số và lấy giá trị của tham số từ phía Server. Ví dụ: truyền mã thông báo với tham số curl post:

-d "auth-token=mytoken123"

1
Xin chào Sabuj, vấn đề không phải là cách bạn chuyển tên người dùng và mật khẩu mà là nhiều tiêu đề ủy quyền không hoạt động. Nhìn vào thông số kỹ thuật ( ietf.org/rfc/rfc2617.txt ), tôi có thể thấy rằng điều này sẽ khả thi. Nhưng như đã nêu "" Tác nhân người dùng PHẢI chọn sử dụng một trong những thử thách với sơ đồ xác thực mạnh nhất mà nó hiểu và yêu cầu thông tin xác thực từ người dùng dựa trên thử thách đó. "Vì vậy, giống như tôi đã viết 2 ngày trước, tôi cần phải vượt qua dấu hiệu để một tiêu đề phi tiêu chuẩn đó là hoàn toàn ổn khi bạn đối phó với kiến trúc phi tiêu chuẩn.
Azngeek

5
@Azngeek Curl gửi cả tiêu đề ủy quyền khi bạn thực hiện tác vụ. Bạn cần xử lý nó từ đầu máy chủ của mình. Chỉ cần chạy lệnh curl của bạn với cả hai tiêu đề có -vparam. Bạn sẽ thấy rằng nó đang gửi Authorization: Basic Ym9zY236Ym9zY28=, Authorization: Bearer mytoken123theo tiêu đề yêu cầu. Từ đầu máy chủ của bạn, nếu bạn kiểm tra, bạn sẽ thấy rằng bạn có tiêu đề Ủy quyền như cách này được Authorization: Basic Ym9zY236Ym9zY28=, Bearer mytoken123phân tách bằng dấu phẩy. Vì vậy, tôi nên đề nghị bạn thay thế.
Sabuj Hassan

34

Standard ( https://tools.ietf.org/html/rfc6750 ) cho biết bạn có thể sử dụng:

  • Thông số cơ thể được mã hóa biểu mẫu: Ủy quyền: Bearer mytoken123
  • Tham số truy vấn URI: access_token = mytoken123

Vì vậy, có thể vượt qua nhiều Bearer Token với URI, nhưng làm điều này không được khuyến khích (xem phần 5 trong tiêu chuẩn).


4

Nếu bạn đang sử dụng proxy ngược như nginx ở giữa, bạn có thể xác định mã thông báo tùy chỉnh, chẳng hạn như X-API-Token.

Trong nginx, bạn sẽ viết lại nó để proxy ngược dòng (api còn lại của bạn) chỉ là xác thực:

proxy_set_header Authorization $http_x_api_token;

... trong khi nginx có thể sử dụng tiêu đề Ủy quyền ban đầu để kiểm tra HTTP AUth.


3

Tôi đã gặp sự cố tương tự - xác thực thiết bị và người dùng trên thiết bị. Tôi đã sử dụng một Cookietiêu đề cùng với một Authorization: Bearer...tiêu đề.


Không rõ tại sao downvote. Tôi gặp câu hỏi này để tìm kiếm câu trả lời cho một vấn đề liên quan - đây là cách tôi giải quyết nó. Các Cookietiêu đề đã được thường được sử dụng để xác thực.
Iiridayn

2

curl --anyauth

Yêu cầu curl tự tìm ra phương pháp xác thực và sử dụng phương pháp bảo mật nhất mà trang web từ xa tuyên bố sẽ hỗ trợ. Điều này được thực hiện trước tiên bằng cách thực hiện một yêu cầu và kiểm tra các tiêu đề phản hồi, do đó có thể tạo ra một mạng bổ sung khứ hồi. Điều này được sử dụng thay vì đặt một phương thức xác thực cụ thể, mà bạn có thể thực hiện với --basic, --digest, --ntlm và --negotiate.


1

Có một giải pháp khác để kiểm tra API trên máy chủ phát triển.

  • Chỉ đặt HTTP Basic Authenticationcho các tuyến web
  • Để tất cả các tuyến API không bị xác thực

Cấu hình máy chủ web cho nginxLaravelsẽ như thế này:

    location /api {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location / {
        try_files $uri $uri/ /index.php?$query_string;

        auth_basic "Enter password";
        auth_basic_user_file /path/to/.htpasswd;
    }

Authorization: Bearer sẽ thực hiện công việc bảo vệ máy chủ phát triển trước trình thu thập dữ liệu web và những người truy cập không mong muốn khác.


0

Với nginx, bạn có thể gửi cả hai mã thông báo như thế này (mặc dù nó trái với tiêu chuẩn):

Authorization: Basic basic-token,Bearer bearer-token

Điều này hoạt động miễn là mã thông báo cơ bản là đầu tiên - nginx chuyển tiếp thành công nó đến máy chủ ứng dụng.

Và sau đó bạn cần đảm bảo rằng ứng dụng của bạn có thể trích xuất Bearer từ chuỗi trên một cách chính xác.

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.