Tôi đang phát triển API REST yêu cầu xác thực. Vì quá trình xác thực tự xảy ra thông qua một dịch vụ web bên ngoài qua HTTP, tôi lý luận rằng chúng tôi sẽ phân phối mã thông báo để tránh gọi lại dịch vụ xác thực. Điều này đưa tôi đến câu hỏi đầu tiên của mình:
Điều này có thực sự tốt hơn việc chỉ yêu cầu khách hàng sử dụng HTTP Basic Auth trên mỗi yêu cầu và lưu vào bộ nhớ đệm các cuộc gọi đến phía máy chủ dịch vụ xác thực không?
Giải pháp Basic Auth có ưu điểm là không yêu cầu toàn bộ chuyến đi vòng quanh máy chủ trước khi yêu cầu nội dung có thể bắt đầu. Mã thông báo có thể linh hoạt hơn về phạm vi (nghĩa là chỉ cấp quyền cho các tài nguyên hoặc hành động cụ thể), nhưng điều đó có vẻ phù hợp với ngữ cảnh OAuth hơn là trường hợp sử dụng đơn giản của tôi.
Hiện tại các mã thông báo được mua như thế này:
curl -X POST localhost/token --data "api_key=81169d80...
&verifier=2f5ae51a...
×tamp=1234567
&user=foo
&pass=bar"
Các api_key
, timestamp
và verifier
được yêu cầu của tất cả các yêu cầu. "Người xác minh" được trả lại bởi:
sha1(timestamp + api_key + shared_secret)
Ý định của tôi là chỉ cho phép các cuộc gọi từ các bên đã biết và ngăn các cuộc gọi được sử dụng lại nguyên văn.
Điều này có đủ tốt không? Không cần thiết? Quá mức cần thiết?
Với mã thông báo trong tay, khách hàng có thể có được các tài nguyên:
curl localhost/posts?api_key=81169d80...
&verifier=81169d80...
&token=9fUyas64...
×tamp=1234567
Đối với cuộc gọi đơn giản nhất có thể, điều này có vẻ dài dòng kinh khủng. Xem xét ý shared_secret
chí sẽ kết thúc được nhúng vào (tối thiểu) một ứng dụng iOS, từ đó tôi cho rằng nó có thể được trích xuất, liệu điều này thậm chí có cung cấp bất cứ điều gì ngoài cảm giác an toàn sai lầm không?