Tổng quat
Tôi đang tìm cách tạo API (REST) cho ứng dụng của mình. Mục đích ban đầu / chính sẽ được sử dụng cho các ứng dụng di động (iPhone, Android, Symbian, v.v.). Tôi đã xem xét các cơ chế khác nhau để xác thực và ủy quyền cho các API dựa trên web (bằng cách nghiên cứu các triển khai khác). Tôi đã tập trung vào hầu hết các khái niệm cơ bản nhưng vẫn đang tìm kiếm hướng dẫn trong một vài lĩnh vực. Điều cuối cùng tôi muốn làm là phát minh lại bánh xe, nhưng tôi không tìm thấy bất kỳ giải pháp tiêu chuẩn nào phù hợp với tiêu chí của mình (tuy nhiên tiêu chí của tôi bị nhầm lẫn nên cũng thoải mái phê bình điều đó). Ngoài ra, tôi muốn API giống nhau cho tất cả các nền tảng / ứng dụng tiêu thụ nó.
oAuth
Tôi sẽ tiếp tục và đưa ra phản đối của mình cho oAuth vì tôi biết đó có thể sẽ là giải pháp đầu tiên được đưa ra. Đối với các ứng dụng di động (hoặc cụ thể hơn là các ứng dụng không phải là web), việc rời khỏi ứng dụng (để truy cập trình duyệt web) có vẻ sai. Ngoài ra, không có cách nào (tôi biết) để trình duyệt trả lại cuộc gọi lại cho ứng dụng (đặc biệt là đa nền tảng). Tôi biết một vài ứng dụng làm điều đó, nhưng nó chỉ cảm thấy sai và làm hỏng ứng dụng UX.
Yêu cầu
- Người dùng nhập tên người dùng / mật khẩu vào ứng dụng.
- Mỗi cuộc gọi API được xác định bởi ứng dụng gọi điện.
- Chi phí được giữ ở mức tối thiểu và khía cạnh xác thực là trực quan cho các nhà phát triển.
- Cơ chế này an toàn cho cả người dùng cuối (thông tin đăng nhập của họ không bị lộ) cũng như nhà phát triển (thông tin đăng nhập ứng dụng của họ không bị lộ).
- Nếu có thể, không yêu cầu https (không có nghĩa là yêu cầu khó).
Suy nghĩ hiện tại của tôi về việc thực hiện
Một nhà phát triển bên ngoài sẽ yêu cầu một tài khoản API. Họ sẽ nhận được một apikey và apisecret. Mỗi yêu cầu sẽ yêu cầu tối thiểu ba tham số.
- apikey - được trao cho nhà phát triển khi đăng ký
- dấu thời gian - nhân đôi như một định danh duy nhất cho mỗi tin nhắn cho một apikey nhất định
- hàm băm - hàm băm của dấu thời gian + apisecret
Apikey được yêu cầu để xác định ứng dụng đưa ra yêu cầu. Dấu thời gian hoạt động tương tự như oauth_nonce và tránh / giảm nhẹ các cuộc tấn công phát lại. Hàm băm đảm bảo rằng yêu cầu đó thực sự được đưa ra từ chủ sở hữu của apikey đã cho.
Đối với các yêu cầu được xác thực (những yêu cầu được thực hiện thay mặt cho người dùng), tôi vẫn chưa quyết định giữa việc đi với tuyến access_token hoặc kết hợp băm tên người dùng và mật khẩu. Dù bằng cách nào, tại một số điểm, một yêu cầu kết hợp tên người dùng / mật khẩu sẽ được yêu cầu. Vì vậy, khi có, một hàm băm của một vài thông tin (apikey, apisecret, dấu thời gian) + mật khẩu sẽ được sử dụng. Tôi thích phản hồi về khía cạnh này. FYI, họ sẽ phải băm mật khẩu trước, vì tôi không lưu trữ mật khẩu trong hệ thống của mình mà không băm.
Phần kết luận
FYI, đây không phải là yêu cầu về cách xây dựng / cấu trúc API nói chung chỉ là cách xử lý xác thực và ủy quyền chỉ trong một ứng dụng.
Suy nghĩ ngẫu nhiên / Câu hỏi thưởng
Đối với các API chỉ yêu cầu apikey như một phần của yêu cầu, làm thế nào để bạn ngăn người khác không phải chủ sở hữu apikey có thể thấy apikey (kể từ khi được gửi rõ ràng) và đưa ra yêu cầu quá mức để đẩy họ vượt quá giới hạn sử dụng? Có lẽ tôi chỉ nghĩ quá nhiều về điều này, nhưng không nên có một cái gì đó để xác thực rằng một yêu cầu đã được xác minh cho chủ sở hữu apikey? Trong trường hợp của tôi, đó là mục đích của apisecret, nó không bao giờ được hiển thị / truyền đi mà không bị băm.
Nói về băm, còn md5 vs hmac-sha1 thì sao? Có thực sự quan trọng khi tất cả các giá trị được băm với dữ liệu đủ dài (ví dụ: apisecret) không?
Trước đây tôi đã từng xem xét việc thêm muối cho mỗi người dùng / hàng vào hàm băm mật khẩu người dùng của mình. Nếu tôi làm điều đó, làm thế nào ứng dụng có thể tạo ra một hàm băm phù hợp mà không biết muối được sử dụng?