2013-06-30 37 views
10

Tôi đã đùa giỡn với một ý tưởng ứng dụng đơn giản trong vài ngày gần đây vì tôi đang cố gắng tự dạy bản thân về xác thực REST.Xác thực REST và khóa riêng/HMAC (khi nào tôi cài đặt?)

Cho đến giờ tôi đã tập hợp rằng cách tốt nhất để thực hiện việc này là triển khai HMAC giống như được sử dụng bởi Amazon.

Mối quan tâm lớn nhất của tôi là chính xác làm cách nào để xác thực người dùng cung cấp cho họ khóa riêng của họ để họ có thể bắt đầu ký HMAC? Tôi tiếp tục đọc rằng khóa riêng được sử dụng để ký HMAC không được cho là được gửi qua dây bao giờ, nhưng sau đó làm thế nào để họ nhận được nó ngay từ đầu?

Ý tưởng của tôi là một cái gì đó như thế này, nhưng tôi không chắc chắn nếu điều này là hợp lệ.

bảng cơ sở dữ liệu cho người dùng:

users (simplified, this would probably be a private key per client app?) 
    id (their public key?) 
    username 
    password? 
    privatekey 

Giả sử a/JS client HTML người sử dụng sẽ được trình bày với một trang đăng nhập truyền thống mà đường bưu điện đến API với một cái gì đó như thế này:

https://example.com/myapp/api/v1/authenticate.json 
POST: username/password 

Đó sẽ trả lại hoặc là

404:User not found 
200:{ "id" : <id>, "privatekey": <privatekey> } 

Khách hàng sau đó sẽ lưu trữ khóa đó ở đâu đó (wou ld địa phương lưu trữ/Cookie là một nơi an toàn không?) và sử dụng nó để đăng ký yêu cầu thêm rằng sẽ trông như thế này

GET https://example.com/myapp/api/v1/something/?key1=value1&publickey={theirID}&hmac={hmac signature of the request using their private key} 

Máy chủ sau đó sẽ kiểm tra khóa công khai, lấy chìa khóa riêng đi kèm và xây dựng lại các chữ ký HMAC, nếu chúng phù hợp, chúng tôi có quy trình yêu cầu được xác thực.

Tôi có nhận được quyền này không? Tôi không chắc mình có hiểu vai trò của khóa riêng tư không nếu tôi vẫn cần mật khẩu như trong ví dụ của mình để có điều gì đó nói với tôi rằng tôi có thể sai.

Trả lời

11

Tôi nghĩ bạn cần cung cấp thêm chi tiết về đơn đăng ký của bạn và cách ứng dụng sẽ được sử dụng. Có nhiều cách bạn có thể thực hiện xác thực REST. Một số trong số đó là tiêu chuẩn, một số thì không. Đây chỉ là một số ví dụ:

  1. Basic authentication over SSL
  2. Digest authentication
  3. Các loại xác thực token (OAuth 2, SPNEGO, STS khác nhau)
  4. HMAC
  5. Khách hàng SSL Certificates
  6. Signed/mã hóa bánh quy.

Trong trường hợp Amazon S3, họ cung cấp cho bạn "khóa truy cập bí mật AWS" khi bạn đăng ký. Sau đó mã ứng dụng của bạn cần phải biết khóa bí mật để có thể tính toán chữ ký (hoặc cần biết yêu cầu/url đã ký) Vì vậy, cuối cùng "khóa truy cập bí mật" được truyền qua dây ít nhất một lần trong quá trình đăng ký.

Nếu bạn sử dụng mật mã hóa khóa công khai (như giấy chứng nhận SSL client) - bạn có thể tránh truyền private key hoàn toàn

  1. bạn tạo công cộng/khóa riêng trên máy khách
  2. Gửi khóa công khai đến máy chủ (hoặc giấy chứng nhận được ký bởi cơ quan đáng tin cậy)
  3. Yêu cầu đăng nhập (hoặc không phải) với khóa cá nhân và máy chủ xác thực chữ ký bằng khóa công khai.

Nếu mục tiêu của bạn là chỉ xác thực yêu cầu AJAX được thực hiện cho trang web của bạn sau khi người dùng đã xác thực trên trang đăng nhập - bạn có thể chỉ cần sử dụng cookie đã ký máy chủ.

+0

API không là gì ngoài một dự án thú cưng nhỏ của tôi để tự dạy cho mình điều gì đó mới mẻ. Theo nghĩa đó, tôi sẽ xây dựng API trước và sau đó xây dựng lối vào như thể tôi là người ngoài. Thay vì có cuộc gọi trực tiếp, tôi chỉ sử dụng API của mình và yêu cầu bản thân mình sử dụng xác thực, theo cách này, lối vào của riêng tôi sẽ đơn giản là sử dụng API của tôi. Khi bạn nói Amazon S3 cung cấp cho bạn khóa riêng tư khi đăng ký, tôi nghĩ đó là những gì tôi không chắc chắn, khi nào tôi đưa nó cho bên thứ 3 (hoặc trong trường hợp này là đưa nó cho chính tôi). OAuth 2 có vẻ đầy hứa hẹn ... – jfrobishow

+0

Tôi có nghi ngờ.Nếu khách hàng là một ứng dụng web có thể truy cập từ bên ngoài, khóa bí mật (được lưu trữ cục bộ hoặc trong cookie) có thể được xem từ tệp JS bên dưới bằng cách xem nguồn. Đúng? Làm thế nào một cái gì đó như thế được ngăn chặn? –