Khi thiết kế REST API, việc xác thực người dùng trước có phổ biến không?Bảo mật REST API mà không cần phát minh lại bánh xe
Các trường hợp sử dụng điển hình tôi đang tìm kiếm là:
- Người dùng muốn có được dữ liệu. Chắc chắn chúng tôi muốn chia sẻ! Nhận khóa API công khai và đọc đi!
- Người dùng muốn lưu trữ/cập nhật dữ liệu ... woah chờ đã! bạn là ai, bạn có thể làm điều này?
Tôi muốn xây dựng ứng dụng này một lần và cho phép nói ứng dụng web, ứng dụng Android hoặc ứng dụng iPhone để sử dụng ứng dụng đó.
API REST dường như là lựa chọn hợp lý với các yêu cầu như thế này
Để minh họa câu hỏi của tôi, tôi sẽ sử dụng một ví dụ đơn giản.
Tôi có một mục trong cơ sở dữ liệu, có một thuộc tính xếp hạng (số nguyên từ 1 đến 5).
Nếu tôi hiểu REST của một cách chính xác tôi sẽ thực hiện một yêu cầu GET bằng cách sử dụng ngôn ngữ của sự lựa chọn của tôi mà trả csv, xml hoặc json như thế này:
http://example.com/product/getrating/{id}/
Giả sử chúng ta chọn JSON chúng tôi quay trở lại:
{
"id": "1",
"name": "widget1",
"attributes": { "rating": {"type":"int", "value":4} }
}
Điều này phù hợp với API công khai. Tôi nhận được phần đó.
Trường hợp tôi có tấn câu hỏi là làm cách nào để kết hợp điều này với mô hình bảo mật? Tôi quen với bảo mật ứng dụng web nơi tôi có trạng thái phiên xác định người dùng của mình mọi lúc để tôi có thể kiểm soát những gì họ có thể làm bất kể họ quyết định gửi gì cho tôi. Vì tôi hiểu nó không phải là RESTful nên sẽ là một giải pháp tồi trong trường hợp này.
Tôi sẽ cố sử dụng một ví dụ khác sử dụng cùng một mục/xếp hạng.
Nếu người sử dụng "JOE" muốn thêm một giá đến một mục
Điều này có thể được thực hiện bằng:
http://example.com/product/addrating/{id}/{givenRating}/
Tại thời điểm này, tôi muốn để lưu trữ các dữ liệu nói rằng " JOE "đã đưa ra sản phẩm {id} xếp hạng {givenRating}.
Câu hỏi: Làm cách nào để biết yêu cầu đến từ "JOE" chứ không phải "BOB".
Hơn nữa, điều gì sẽ xảy ra nếu dữ liệu hợp lý hơn giống như số điện thoại của người dùng?
Những gì tôi đã có cho đến nay là:
1) Sử dụng được xây dựng trong tính năng của HTTP để xác thực ở mọi yêu cầu, hoặc là đồng bằng HTTP hoặc HTTPS.
Điều này có nghĩa rằng tất cả các yêu cầu hiện nay mang hình thức của:
https://joe:[email protected]/product/addrating/{id}/{givenRating}/
2) Sử dụng một cách tiếp cận như S3 của Amazon với tư nhân và công cộng quan trọng: http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
3) Sử dụng một cookie anyway và phá vỡ phần không trạng thái của REST.
Cách tiếp cận thứ hai có vẻ tốt hơn với tôi, nhưng tôi tự hỏi liệu tôi có thực sự phải phát minh lại toàn bộ điều này không? Hashing, lưu trữ, tạo ra các phím, vv tất cả bởi bản thân mình?
Điều này nghe rất giống với việc sử dụng phiên trong ứng dụng web điển hình và tự viết lại toàn bộ ngăn xếp, thường với tôi có nghĩa là "Bạn đang làm sai" đặc biệt là khi xử lý bảo mật.
EDIT: Tôi đoán tôi cũng nên đề cập đến OAuth.
Nếu bạn đang gửi tên người dùng và mật khẩu theo mọi yêu cầu, ** sử dụng HTTPS **. –
Không có gì để làm với bảo mật, nhưng một RESTful API sẽ không sử dụng 'getrating' và' andrating'; nó sẽ chỉ là 'xếp hạng' và bạn sẽ GET, POST, PUT hoặc DELETE với tài nguyên đó. – Duncan