2011-02-05 45 views
7

Tôi đang viết một ứng dụng phụ trợ với REST API cho iPhone và Android. Đó là một API nội bộ.Cách tốt nhất để triển khai API REST đăng ký cho iPhone/Android là gì?

Tại thời điểm này, tôi đang cố triển khai API đăng ký người dùng để người dùng có thể đăng ký từ ứng dụng dành cho thiết bị di động.

Tôi đang viết bằng cách sử dụng Django và với Django họ đi kèm với Cross Site Request Forgery cho yêu cầu web. Tôi phải tắt nó cho REST API, sử dụng django-piston.

Vậy làm cách nào để tôi có thể bảo vệ API đăng ký của mình khỏi spam? ga? Captcha? thực hành tốt nhất để triển khai API đăng ký là gì? lỗ hổng là gì?

Một đề xuất đã đưa ra là tải chế độ xem web trên ứng dụng dành cho thiết bị di động và có biểu mẫu đăng ký web di động để CSRF có thể được triển khai. Đó là giải pháp nhưng không phải là giải pháp gọn gàng vì tôi phải tạo trang thiết kế cho từng thiết bị di động hoặc một thiết bị chung có thể không phù hợp trên tất cả các thiết bị.

Nhiều trợ giúp được đánh giá cao.

Chúc mừng, Mickey

Trả lời

1

Tôi đồng ý rằng việc sử dụng nhà cung cấp OpenID là một cách tuyệt vời để đạt được điều đó. Bạn nên xem xét http://pypi.python.org/pypi/django-social-auth hoặc các dự án tương tự. Một lợi ích bổ sung là bạn không cần lưu thông tin đăng nhập mật khẩu trong cơ sở dữ liệu của mình. Ít dữ liệu hơn để quản lý, ít dữ liệu hơn.

Nếu bạn chắc chắn cần một lược đồ dựa trên tên người dùng/mật khẩu cổ điển và đăng ký đi kèm (có thể cùng với các công cụ dựa trên OpenID như bản thân SO), tôi sẽ đi với điều chỉnh mà piston cung cấp. Cá nhân tôi sử dụng captchas chỉ như một phương sách cuối cùng, và làm như vậy thông qua một giao diện REST có lẽ khá khó chịu. Bạn có yêu cầu hình ảnh xác thực trước khi giai đoạn đăng ký có thể tiếp tục không? Làm thế nào để bạn lưu ý rằng người dùng này đã hoàn thành captcha (session + cookies, ...)? Bạn không thể sử dụng reCAPTCHA hoặc các dịch vụ tương tự mà không sử dụng chế độ xem web (điều này sẽ làm cho toàn bộ phương thức REST của IMO quá cũ).

Tôi sẽ truy cập lại bằng cách sử dụng WebView. Nếu bạn giữ giao diện của bạn sạch sẽ và đơn giản, nó không nên kết hợp với bất kỳ quy ước nào trên bất kỳ nền tảng điện thoại thông minh nào.

+0

chỉ tò mò, lý do tại sao captcha không thể được sử dụng ở cấp API REST? –

+3

Chắc chắn là có thể, nhưng bạn phải có được hình ảnh xác thực thông qua REST, hiển thị nó cho người dùng và sau đó nhận được câu trả lời trong cuộc gọi tiếp theo. Tôi tìm thấy một cái gì đó của nó một API không phải là lý tưởng cho, khi bạn cần một phiên. Tôi không muốn giữ trạng thái giữa các cuộc gọi API. Có lẽ nó chỉ là tôi mặc dù. –

+0

Đồng ý với các cuộc gọi API không trạng thái (là một trong những nguyên tắc cơ bản của REST!). Tuy nhiên, nếu bạn đang tung ra các dữ liệu capcha của riêng mình thì không có lý do gì khiến bạn không thể trả lại "mã thông báo" (ví dụ: băm MD5 của câu trả lời) cùng với URI hình ảnh xác thực. Sau đó, hãy tải ứng dụng dành cho thiết bị di động của bạn để xác minh bằng API bằng cách gửi câu trả lời của người dùng cùng với băm ban đầu mà họ đã được phát hành. –

0

Không có lý do để lo lắng về CSRF cho REST API, hãy kiểm tra section này trong các tài liệu giải thích tại sao.

Cách tốt nhất để ngăn chặn spam là thu thập dữ liệu người dùng từ nguồn được xác minh, chẳng hạn như nhà cung cấp OpenID, Facebook, v.v. Nếu bạn muốn thực hiện việc này theo cách thủ công, thì cách đơn giản nhất để thực hiện là django-registration và mở rộng một trong các phụ trợ. Bạn có thể sử dụng chương trình phụ trợ đơn giản được cung cấp và sử dụng biểu mẫu tùy chỉnh với trường hình ảnh xác thực. Điều này là đủ để loại bỏ đăng ký tự động. Nên đơn giản, đủ để làm cho nó nối với piston.

EDIT:

Bạn nói đúng, tôi chỉ đọc lại các câu hỏi và nhận thấy tôi hoàn toàn bỏ qua thực tế là bạn đã đề cập bạn đang phát triển API REST của bạn chống lại người dùng Android/iPhone từ xa. Vì vậy, API của bạn được hiển thị công khai và chấp nhận các yêu cầu không có nguồn gốc từ miền của bạn hoặc từ một khách hàng trình duyệt cho vấn đề đó.

Tôi sẽ không phát minh lại bánh xe trong trường hợp của bạn, bạn nên triển khai Open API Authentication vì ứng dụng này hoàn toàn phù hợp với yêu cầu của bạn: biết rằng bạn đang trao đổi thông tin với người dùng thực, mà không cần lo lắng về yêu cầu.

+0

kron: tôi nghĩ rằng CSRF chỉ áp dụng cho quyền AJAX? Đối với REST API, chúng ta phải sử dụng cụ thể csrf_exempt(). Ít nhất, đó là những gì tôi phát hiện ra khi tôi cố gắng POST bằng cách sử dụng API REST được cung cấp bởi django-piston. –

+0

Câu hỏi đặt ra là đăng ký người dùng * mới * ... Vì vậy, điểm đăng ký không thể được bảo mật ... đó là lý do tại sao anh ta lo lắng rằng nó có thể bị lạm dụng –

Các vấn đề liên quan