Tôi đã đùa giỡn với một ý tưởng ứng dụng đơn giản trong vài ngày gần đây vì tôi đang cố gắng tự dạy bản thân về xác thực REST.Xác thực REST và khóa riêng/HMAC (khi nào tôi cài đặt?)
Cho đến giờ tôi đã tập hợp rằng cách tốt nhất để thực hiện việc này là triển khai HMAC giống như được sử dụng bởi Amazon.
Mối quan tâm lớn nhất của tôi là chính xác làm cách nào để xác thực người dùng và cung cấp cho họ khóa riêng của họ để họ có thể bắt đầu ký HMAC? Tôi tiếp tục đọc rằng khóa riêng được sử dụng để ký HMAC không được cho là được gửi qua dây bao giờ, nhưng sau đó làm thế nào để họ nhận được nó ngay từ đầu?
Ý tưởng của tôi là một cái gì đó như thế này, nhưng tôi không chắc chắn nếu điều này là hợp lệ.
bảng cơ sở dữ liệu cho người dùng:
users (simplified, this would probably be a private key per client app?)
id (their public key?)
username
password?
privatekey
Giả sử a/JS client HTML người sử dụng sẽ được trình bày với một trang đăng nhập truyền thống mà đường bưu điện đến API với một cái gì đó như thế này:
https://example.com/myapp/api/v1/authenticate.json
POST: username/password
Đó sẽ trả lại hoặc là
404:User not found
200:{ "id" : <id>, "privatekey": <privatekey> }
Khách hàng sau đó sẽ lưu trữ khóa đó ở đâu đó (wou ld địa phương lưu trữ/Cookie là một nơi an toàn không?) và sử dụng nó để đăng ký yêu cầu thêm rằng sẽ trông như thế này
GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key}
Máy chủ sau đó sẽ kiểm tra khóa công khai, lấy chìa khóa riêng đi kèm và xây dựng lại các chữ ký HMAC, nếu chúng phù hợp, chúng tôi có quy trình yêu cầu được xác thực.
Tôi có nhận được quyền này không? Tôi không chắc mình có hiểu vai trò của khóa riêng tư không nếu tôi vẫn cần mật khẩu như trong ví dụ của mình để có điều gì đó nói với tôi rằng tôi có thể sai.
API không là gì ngoài một dự án thú cưng nhỏ của tôi để tự dạy cho mình điều gì đó mới mẻ. Theo nghĩa đó, tôi sẽ xây dựng API trước và sau đó xây dựng lối vào như thể tôi là người ngoài. Thay vì có cuộc gọi trực tiếp, tôi chỉ sử dụng API của mình và yêu cầu bản thân mình sử dụng xác thực, theo cách này, lối vào của riêng tôi sẽ đơn giản là sử dụng API của tôi. Khi bạn nói Amazon S3 cung cấp cho bạn khóa riêng tư khi đăng ký, tôi nghĩ đó là những gì tôi không chắc chắn, khi nào tôi đưa nó cho bên thứ 3 (hoặc trong trường hợp này là đưa nó cho chính tôi). OAuth 2 có vẻ đầy hứa hẹn ... – jfrobishow
Tôi có nghi ngờ.Nếu khách hàng là một ứng dụng web có thể truy cập từ bên ngoài, khóa bí mật (được lưu trữ cục bộ hoặc trong cookie) có thể được xem từ tệp JS bên dưới bằng cách xem nguồn. Đúng? Làm thế nào một cái gì đó như thế được ngăn chặn? –