Có một số lược đồ để xác thực yêu cầu API và chúng khác với xác thực thông thường được cung cấp bởi plugin như restful_authentication hoặc actions_as_authenticated. Quan trọng nhất, khách hàng sẽ không duy trì phiên, vì vậy không có khái niệm về đăng nhập.
HTTP Authentication
Bạn có thể sử dụng xác thực HTTP cơ bản. Đối với điều này, khách hàng của API sẽ sử dụng một tên người dùng và mật khẩu thường xuyên và chỉ cần đặt nó trong URL như vậy:
http://myusername:[email protected]/
Tôi tin restful_authentication hỗ trợ này ra khỏi hộp, vì vậy bạn có thể bỏ qua hay không một người nào đó đang sử dụng ứng dụng của bạn thông qua API hoặc qua trình duyệt.
Một nhược điểm ở đây là bạn đang yêu cầu người dùng đặt tên người dùng và mật khẩu của họ rõ ràng trong mọi yêu cầu. Bằng cách thực hiện nó qua SSL, bạn có thể thực hiện điều này an toàn.
Tôi không nghĩ mình đã từng thấy một API sử dụng điều này. Nó có vẻ như là một ý tưởng rất tốt đối với tôi, đặc biệt là vì nó được hỗ trợ bởi các chương trình xác thực hiện tại, nên tôi không biết vấn đề là gì.
API chính
Một cách dễ dàng để cho phép xác thực API là sử dụng phím API. Về cơ bản nó là tên người dùng cho một dịch vụ từ xa. Khi ai đó đăng ký sử dụng API của bạn, bạn cung cấp cho họ khóa API. Điều này cần phải được thông qua với mỗi yêu cầu.
Một nhược điểm ở đây là nếu ai đó nhận khóa API của người khác, họ có thể đưa ra yêu cầu với tư cách người dùng đó. Tôi nghĩ rằng bằng cách làm cho tất cả các yêu cầu API của bạn sử dụng HTTPS (SSL), bạn có thể bù đắp rủi ro này một chút.
Một nhược điểm khác là người dùng sử dụng thông tin đăng nhập xác thực giống nhau (khóa API) ở mọi nơi họ đến. Nếu họ muốn thu hồi quyền truy cập vào ứng dụng API, tùy chọn duy nhất của họ là thay đổi khóa API, điều này sẽ vô hiệu hóa tất cả các ứng dụng khách khác. Điều này có thể được giảm nhẹ bằng cách cho phép người dùng tạo nhiều khóa API.
API Key + ký chính Secret
Deprecated (loại) - xem OAuth dưới đây
đáng kể phức tạp được ký kết theo yêu cầu với một chìa khóa bí mật. Đây là những gì Amazon Web Services (S3, EC2, và như vậy). Về cơ bản, bạn cung cấp cho người dùng 2 khóa: khóa API của họ (ví dụ: tên người dùng) và khóa bí mật của họ (ví dụ: mật khẩu). Khóa API được truyền đi với mỗi yêu cầu, nhưng khóa bí mật thì không. Thay vào đó, nó được sử dụng để ký mỗi yêu cầu, thường bằng cách thêm một tham số khác.
IIRC, Amazon hoàn thành điều này bằng cách lấy tất cả tham số cho yêu cầu và sắp xếp chúng theo tên thông số. Sau đó, chuỗi này được băm, sử dụng khóa bí mật của người dùng làm khóa băm. Giá trị mới này được nối thêm dưới dạng tham số mới cho yêu cầu trước khi được gửi. Về phía Amazon, họ cũng làm như vậy. Họ lấy tất cả các tham số (ngoại trừ chữ ký), sắp xếp chúng và băm bằng khóa bí mật. Nếu điều này khớp với chữ ký, họ biết yêu cầu là hợp pháp.
Nhược điểm ở đây là sự phức tạp. Bắt chương trình này hoạt động chính xác là một nỗi đau, cả cho nhà phát triển API và khách hàng. Mong đợi rất nhiều cuộc gọi hỗ trợ và email tức giận từ các nhà phát triển ứng dụng khách, những người không thể làm mọi thứ.
OAuth
Để chống lại một số vấn đề phức tạp với phím + ký bí mật, một tiêu chuẩn đã nổi lên gọi OAuth. Tại OAuth cốt lõi là một hương vị của ký + khóa bí mật, nhưng phần lớn nó được tiêu chuẩn hóa và được đưa vào libraries for many languages.
Nói chung, dễ dàng hơn nhiều đối với cả nhà sản xuất API và người tiêu dùng để sử dụng OAuth thay vì tạo hệ thống khóa/chữ ký của riêng bạn.
OAuth cũng vốn phân đoạn quyền truy cập, cung cấp thông tin đăng nhập truy cập khác nhau cho từng người tiêu dùng API. Điều này cho phép người dùng thu hồi có chọn lọc truy cập mà không ảnh hưởng đến các ứng dụng tiêu thụ khác của họ.
Đặc biệt đối với Ruby, có OAuth gem cung cấp hỗ trợ ngoài hộp cho cả nhà sản xuất và người tiêu dùng của OAuth. Tôi đã sử dụng đá quý này để xây dựng một API và cũng để tiêu thụ các API OAuth và rất ấn tượng. Nếu bạn nghĩ rằng ứng dụng của bạn cần OAuth (trái với lược đồ khóa API đơn giản hơn), thì tôi có thể dễ dàng khuyên bạn sử dụng đá quý OAuth.
Nếu khách hàng biết cách thao tác các URI của bạn (bằng cách thêm .xml hoặc cách khác) thì API của bạn không phải là REST. – aehlke
đây là thư viện Oauth 2.0 Server tốt cho ruby https://github.com/Lelylan/rest-oauth2-server – sparkle