2011-11-03 61 views
142

Tôi đang xây dựng một ứng dụng sẽ được lưu trữ trên máy chủ. Tôi muốn xây dựng một API cho ứng dụng để tạo điều kiện tương tác với từ bất kỳ nền tảng nào (Ứng dụng Web, Ứng dụng di động). Điều tôi không hiểu là khi sử dụng API REST, làm cách nào để chúng tôi xác thực người dùng.Xác thực API REST

Ví dụ: khi người dùng đã đăng nhập và sau đó muốn tạo chủ đề diễn đàn. Làm cách nào để biết người dùng đã đăng nhập?

+3

Bạn có lẽ nên tìm kiếm "REST authentication" ở đây. Nó được đề cập trong nhiều câu hỏi khác. –

+9

Tóm lại, hãy để khách hàng gửi tên người dùng và mật khẩu với mọi yêu cầu bằng HTTP Basic Auth (qua SSL!) Hoặc xác thực một lần để khách hàng có phiên được xác thực sẽ hết hạn sau một khoảng thời gian không hoạt động (hoặc bạn chọn ghi đè lên 'xử lý phiên' của khung công tác web của bạn. Phiên nói sau đó có thể được lưu trữ trong cookie hoặc là thông số được chuyển với mọi yêu cầu (ví dụ: JSESSIONID trong vùng Java). – opyate

+0

Xem thêm [Cách kiểm soát ai sử dụng tiện ích web của tôi] (http://stackoverflow.com/questions/12998701/how-to-control-who-uses-my-web-widget/). – Arjan

Trả lời

56

Bạn có thể sử dụng Xác thực HTTP hoặc xác thực thông báo. Bạn có thể xác thực một cách an toàn người dùng bằng cách sử dụng SSL trên đầu trang của nó, tuy nhiên, nó làm chậm API một chút.

  • Basic authentication - sử dụng mã hóa Base64 vào tên người dùng và mật khẩu
  • Digest authentication - băm tên người dùng và mật khẩu trước khi gửi chúng qua mạng.

OAuth là cách tốt nhất có thể nhận được. Những lợi thế mà oAuth mang lại là một mã thông báo có thể phục hồi hoặc hết hạn. Tham khảo sau về cách triển khai: Liên kết hoạt động từ nhận xét: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf

+4

Vui lòng đọc [câu hỏi này] (http://stackoverflow.com/questions/454355/security-of-rest-authentication- kế hoạch) và câu trả lời được cung cấp bởi Les Hazelwood (tác giả của Apache Shiro). –

+3

Liên kết bị hỏng. – FreeAsInBeer

+2

liên kết hoạt động: https://www.ida.liu.se/~TDP024/labs/hmacarticle.pdf – teksan

6

Tôi nghĩ cách tốt nhất là sử dụng OAuth2. Google nó và bạn sẽ tìm thấy rất nhiều bài viết hữu ích để giúp bạn thiết lập nó.

Việc tạo ứng dụng khách cho API của bạn từ ứng dụng web hoặc thiết bị di động trở nên dễ dàng hơn.

Hy vọng nó sẽ giúp bạn.

+2

Vui lòng đọc [câu hỏi này] (http://stackoverflow.com/questions/454355/security-of-rest-authentication-schemes) và câu trả lời của Les Hazelwood (tác giả của Apache Shiro). –

101

Ví dụ: khi người dùng có login.Now cho phép người dùng muốn tạo chủ đề diễn đàn, Làm cách nào để biết người dùng đã đăng nhập?

Hãy nghĩ về điều đó - phải có một số bắt tay cho biết API "Tạo diễn đàn" của bạn rằng yêu cầu hiện tại này là từ người dùng được xác thực. Vì các API REST thường không có trạng thái, trạng thái phải được giữ nguyên ở đâu đó. Ứng dụng khách của bạn sử dụng API REST chịu trách nhiệm duy trì trạng thái đó. Thông thường, nó ở dạng một số mã thông báo được chuyển đi từ khi người dùng đăng nhập. Nếu mã thông báo tốt, yêu cầu của bạn tốt.

Kiểm tra cách Amazon AWS thực hiện xác thực. Đó là một ví dụ hoàn hảo về "truyền buck" xung quanh từ API này sang API khác.

* Tôi đã nghĩ đến việc thêm một số câu trả lời thực tế vào câu trả lời trước đây của tôi. Hãy thử Apache Shiro (hoặc bất kỳ thư viện xác thực/ủy quyền nào). Tóm lại, hãy thử và tránh mã hóa tùy chỉnh.Một khi bạn đã tích hợp thư viện mà bạn yêu thích (tôi sử dụng Apache Shiro, btw) sau đó bạn có thể làm như sau:

  1. Tạo Login/logout API như: /api/v1/loginapi/v1/logout
  2. Trong những Login và Logout API, thực hiện xác thực với cửa hàng sử dụng bạn
  3. kết quả là một dấu hiệu (thường, JSESSIONID) được gửi lại cho khách hàng (web, điện thoại di động, bất cứ điều gì)
  4. Từ thời điểm này trở đi, tất cả các cuộc gọi tiếp theo được thực hiện bởi khách hàng của bạn sẽ bao gồm mã thông báo này
  5. Hãy nói rằng cuộc gọi tiếp theo của bạn được thực hiện cho một API gọi /api/v1/findUser
  6. Điều đầu tiên mã API này sẽ làm là để kiểm tra sự token ("là thành viên này xác nhận?")
  7. Nếu câu trả lời trở lại là KHÔNG, sau đó bạn ném Trạng thái HTTP 401 quay lại máy khách. Hãy để họ xử lý nó.
  8. Nếu câu trả lời là CÓ, sau đó tiếp tục trả lại Người dùng được yêu cầu

Đó là tất cả. Hi vọng điêu nay co ich.

+0

Vì vậy, những gì bạn mô tả về cơ bản là một cookie phiên, phải không? – LordOfThePigs

+0

có, nhưng phiên được "duy trì" ở 2 địa điểm khác nhau. Một trong máy chủ API, một máy chủ khác trong Trình duyệt. Phản hồi JSON (hoặc bất kỳ điều gì) trở lại đăng nhập thành công của trình duyệt đăng nên thông báo id phiên trên máy chủ API trở lại trình duyệt. Các phiên này được quản lý độc lập bởi các đại lý tương ứng. – Kingz

+0

@Kingz: Điều đó nghe có vẻ giống như cookie phiên đối với tôi. Đối với cookie phiên, máy chủ duy trì id phiên và liên kết nó với một người dùng cụ thể. Sau đó, trình duyệt lưu trữ id đó trong cookie mà nó gửi tới máy chủ mỗi lần. Tôi không chắc chắn những gì bạn có nghĩa là "duy trì" tại 2 địa điểm khác nhau, trừ khi bạn có nghĩa là mã thông báo được lưu trữ. – Chris

31
  1. Sử dụng HTTP Basic Auth để xác thực khách hàng, nhưng đối xử với tên người dùng/mật khẩu chỉ như phiên tạm thẻ.

    Các phiên mã thông báo là chỉ là một tiêu đề gắn liền với mọi yêu cầu HTTP, ví dụ như: Authorization: Basic Ym9ic2Vzc2lvbjE6czNjcmV0

    Chuỗi Ym9ic2Vzc2lvbjE6czNjcmV0 trên chỉ là chuỗi "bobsession1: s3cret" (mà là một tên người dùng/mật khẩu) mã hóa trong Base64 .

  2. Để nhận mã thông báo phiên tạm thời ở trên, hãy cung cấp chức năng API (ví dụ: http://mycompany.com/apiv1/login) có tên người dùng chính và mật khẩu chính làm đầu vào, tạo tên người dùng/mật khẩu HTTP cơ bản tạm thời ở phía máy chủ và trả về mã thông báo (ví dụ: Ym9ic2Vzc2lvbjE6czNjcmV0). Tên người dùng/mật khẩu này phải là tạm thời, nó sẽ hết hạn sau 20 phút hoặc lâu hơn.

  3. Đối với tăng cường bảo mật đảm bảo dịch vụ REST của bạn được cung cấp qua HTTPS vì vậy thông tin mà không phải chuyển bản rõ

Nếu bạn đang ở trên Java, thư viện Xuân An cung cấp hỗ trợ tốt để thực hiện phương pháp nêu trên

+1

Tại sao nó hết hạn sau 20 phút? nếu đó là một trang web như facebook đăng nhập là cho đến khi người dùng đăng xuất? – Dejell

+1

@dejel Tôi đã được giả định "phiên" là tạm thời trong tự nhiên. Nó là phổ biến cho nó hết hạn nếu người dùng đang chạy không tải – gerrytan