2011-11-09 32 views
15

Tôi đã có Máy chủ REST này (được viết bởi chính tôi) được bảo mật bằng Xác thực HTTP đơn giản.Truy cập an toàn vào máy chủ REST được xác thực thông qua Backbone.js?

Bây giờ tôi đã viết lại ứng dụng bằng backbone.js và tôi không chắc chắn về cách xác thực khách hàng của mình. Nếu tôi làm điều đó trong JS user/pass sẽ được hiển thị.

Vậy làm cách nào để sửa đổi máy chủ hoặc JS phía máy khách của tôi để bảo mật?

Trước đây tôi chỉ đưa cho người dùng & chuyển vào PHP cho mỗi yêu cầu tới REST Server, vui lòng hướng dẫn tôi, Cảm ơn.

Trả lời

2

Được rồi tôi đã có một cuộc thảo luận với đồng nghiệp của tôi và đã đưa ra ý tưởng tốt nhất cho đến nay:

Tạo một bộ điều khiển đơn giản ở phía Máy khách của bạn và đặt tên nó là RESTAPI, nó sẽ hoạt động như một trình bao bọc cho Máy chủ REST thực của bạn.

Khi người dùng đăng nhập vào trang web của bạn, tạo phiên của anh ấy được tạo. Trình điều khiển RESTAPI biết các thông tin xác thực tới máy chủ REST thực tế HTTP đã được xác thực của bạn và nó truy cập REST Server trên nền xương sống.

Ví dụ: Nếu tôi phải lấy

/tin nhắn/gửi

từ REST của Server, bây giờ thay vì tôi sẽ nhấn url này trong bộ sưu tập xương sống

trang web/restapi/messages/sent

RESTAPI Con troller cũng kiểm tra đầu tiên rằng người dùng yêu cầu có phiên thích hợp trên trang web và thời tiết anh ta được phép tìm nạp tài nguyên hay không.

Vì vậy, không phải lo lắng về các tập tin cookie không an toàn hoặc để lại REST của máy chủ qua của bạn ở đồng bằng JS hoặc sử dụng bất kỳ phương pháp che khuất khác :)

+1

Không phải là loại phá vỡ toàn bộ RESTFULness của máy chủ? Tôi có nghĩa là nếu bạn đang đi để đi mà tuyến đường cũng có thể chỉ làm xử lý phiên trên máy chủ. Đừng làm cho tôi sai Tôi vẫn còn trong bóng tối về nếu tôi vượt qua thông tin mỗi lần, lưu trữ chúng trên máy khách để vượt qua mỗi lần không nhất thiết phải là ý tưởng sáng nhất. – thenetimp

+0

Không có gì sai khi truyền thông tin đăng nhập trong mọi yêu cầu. Trong REST, mọi yêu cầu phải tự mô tả (để loại bỏ nhu cầu các phiên trong máy chủ).Nếu tài nguyên được bảo vệ, thông tin xác thực là một phần của yêu cầu "mô tả" và thông tin đó sẽ được gửi cùng với tài liệu đó. Bạn chỉ có thể yêu cầu người dùng thông tin đăng nhập của mình và chuyển chúng vào mọi yêu cầu tiếp theo. Để OP, vui lòng không sử dụng các phiên. Bạn đang phá hủy vẻ đẹp của REST với nó. Bạn không cần phiên và bằng cách không sử dụng chúng, bạn sẽ giữ cho hệ thống của bạn dễ mở rộng hơn. – miguelcobain

+0

Bạn có thể cung cấp ví dụ về mã backbone.js mà bạn đã viết cho việc triển khai này không? Tôi đang gặp sự cố khi làm việc. Bạn có thể thấy tiến trình của tôi trong [câu hỏi này] (http://stackoverflow.com/questions/14752326/adding-http-basic-authentication-header-to-backbone-js-sync-function-prevents-mo) – MusikPolice

29

Xác thực HTTP cơ bản dễ bị nghe lén và tấn công trung gian. Bạn nên sử dụng HTTPS.

Tuy nhiên, nếu đó không phải là một tùy chọn, bạn luôn có thể gửi lại cookie cho khách hàng và có tên người dùng/mật khẩu được nhập vào đó để ngăn không cho nó hiển thị trong tệp JS. Đi mà không nói rằng mật khẩu ít nhất nên được mã hóa/băm vì lý do bảo mật. Sau đó, onus sẽ ở phía máy chủ để lấy các chi tiết xác thực từ cookie.

Bây giờ, nếu bạn không có bất kỳ kiểm soát nào đối với việc sửa đổi mã phía máy chủ, bạn sẽ không còn lựa chọn nào khác ngoài việc chôn chi tiết thông tin xác thực trong phương thức toàn cầu ajaxSend(). Yêu cầu AJAX. Bạn có thể chỉ cần đặt nó trong một số tệp .js khác và làm cho nó khó tìm, nhưng bạn bị hạn chế khá nhiều đối với hình thức bảo mật đó. Mặc dù, cookie không làm cho cuộc sống của bạn an toàn hơn. (Sẽ tốt nếu mật khẩu được băm/mã hóa).

Điều khác bạn có thể làm là có hình thức bảo mật hơi phức tạp hơn: Yêu cầu máy chủ gửi trả lại nonce với mọi câu trả lời - nonce sẽ được 'ký' bởi máy chủ bằng khóa bí mật của máy chủ và bạn có thể sử dụng điều đó để 'mã hóa' tên người dùng/mật khẩu ở phía máy khách cho mọi yêu cầu. Máy chủ của bạn sau đó sẽ phải liên tục giải mã thông tin xác thực. Điều này là ít dễ bị người đàn ông-in-the-giữa nhưng vẫn không dễ dàng.

HTTPS sẽ giúp bạn tiết kiệm từ mỗi phần trên nếu đó là tùy chọn cho bạn.

Hy vọng điều này sẽ hữu ích.

CẬP NHẬT(theo bình luận): Bản chất của cảm giác yên tĩnh-Ness là sự vắng mặt của nhà nước trên máy chủ. Tức là, không có phiên nào! Do đó bạn cần gửi thông tin người dùng với yêu cầu MỌI khách hàng tạo ra máy chủ. Nếu bạn có một trang đăng nhập thì rất khó để thực sự yên tâm vì không có 'tài nguyên' được gọi là đăng nhập. Tuy nhiên, đây là những gì bạn có thể làm:

  1. lần User trang đăng nhập, vào thông tin và nhấp chuột 'đăng nhập'
  2. Gửi yêu cầu POST đến máy chủ với những thông tin quan trọng - có lẽ đến/Đăng nhập
  3. Có máy chủ trả lại tài nguyên được yêu cầu để xác thực là cần thiết VÀ đặt cookie có thông tin đăng nhập hợp lệ để sử dụng trong yêu cầu 'tiếp theo'
  4. Mọi yêu cầu tiếp theo sẽ được chuyển hướng đến tài nguyên tương ứng tại URL cụ thể với một hành động cụ thể (GET, PUT, POST , XÓA BỎ...). Máy chủ nên kiểm tra dữ liệu xác thực từ cookie và quyết định xem người dùng có được xác thực hay không và thực hiện thêm ủy quyền để cấp quyền truy cập nếu cần.

Mỗi yêu cầu phải xác định riêng của mình mà không cần phải máy chủ duy trì phiên - đó là tinh thần của statelessness (và yên tĩnh-Ness;)

+0

Cảm ơn bạn đã xem tổng quan chi tiết và chắc chắn sẽ hữu ích. Nhưng, xin lỗi tôi quên đề cập đến (chỉnh sửa câu hỏi bây giờ) mà tôi có quyền truy cập đầy đủ vào máy chủ và tôi có thể thay đổi nó để thiết lập của tôi là bằng chứng đánh lừa. Bất kỳ đề xuất về điều đó? Bạn có thể viết câu trả lời khác hoặc chỉnh sửa nếu bạn muốn. – BlackDivine

+1

@BlackDivine - các bước tương tự giữ :) Tôi đã chỉ ra 3 cách thực hiện - chỉ máy khách ('ajaxSend'), chỉ máy chủ (cookie) và lai (mã hóa/giải mã không đổi bằng máy chủ nonce) – PhD

+0

Tôi thích tùy chọn Cookie nhất hiện tại, bạn có thể vui lòng xác nhận apporach này là tốt hơn? Chúng tôi tạo phiên trên máy chủ, bất cứ khi nào người dùng đăng nhập thành công, phiên được tạo trên máy chủ còn lại và miễn là phiên còn sống, người dùng có thể sử dụng API REST. Bây giờ, việc gửi POST đăng nhập thông qua ajax sẽ tạo phiên cho người dùng trên máy chủ hoặc trang web của tôi? Bởi vì tôi có 2 máy chủ, 1 là REST trang web lưu trữ khác chạy ứng dụng xương sống. Cảm ơn nhiều! – BlackDivine

0

Nếu bạn có quyền truy cập vào mã phía REST của máy chủ của bạn, bạn có thể thiết kế lại xác thực REST. Lần đầu tiên, để đăng nhập bạn đăng tên người dùng/mật khẩu qua https, lần lượt nhận được id phiên có thể được sử dụng trong các yêu cầu tiếp theo chuyển nó dưới dạng cookie.

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