2014-10-30 18 views
5

Tôi đã đào sâu qua các luồng stackoverflow/security.stackexchange và không có câu trả lời xác định về cách cung cấp một cách phổ quát cho khách hàng để tiêu thụ an toàn các dịch vụ RESTful mà tôi đang xây dựng thông qua asp. api web của net. Trong việc tìm kiếm câu trả lời này, tôi thấy "ủy quyền" và "xác thực" được sử dụng thay thế cho nhau, vì vậy tôi muốn chỉ ra rằng tôi chỉ muốn xác minh cả nhận dạng yêu cầu và tính hợp pháp. Vì vậy, tại thời điểm này, tôi không xác thực người dùng.Cách phổ biến để xác thực khách hàng và bảo mật một api RESTful

Mô hình của Amazon có vẻ là mô hình được tham chiếu khi "tự xoay", nhưng trong ngữ cảnh này, tôi hiểu rằng Amazon đã cung cấp "giấy tờ" cho mỗi lần nói, vì vậy không có nhiều sáng tạo ở đây. Bài đăng này, Designing a Secure REST (Web) API without OAuth, cực kỳ hữu ích.

Những gì tôi thu thập là:

  1. Các ứng dụng phải yêu cầu Yêu cầu SSL, do đó, một GET tại "http://myapi.com/users/1" nên bị từ chối với một phản ứng yêu cầu xấu để cho các nhà phát triển biết https là bắt buộc.
  2. Khóa ứng dụng/bí mật phải được khách hàng cung cấp để xác minh họ là ai.
  3. SSL + giấy chứng nhận là một ý tưởng tốt
  4. Yêu cầu một giá trị nonce
  5. Khi một khách hàng đăng ký ứng dụng của họ, yêu cầu đầu vào của URL và IP mà họ sẽ gửi các yêu cầu từ để xác minh khi nhận được một yêu cầu. Mối quan tâm của tôi với điều này là tính di động của ứng dụng bên ngoài, tức là ứng dụng được chuyển sang máy chủ mới với IP khác và giờ nó không hoạt động.

Tôi có vài vấn đề với 2 điều đó, có lẽ, tâm trí của tôi không thể tự bao bọc xung quanh. Đầu tiên, không phải là một bí mật ứng dụng được cho là bí mật? Vì vậy, nếu một khách hàng javascript làm cho một yêu cầu không điều này thỏa hiệp bí mật của khóa ứng dụng? Tại sao có bí mật ứng dụng sau đó khi tôi có thể xác minh danh tính yêu cầu thông qua kết hợp xác minh khóa ứng dụng, giá trị nonce và ip máy chủ? Tôi hiểu rằng một ngôn ngữ phía máy chủ như php, ruby, hoặc C# .net sẽ không tiết lộ bí mật, nhưng tôi muốn điều này là phổ biến an toàn cho JS và biên dịch các ngôn ngữ như nhau.

Cuối cùng, Facebook có developer security checklist yêu cầu nhà phát triển "Không bao gồm mật khẩu ứng dụng của bạn ở mã phía máy khách hoặc mã có thể giải mã được", điều này sẽ đề xuất một web.config được mã hóa hoặc tương tự với tôi. Giải pháp này sẽ không làm việc để lộ dịch vụ REST cho bất kỳ ai tiêu thụ thông qua javascript.

đề

khác tôi đã chải qua:
http://www.thebuzzmedia.com/designing-a-secure-rest-api-without-oauth-authentication/
https://developers.facebook.com/docs/facebook-login/security/
Best Practices for securing a REST API/web service
Security of REST authentication schemes
HTTP Basic Authentication instead of TLS client certification
RESTful Authentication

+1

Hãy thử xem http://stackoverflow.com/questions/23718130/authenticate-a-site-app-to-access-a-web-api-service Tôi nghĩ giải pháp tốt nhất là làm việc với cơ cấu hạ tầng . (VPN hoặc liên quan) –

+1

Kịch bản # 2 của bạn là một chủ đề tốt về việc hiển thị dịch vụ, nhưng nó không giải quyết được vấn đề thiết kế bảo mật khái niệm của tôi, tức là tôi cần yêu cầu ứng dụng bí mật nếu hỗ trợ các ứng dụng javascript? – olingern

+1

Bạn phải tạo giao diện bảo mật AK-NAK của riêng mình (có rất nhiều ý tưởng về nó). Nhớ tất cả mọi thứ trong kịch bản đó là công khai, javascript được tiếp xúc 100%. –

Trả lời

0

Con đường tôi đảm bảo ứng dụng của tôi là với OpenID Connect. Ví dụ của bạn, khách hàng mà bạn đang nói về ở # 2 sẽ là RP (nhà cung cấp tài nguyên) và một hệ thống xác thực như Google sẽ là OP của bạn (OpenID nhà cung cấp)

Một chìa khóa app/bí mật phải được cung cấp bởi máy khách để xác minh xem họ là ai.

thực sự sẽ là ứng dụng của bạn và bí mật của khách hàng của bạn sẽ không rời khỏi máy chủ của bạn nhiều hơn /etc/passwd tệp của bạn. Bí quyết này là những gì được RP sử dụng để nói chuyện với OP để lấy dữ liệu.

Dòng chảy trong một nutshell là

  1. tài khoản kết nối với API của bạn endpoint ví dụ /restapi
  2. endpoint của bạn chuyển hướng người dùng của Google, nơi bạn đã đăng ký ứng dụng của bạn
  3. dấu hiệu tài khoản vào OP (ví dụ Google) và nhận được một mã để vượt qua RP RP
  4. sẽ đi đến OP để có được thông tin openid ví dụ e2 mail
  5. RP sau đó sẽ sử dụng thông tin mở đó để tra cứu bảng ủy quyền của riêng mình
  6. Khi RP xác thực ủy quyền cho RP người dùng sẽ cung cấp phần còn lại của thông tin.
Các vấn đề liên quan