Tiêu đề ủy quyền HTTP tùy chỉnh


124

Tôi đã tự hỏi liệu có thể chấp nhận để đưa dữ liệu tùy chỉnh vào tiêu đề ủy quyền HTTP hay không. Chúng tôi đang thiết kế API RESTful và chúng tôi có thể cần một cách để chỉ định phương thức ủy quyền tùy chỉnh. Ví dụ, hãy gọi nó là FIRE-TOKENxác thực.

Điều gì đó như thế này sẽ hợp lệ và được cho phép theo thông số kỹ thuật: Authorization: FIRE-TOKEN 0PN5J17HBGZHT7JJ3X82:frJIUN8DYpKDtOLCwo//yllqDzg=

Phần đầu tiên của chuỗi thứ hai (trước ':') là khóa API, phần thứ hai là hàm băm của chuỗi truy vấn.

Câu trả lời:


133

Định dạng được định nghĩa trong RFC2617credentials = auth-scheme #auth-param. Vì vậy, khi đồng ý với fumanchu, tôi nghĩ rằng kế hoạch ủy quyền đã sửa sẽ giống như

Authorization: FIRE-TOKEN apikey="0PN5J17HBGZHT7JJ3X82", hash="frJIUN8DYpKDtOLCwo//yllqDzg="

Trường hợp FIRE-TOKENlược đồ và hai cặp khóa-giá trị là các tham số auth. Mặc dù tôi tin rằng các trích dẫn là tùy chọn (từ Phụ lục B của p7-auth-19) ...

auth-param = token BWS "=" BWS ( token / quoted-string )

Tôi tin rằng điều này phù hợp với các tiêu chuẩn mới nhất, đã được sử dụng (xem bên dưới) và cung cấp định dạng khóa-giá trị cho tiện ích mở rộng đơn giản (nếu bạn cần thêm tham số).

Một số ví dụ về cú pháp auth-param này có thể được nhìn thấy ở đây ...

http://tools.ietf.org/html/draft-ietf-httpbis-p7-auth-19#section-4.4

https://developers.google.com/youtube/2.0/developftimeguide_protatio_clientlogin

https://developers.google.com/accounts/docs/AuthSub#WorkingAuthSub


4
API lưu trữ đơn giản của Amazon cung cấp một ví dụ khác.
giám mục

18

Đặt nó trong một tiêu đề riêng, tùy chỉnh.

Quá tải các tiêu đề HTTP tiêu chuẩn có thể sẽ gây ra nhiều nhầm lẫn hơn giá trị của nó và sẽ vi phạm nguyên tắc ít gây bất ngờ nhất . Nó cũng có thể dẫn đến các vấn đề về khả năng tương tác cho các lập trình viên máy khách API của bạn, những người muốn sử dụng bộ công cụ sẵn có chỉ có thể xử lý dạng tiêu đề HTTP tiêu chuẩn (như Authorization).


3
Điều này có thể khó để có được đúng hơn nó xuất hiện. Liên kết mà fumanchu cung cấp (trong một bình luận cho câu trả lời của anh ấy) giải thích lý do tại sao việc giới thiệu một tiêu đề tùy chỉnh lại thêm gánh nặng bây giờ phải đặt thủ công Cache-Control một cách chính xác.
Jon-Eric

4
Ngoài ra, nếu bạn đang thực hiện một yêu cầu xuất xứ chéo thông qua trình duyệt, bạn hiện đang ở trong lãnh thổ trước chuyến bay chỉ vì tiêu đề tùy chỉnh mà bạn có thể tránh được. Đối với các ứng dụng nhất định, các yêu cầu này cộng lại.
Wil Moore III

31
Rất lớn không có tiêu đề xác thực tùy chỉnh. Tiêu Authorizationđề tiêu chuẩn với sơ đồ tùy chỉnh của riêng bạn là quá đủ. Ngoài ra, bạn tránh các yêu cầu Xuất xứ trước chuyến bay như @wilmoore chỉ ra. Các lược đồ tùy chỉnh không can thiệp vào bất kỳ máy chủ HTTP hiện đại hợp lý nào mà tôi biết, cộng với nếu bạn sử dụng lược đồ của riêng mình, bạn sẽ phải tự phân tích nó - không có thư viện nào xung đột (nếu không thư viện được viết kém).
Les Hazlewood

7
Một lý do chính đáng để truyền thông tin xác thực trong Authorizationtiêu đề, thay vì trong tiêu đề tùy chỉnh, đó là proxy và logger biết xử lý thông tin là nhạy cảm.
Eron Wright

15

Không, đó không phải là sản phẩm hợp lệ theo định nghĩa "thông tin đăng nhập" trong RFC 2617 . Bạn đưa ra một lược đồ xác thực hợp lệ, nhưng các giá trị auth-param phải có dạng token "=" ( token | quoted-string )(xem phần 1.2) và ví dụ của bạn không sử dụng "=" theo cách đó.


1
Điều đó không đúng. Xem trang 5 của tài liệu để biết định dạng ví dụ: Ủy quyền: QWxhZGRpbjpvcGVuIHNlc2FtZQ ==
NRaf

11
Đúng. Nhưng như tools.ietf.org/html/draft-ietf-httpbis-p7-auth-16#section-2.3.1 nói, ký hiệu "b64token" đã được giới thiệu để tương thích với các lược đồ xác thực hiện có và chỉ có thể được sử dụng một lần cho mỗi Do đó, các lược đồ mới phải sử dụng cú pháp "auth-param", vì nếu không các tiện ích mở rộng trong tương lai sẽ không thể thực hiện được. " Xem thêm các cuộc thảo luận về bộ đệm ở đó liên quan đến việc thực hiện auth trong các tiêu đề tùy chỉnh.
fumanchu

9

Câu hỏi cũ tôi biết, nhưng đối với người tò mò:

Dù bạn có tin hay không, vấn đề này đã được giải quyết ~ 2 thập kỷ trước với HTTP BASIC, vượt qua giá trị dưới dạng tên người dùng được mã hóa base64: mật khẩu. (Xem http://en.wikipedia.org/wiki/Basic_access_authentication#Client_side )

Bạn có thể làm tương tự, để ví dụ trên sẽ trở thành:

Authorization: FIRE-TOKEN MFBONUoxN0hCR1pIVDdKSjNYODI6ZnJKSVVOOERZcEtEdE9MQ3dvLy95bGxxRHpnPQ==

4
Tôi sẽ khuyên bạn không nên trả lời câu hỏi này, vì, mỗi nhận xét về một câu trả lời khác ở đây , ký hiệu được sử dụng ở đây là để tương thích với các chương trình hiện có và không được khuyến nghị cho các tiện ích mở rộng mới.
Whymarrh
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.