2010-01-07 48 views
8

Xin chào, điều này dường như đã được thảo luận khá thường xuyên nhưng tôi muốn thực hiện một câu hỏi đơn giản, được tưới nước xung quanh việc xác thực với các dịch vụ RESTful. Kịch bản như sau:Dịch vụ xác thực người dùng RESTful

  • Có một hệ thống chứa người dùng đã đăng ký cho một ứng dụng. Hệ thống hiển thị API RESTful để truy cập những người dùng này.
  • Có ứng dụng giao diện người dùng có biểu mẫu đăng nhập. Ứng dụng có thể là nội bộ hoặc bên ngoài.
  • Ứng dụng đầu cuối cần sử dụng dữ liệu trong hệ thống Người dùng để xác thực người dùng.

Câu hỏi bây giờ là cách xác thực người dùng có thông tin đăng nhập (tên người dùng/mật khẩu) được nhập trong ứng dụng khách so với dữ liệu trong hệ thống Người dùng sao cho an toàn và hiệu quả? Vì lợi ích của câu hỏi này, giả sử ứng dụng khách là nội bộ của một số loại Intranet nhưng các ứng dụng sẽ không nằm trên cùng một máy và chỉ có thể giao tiếp thông qua dịch vụ.

Tôi hiểu ý tưởng về việc ứng dụng được "điều hướng siêu văn bản" nhưng chúng tôi có thể cung cấp dịch vụ lọc/tìm kiếm. Ví dụ, hãy xem xét các nguồn lực và API như sau:

  • http://example.com/users
    • GET - lấy tất cả người dùng (paged, hypermedia driven)
    • POST - tạo người dùng mới
    • PUT/DELETE không được hỗ trợ
  • http://example.com/users/[id]
    • GET - trả về một đại diện đầy đủ của một người dùng với id = {id}
    • PUT - cập nhật người dùng, mất trong bất kỳ loại phương tiện truyền thông được xác định trước
    • DELETE - xoá người sử dụng (với sự cho phép thích hợp)
    • POST không được hỗ trợ

Dựa trên trên, ý tưởng của tôi sẽ có ứng dụng client GET vào danh sách người dùng, lọc theo tên người dùng. Dịch vụ sẽ trả lại mật khẩu băm và muối cho máy khách, máy khách sẽ thực hiện xác thực.

Suy nghĩ?

+1

Bạn có thể cụ thể hơn về câu hỏi là gì không? Tôi đang gặp khó khăn trong việc hiểu loại phản hồi nào bạn muốn. –

Trả lời

3

Trước tiên, bạn không muốn khách hàng thực hiện xác thực, vì nó sẽ không quan trọng để viết một khách hàng đột nhập vào dịch vụ của bạn.

Thay vào đó, chỉ cần sử dụng cơ chế xác thực như HTTP Basic hoặc HTTP Digest.

Lưu ý rằng nếu bạn đang sử dụng Java, khung Restlet cung cấp các trình chặn, được gọi là Guards, hỗ trợ các cơ chế này và các cơ chế khác. Tôi rất khuyên bạn nên Restlet.

6

Nếu tôi hiểu câu hỏi của bạn một cách chính xác, bạn đang tìm cách triển khai một dịch vụ chung sẽ xử lý xác thực, để bạn có thể tái sử dụng nó cho các ứng dụng khác nhau.

Tôi đề nghị bạn hãy xem OAuth đã được xây dựng cho miền chính xác của vấn đề này.

4

Chuyển tên người dùng và muối trở lại là không cần thiết và rủi ro bảo mật thực sự.

Có lẽ bạn có thể xem xét phương pháp này:

Có khách hàng vượt qua tên truy cập và mật khẩu để các máy chủ thông qua Basic Authentication

Máy chủ fetches các mật khẩu được mã hóa cho tên người dùng cùng wiht muối

Máy chủ mã hóa mật khẩu đã cho bằng cách sử dụng một số phương pháp mã hóa, sử dụng muối để hỗ trợ thuật toán (mã Ruby sau):

def User.authenticate(login, password) 
    ok = false 

    user = User.find_by_login(login) 

    if user 
     # 
     # user contains the salt, it isn't passed from the client 
     # 
     expected_password = hash_password(password, user.salt) 

     ok = (user.password == expected_password) 
    end 

    return ok 
end 

Có nhiều nơi để sử dụng kiểu tiếp cận này nhưng tôi thích làm điều đó trong Rack.

điểm cuối, làm tất cả trên một kết nối HTTPS

0

Mozilla Persona

Kể từ khi câu hỏi này đã được đăng, các Mozilla Foundation (nhà sản xuất của trình duyệt Firefox) đã đưa vào vấn đề xác thực người dùng đơn giản. Giải pháp của họ là Mozilla Persona, "một hệ thống đăng nhập cho Web". Được thiết kế để dễ dàng cho người dùng dành cho nhà phát triển. Danh tính của người dùng là địa chỉ email. Xem Wikipedia article.

Cập nhật

Mozilla đã cơ bản từ bỏ công việc trên Persona nhưng not quite killed dự án.

4

Stormpath

Stormpath công ty chuyên cung cấp một API quản lý người dùng đăng nhập và dịch vụ cho các nhà phát triển. Họ sử dụng phương thức RESTJSON.

Có một số công ty khác dường như thích nghi trong lĩnh vực xác thực-dịch vụ mới này, nhưng Stormpath là người duy nhất tôi biết là dành riêng cho nó.

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