2012-12-13 31 views
5

Tôi đang xây dựng một API RESTful JSON được xây dựng với node.js và express.js,cách bảo mật API RESTful JSON cho cả cuộc gọi trên điện thoại di động và AJAX?

API sẽ được truy cập cả bởi các cuộc gọi AJAX phía máy khách (từ Ember.js) và bởi ứng dụng di động Android gốc (chuẩn) Yêu cầu HTTP).

Tôi đang nhìn vào hai điều:

1) xác thực - làm thế nào để biết được người dùng đang truy cập vào API, trong phát triển Tôi đã sử dụng một khóa API cho mỗi người dùng và thông qua nó trong tiêu đề yêu cầu

2) bảo mật - cách đảm bảo chỉ những người dùng được xác thực thực mới truy cập dữ liệu riêng tư.

là các khóa API là một chiến lược tốt cho cả khách hàng di động gốc và cho các cuộc gọi AJAX? (người dùng gửi người dùng + chuyển tới API và nhận khóa API, sau đó được sử dụng để tạo yêu cầu bổ sung)

tôi có nên xem một thứ gì đó như OAUTH (1 hoặc 2) không? Tôi hiện không có kế hoạch cho các ứng dụng của bên thứ ba truy cập API nên tôi không cần Ủy quyền, nhưng điều này có thể thay đổi trong tương lai.

có nghĩa là tôi cần có máy chủ cung cấp OAUTH của riêng mình không?

+0

OAuth sẽ là giải pháp chung và hiện có tốt cho vấn đề của bạn cũng giải quyết được một số vấn đề có thể xảy ra trong tương lai. Có lý do gì để bạn không sử dụng nó? – mtsr

+0

Tôi không có bất kỳ trải nghiệm nào với OAuth nên tôi đã hỏi về chiến lược đầu tiên .. Tôi có cần chạy máy chủ của nhà cung cấp OAuth của riêng mình không? –

+0

Bạn có nhận được câu trả lời ngay bây giờ không? Tôi có cùng một câu đố. –

Trả lời

0

Bạn có thể sử dụng phiên Express.js để xác thực thông thường bằng khóa phiên được lưu trữ trong cửa hàng phiên. Để tương thích với các cuộc gọi REST không cookie, bạn có thể sử dụng một trường bổ sung, "mySessionId", được thêm vào truy vấn hoặc vào phần thân của yêu cầu. Sau đó sửa đổi xác minh xác thực của bạn để kiểm tra trường bổ sung đó. Có lẽ một ví dụ sẽ hữu ích hơn:

Trong nhanh:

var server = express.createServer(); 
server.use(express.cookieParser()); 
server.use(express.session(sessionInfoObject)); 
server.get("/path/to/endpoint", function(request, response) { 
    if(typeof(request.query.mySessionId) != "undefined") { 
     // authenticate with the session id in mySessionId 
     // eg: if (getSession(request.query.mySessionId).isAuth) {} 
    } 
    else { 
     // session authentication, use request.session 
     // eg: if (getSession(request.query.mySessionId).isAuth) {} 
    } 
}); 

Nếu bạn chọn để đi xuống con đường này, hãy chắc chắn rằng khi bạn xác thực người dùng, bạn cũng có thêm dữ liệu người dùng có liên quan trong phiên. Nó sẽ làm cho cuộc sống của bạn dễ dàng hơn nhiều. Ví dụ:

if(authenticated) { 
    request.session.isAuth = true; 
    request.session.customId = customId; 
} 

Có các lựa chọn thay thế, nhưng đây là phương án tôi thấy dễ nhất.

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