Xác thực RESTful


745

Xác thực RESTful có nghĩa là gì và nó hoạt động như thế nào? Tôi không thể tìm thấy một cái nhìn tổng quan tốt về Google. Hiểu biết duy nhất của tôi là bạn vượt qua khóa phiên (ghi nhớ) trong URL, nhưng điều này có thể sai lầm khủng khiếp.


3
Khi tôi google Xác thực đầy đủ, tôi tìm thấy hàng tá plugin RoR. Tôi cho rằng đó không phải là những gì bạn đang tìm kiếm. Nếu không phải RoR thì ngôn ngữ gì? Máy chủ web gì?
S.Lott

2
Sẽ không sai lầm khủng khiếp nếu bạn sử dụng HTTPS. Yêu cầu HTTP hoàn chỉnh cùng với URL sẽ được mã hóa.
Bharat Khatri

4
@BharatKhatri: Vâng, đúng vậy. Tôi sẽ không bao giờ chuyển thông tin nhạy cảm trong URL hiển thị cho người dùng. Thông tin này có nhiều khả năng bị rò rỉ cho các mục đích thực tế. HTTPS không thể giúp rò rỉ do tai nạn.
Jo So

2
@jcoffland: Ý nghĩa của việc xác thực RESTful thực sự là gì? Tôi quan tâm vì tôi vừa mới thực hiện cách thứ ba từ câu trả lời được chấp nhận, tuy nhiên tôi không hài lòng với nó (tôi không thích thông số bổ sung trong URL).
BlueLettuce16

4
một số người sử dụng jwt.io/introduction để giải quyết này .. Tôi làm nghiên cứu về này ngay bây giờ để giải quyết trường hợp của tôi: stackoverflow.com/questions/36974163/... >> Hy vọng này tốt sẽ làm việc.
toha

Câu trả lời:


586

Làm thế nào để xử lý xác thực trong kiến ​​trúc RESTful Client-Server là một vấn đề tranh luận.

Thông thường, nó có thể đạt được, trong thế giới SOA qua HTTP thông qua:

  • Xác thực cơ bản HTTP qua HTTPS;
  • Quản lý cookie và phiên;
  • Mã thông báo trong các tiêu đề HTTP (ví dụ: OAuth 2.0 + JWT);
  • Xác thực truy vấn với các tham số chữ ký bổ sung.

Bạn sẽ phải điều chỉnh, hoặc thậm chí kết hợp tốt hơn các kỹ thuật đó, để phù hợp nhất với kiến ​​trúc phần mềm của bạn.

Mỗi sơ đồ xác thực có các PRO và CON riêng, tùy thuộc vào mục đích của chính sách bảo mật và kiến ​​trúc phần mềm của bạn.

Xác thực cơ bản HTTP qua HTTPS

Giải pháp đầu tiên này, dựa trên giao thức HTTPS tiêu chuẩn, được hầu hết các dịch vụ web sử dụng.

GET /spec.html HTTP/1.1
Host: www.example.org
Authorization: Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==

Thật dễ dàng để thực hiện, có sẵn theo mặc định trên tất cả các trình duyệt, nhưng có một số nhược điểm đã biết, như cửa sổ xác thực khủng khiếp được hiển thị trên Trình duyệt, sẽ vẫn tồn tại (không có tính năng giống LogOut ở đây), một số mức tiêu thụ CPU bổ sung phía máy chủ, và thực tế là tên người dùng và mật khẩu được truyền (qua HTTPS) vào Máy chủ (sẽ an toàn hơn khi chỉ để mật khẩu ở phía máy khách, trong khi nhập bàn phím và được lưu dưới dạng băm an toàn trên Máy chủ) .

Chúng tôi có thể sử dụng Xác thực Digest , nhưng nó cũng yêu cầu HTTPS, vì nó dễ bị tấn công MiM hoặc Phát lại , và đặc trưng cho HTTP.

Phiên thông qua Cookies

Thành thật mà nói, một phiên được quản lý trên Máy chủ không thực sự không trạng thái.

Một khả năng có thể là duy trì tất cả dữ liệu trong nội dung cookie. Và, theo thiết kế, cookie được xử lý ở phía Máy chủ (Trên thực tế, Máy khách thậm chí không cố gắng diễn giải dữ liệu cookie này: nó chỉ đưa nó trở lại máy chủ theo từng yêu cầu liên tiếp). Nhưng dữ liệu cookie này là dữ liệu trạng thái ứng dụng, vì vậy khách hàng nên quản lý nó, chứ không phải máy chủ, trong một thế giới Không quốc tịch thuần túy.

GET /spec.html HTTP/1.1
Host: www.example.org
Cookie: theme=light; sessionToken=abc123

Bản thân kỹ thuật cookie được liên kết với HTTP, vì vậy nó không thực sự RESTful, nên độc lập với giao thức, IMHO. Nó dễ bị tấn công MiM hoặc Phát lại .

Cấp qua mã thông báo (OAuth2)

Một cách khác là đặt mã thông báo trong các tiêu đề HTTP để yêu cầu được xác thực. Đây là những gì OAuth 2.0 làm, ví dụ. Xem RFC 6749 :

 GET /resource/1 HTTP/1.1
 Host: example.com
 Authorization: Bearer mF_9.B5f-4.1JqM

Nói tóm lại, điều này rất giống với cookie và chịu cùng một vấn đề: không trạng thái, dựa vào chi tiết truyền HTTP và chịu nhiều điểm yếu về bảo mật - bao gồm MiM và Phát lại - vì vậy chỉ được sử dụng trên HTTPS. Thông thường, JWT được sử dụng làm mã thông báo.

Xác thực truy vấn

Xác thực truy vấn bao gồm việc ký từng yêu cầu RESTful thông qua một số tham số bổ sung trên URI. Xem bài viết tham khảo này .

Nó được định nghĩa như vậy trong bài viết này:

Tất cả các truy vấn REST phải được xác thực bằng cách ký các tham số truy vấn được sắp xếp theo thứ tự chữ thường, chữ thường bằng cách sử dụng thông tin xác thực làm mã thông báo ký. Việc ký kết phải xảy ra trước khi URL mã hóa chuỗi truy vấn.

Kỹ thuật này có lẽ tương thích hơn với kiến ​​trúc Statless và cũng có thể được thực hiện với quản lý phiên nhẹ (sử dụng các phiên trong bộ nhớ thay vì kiên trì DB).

Chẳng hạn, đây là một mẫu URI chung từ liên kết trên:

GET /object?apiKey=Qwerty2010

nên được truyền đi như vậy:

GET /object?timestamp=1261496500&apiKey=Qwerty2010&signature=abcdef0123456789

Chuỗi được ký là /object?apikey=Qwerty2010&timestamp=1261496500và chữ ký là hàm băm SHA256 của chuỗi đó bằng cách sử dụng thành phần riêng của khóa API.

Bộ nhớ đệm dữ liệu phía máy chủ có thể luôn luôn có sẵn. Chẳng hạn, trong khung của chúng tôi, chúng tôi lưu trữ các phản hồi ở cấp SQL, không phải ở cấp URI. Vì vậy, việc thêm tham số bổ sung này không phá vỡ cơ chế bộ đệm.

Xem bài viết này để biết một số chi tiết về xác thực RESTful trong khung ORM / SOA / MVC của máy chủ-máy chủ của chúng tôi, dựa trên JSON và REST. Vì chúng tôi cho phép giao tiếp không chỉ qua HTTP / 1.1 mà còn được đặt tên là đường ống hoặc tin nhắn GDI (cục bộ), chúng tôi đã cố gắng thực hiện một mẫu xác thực RESTful thực sự và không dựa vào tính đặc hiệu của HTTP (như tiêu đề hoặc cookie).

Lưu ý sau : thêm chữ ký trong URI có thể được coi là thông lệ xấu (ví dụ: nó sẽ xuất hiện trong nhật ký máy chủ http) vì vậy nó phải được giảm nhẹ, ví dụ như bằng một TTL thích hợp để tránh phát lại. Nhưng nếu nhật ký http của bạn bị xâm phạm, bạn chắc chắn sẽ gặp vấn đề bảo mật lớn hơn.

Trong thực tế, Xác thực mã thông báo MAC sắp tới cho OAuth 2.0 có thể là một cải tiến lớn đối với chương trình hiện tại "Được cấp bởi mã thông báo". Nhưng đây vẫn là một công việc đang tiến triển và gắn liền với truyền HTTP.

Phần kết luận

Thật đáng để kết luận rằng REST không chỉ dựa trên HTTP, ngay cả trong thực tế, nó cũng được triển khai chủ yếu qua HTTP. REST có thể sử dụng các lớp giao tiếp khác. Vì vậy, xác thực RESTful không chỉ là từ đồng nghĩa của xác thực HTTP, bất kể câu trả lời nào của Google. Nó thậm chí không nên sử dụng cơ chế HTTP mà phải được trừu tượng hóa từ lớp giao tiếp. Và nếu bạn sử dụng giao tiếp HTTP, nhờ vào sáng kiến ​​Let Encrypt , không có lý do gì để không sử dụng HTTPS phù hợp, được yêu cầu ngoài bất kỳ sơ đồ xác thực nào.


5
Nếu bạn sử dụng Cookienhư một sự thay thế tốt hơn cho HTTP Basic Authbạn, bạn có thể thực hiện xác thực không trạng thái bằng một phương pháp để hết hạn xác thực và khả năng đăng xuất. Việc triển khai ví dụ có thể sử dụng cookie được gọi Emulated-HTTP-Basic-Authvới giá trị tương tự với Auth cơ bản HTTP thực và ngoài ra đã đặt thời gian hết hạn. Đăng xuất sau đó có thể được thực hiện với việc loại bỏ cookie đó. Tôi đoán rằng bất kỳ khách hàng nào có thể hỗ trợ HTTP Basic Auth cũng có thể hỗ trợ xác thực cookie theo cách này.
Mikko Rantalainen

4
@MikkoRantalainen Nhưng cookie này vẫn sẽ được quản lý bởi máy chủ, như tôi đã viết. Đó là một số loại không quốc tịch, nhưng không "không thuần túy". Trong mọi trường hợp, bạn cần mã JavaScript dành riêng cho đăng nhập / đăng xuất của khách hàng, điều này hoàn toàn có thể, ví dụ như với HTTP Digest Auth - ý tưởng tốt, nhưng không có lợi ích lớn, ở đây, để phát minh lại bánh xe.
Arnaud Bouchez

4
Tôi sẽ tuyên bố rằng máy chủ thực hiện UI và logic để định cấu hình tiêu đề nhưng bản thân tiêu đề là không trạng thái. Một ứng dụng khách được thiết kế cho API có thể bỏ qua việc sử dụng trợ giúp máy chủ để định cấu hình tiêu đề và chỉ cần truyền thông tin bắt buộc tương tự như HTTP Basic Auth. Quan điểm của tôi là các UAs (trình duyệt) thông thường có triển khai Basic Auth kém đến mức không thể sử dụng được. Một máy chủ được cung cấp mô phỏng cho cùng một thứ trong một tiêu đề khác ( Cookie) có thể được sử dụng thay thế.
Mikko Rantalainen

6
Tôi đoán câu trả lời đúng là stackoverflow.com/questions/6068113/ từ
liệu

7
Dấu nhắc mật khẩu xấu cho ủy quyền HTTP sẽ chỉ xuất hiện nếu máy chủ yêu cầu bằng cách gửi lại phản hồi trái phép 401. Nếu bạn không thích nó, chỉ cần gửi 403 Cấm thay thế. Trang lỗi có thể bao gồm một phương thức để đăng nhập hoặc liên kết đến nó. Tuy nhiên, nhưng đối số lớn nhất đối với cookie và xác thực http (bất kể trạng thái là phía máy chủ hay phía máy khách) là chúng dễ bị giả mạo yêu cầu chéo trang. Vì lý do này, cách tiếp cận tốt nhất là lược đồ ủy quyền tùy chỉnh, tiêu đề ủy quyền tùy chỉnh hoặc tham số GET hoặc POST tùy chỉnh.
Dobes Vandermeer

418

Tôi nghi ngờ liệu mọi người có nhiệt tình hét lên "Xác thực HTTP" đã từng thử tạo một ứng dụng dựa trên trình duyệt (thay vì dịch vụ web từ máy sang máy) với REST (không có ý định xúc phạm - Tôi chỉ không nghĩ rằng họ từng phải đối mặt với các biến chứng) .

Các vấn đề tôi gặp phải khi sử dụng Xác thực HTTP trên các dịch vụ RESTful tạo ra các trang HTML được xem trong trình duyệt là:

  • người dùng thường nhận được một hộp đăng nhập do trình duyệt xấu xí, rất không thân thiện với người dùng. bạn không thể thêm truy xuất mật khẩu, hộp trợ giúp, vân vân.
  • Đăng xuất hoặc đăng nhập dưới một tên khác là một vấn đề - trình duyệt sẽ tiếp tục gửi thông tin xác thực đến trang web cho đến khi bạn đóng cửa sổ
  • thời gian chờ rất khó

Một bài viết rất sâu sắc giải quyết từng điểm một ở đây , nhưng điều này dẫn đến rất nhiều vụ hack javascript dành riêng cho trình duyệt, cách giải quyết cho cách giải quyết, et cetera. Do đó, nó cũng không tương thích về phía trước nên sẽ cần bảo trì liên tục vì các trình duyệt mới được phát hành. Tôi không xem xét thiết kế rõ ràng và sạch sẽ đó, cộng với tôi cảm thấy đó là công việc làm thêm và đau đầu chỉ để tôi có thể nhiệt tình hiển thị huy hiệu REST của mình cho bạn bè.

Tôi tin rằng cookie là giải pháp. Nhưng chờ đã, bánh quy có độc không? Không, họ không, cách mà cookie thường được sử dụng là xấu xa. Bản thân một cookie chỉ là một phần thông tin phía máy khách, giống như thông tin xác thực HTTP mà trình duyệt sẽ theo dõi trong khi bạn duyệt. Và phần thông tin phía máy khách này được gửi đến máy chủ theo mọi yêu cầu, một lần nữa giống như thông tin Xác thực HTTP. Về mặt khái niệm, sự khác biệt duy nhất là nội dung của phần trạng thái phía máy khách này có thể được xác định bởi máy chủ như là một phần của phản ứng của nó.

Bằng cách biến phiên thành tài nguyên RESTful chỉ với các quy tắc sau:

  • Một phiên ánh xạ khóa tới id người dùng (và có thể là dấu thời gian hành động cuối cùng cho thời gian chờ)
  • Nếu một phiên tồn tại, điều đó có nghĩa là khóa là hợp lệ.
  • Đăng nhập nghĩa là ĐĂNG vào / phiên, một khóa mới được đặt làm cookie
  • Đăng xuất nghĩa là XÓA / session / {key} (với POST bị quá tải, hãy nhớ, chúng tôi là một trình duyệt và HTML 5 còn một chặng đường dài nữa)
  • Xác thực được thực hiện bằng cách gửi khóa dưới dạng cookie theo mọi yêu cầu và kiểm tra xem phiên có tồn tại và hợp lệ không

Bây giờ, điểm khác biệt duy nhất với Xác thực HTTP là khóa xác thực được tạo bởi máy chủ và được gửi đến máy khách tiếp tục gửi lại, thay vì máy khách tính toán từ thông tin đăng nhập.

convert42 cho biết thêm rằng khi sử dụng https (mà chúng ta nên), điều quan trọng là cookie sẽ được đặt cờ bảo mật để thông tin xác thực không bao giờ được gửi qua kết nối không an toàn. Điểm tuyệt vời, đã không nhìn thấy nó bản thân mình.

Tôi cảm thấy rằng đây là một giải pháp đủ hoạt động tốt, nhưng tôi phải thừa nhận rằng tôi không đủ chuyên gia bảo mật để xác định các lỗ hổng tiềm năng trong sơ đồ này - tất cả những gì tôi biết là hàng trăm ứng dụng web không phải RESTful sử dụng giống nhau giao thức đăng nhập ($ _SESSION trong PHP, HttpSession trong Java EE, v.v.). Nội dung tiêu đề cookie được sử dụng đơn giản để giải quyết tài nguyên phía máy chủ, giống như ngôn ngữ chấp nhận có thể được sử dụng để truy cập tài nguyên dịch thuật, v.v. Tôi cảm thấy rằng nó giống nhau, nhưng có lẽ những người khác thì không? Bạn nghĩ gì chàng trai?


68
Đây là một câu trả lời thực dụng và giải pháp đề xuất hoạt động. Tuy nhiên, sử dụng thuật ngữ "RESTful" và "session" trong cùng một câu là sai (trừ khi có "không" ở giữa;). Nói cách khác: bất kỳ dịch vụ web nào sử dụng phiên đều KHÔNG PHẢI RESTful (theo định nghĩa). Đừng hiểu lầm tôi - bạn vẫn có thể sử dụng giải pháp này (YMMV), nhưng thuật ngữ "RESTful" không thể được sử dụng cho nó. Tôi giới thiệu cuốn sách O'Reilly về REST rất dễ đọc và giải thích sâu về chủ đề này.
johndodo

23
@skrebbel: giải pháp REST thuần túy sẽ gửi dữ liệu xác thực mỗi khi nó yêu cầu tài nguyên, không hoàn hảo (HTTP Auth thực hiện việc này). Giải pháp đề xuất hoạt động và tốt hơn cho hầu hết các trường hợp sử dụng, nhưng nó không phải là RESTful. Không cần chiến tranh, tôi cũng sử dụng giải pháp này. Tôi không khẳng định đó là RESTful. :)
johndodo

94
Oh đi nào, đưa ra một ví dụ sau đó. Cách khác, hoạt động tốt là gì? Tôi thực sự muốn biết. HTTP Auth chắc chắn là không, bạn không thể đăng xuất mà không đóng trình duyệt và bạn không thể cung cấp UX đăng nhập đàng hoàng mà không có nhiều JS không tương thích với trình duyệt cụ thể. Tôi không quan tâm nhiều đến việc "thuần túy RESTful" so với "gần như RESTful" và toàn bộ cuộc tranh luận tôn giáo liên quan, nhưng nếu bạn nói có một số cách, bạn nên đánh vần chúng.
skrebbel

15
Một xác thực RESTful thực sự với các tác nhân người dùng trong thế giới thực (còn gọi là "trình duyệt") bao gồm một cookie chứa giá trị của Xác thực HTTP. Bằng cách này, máy chủ có thể cung cấp giao diện người dùng để nhập thông tin đăng nhập và mật khẩu và máy chủ có thể buộc đăng xuất (bằng cách xóa cookie). Ngoài ra, thay vì trả lời 401 để yêu cầu đăng nhập khi xác thực thất bại, máy chủ phải sử dụng chuyển hướng tạm thời đến màn hình đăng nhập và sau khi đăng nhập thành công, hãy sử dụng chuyển hướng tạm thời trở lại vị trí trước đó. Ngoài ra, máy chủ phải nhúng hành động đăng xuất (dạng POST) vào khá nhiều trang cho người dùng đã đăng nhập.
Mikko Rantalainen

15
Tôi không thấy có gì sai khi sử dụng "restful" và "session" trong cùng một câu miễn là rõ ràng rằng phiên chỉ tồn tại ở phía khách hàng. Tôi không chắc tại sao một thỏa thuận lớn như vậy được thực hiện về khái niệm này.
Joe Phillips

140

Đã đủ nói về chủ đề này bởi những người tốt ở đây. Nhưng đây là 2 xu của tôi.

Có 2 chế độ tương tác:

  1. người-máy (HTM)
  2. máy-to-máy (MTM)

Máy là mẫu số chung, được biểu thị dưới dạng API REST và các tác nhân / khách hàng là con người hoặc máy móc.

Bây giờ, trong một kiến ​​trúc RESTful thực sự, khái niệm về trạng thái không trạng thái ngụ ý rằng tất cả các trạng thái ứng dụng có liên quan (có nghĩa là trạng thái phía máy khách) phải được cung cấp cho mỗi và mọi yêu cầu. Theo có liên quan, điều đó có nghĩa là bất cứ điều gì được API REST yêu cầu để xử lý yêu cầu và cung cấp phản hồi thích hợp.

Khi chúng tôi xem xét điều này trong ngữ cảnh của các ứng dụng giữa người với máy, "dựa trên trình duyệt" như Skrebbel chỉ ra ở trên, điều này có nghĩa là ứng dụng (web) đang chạy trong trình duyệt sẽ cần gửi thông tin liên quan và trạng thái của nó với mỗi yêu cầu nó làm cho các API REST phía sau.

Xem xét điều này: Bạn có tài sản được hiển thị trên nền tảng dữ liệu / thông tin của API REST. Có lẽ bạn có một nền tảng BI tự phục vụ xử lý tất cả các khối dữ liệu. Nhưng bạn muốn khách hàng (con người) của mình truy cập ứng dụng này thông qua (1) ứng dụng web, (2) ứng dụng di động và (3) một số ứng dụng của bên thứ 3. Cuối cùng, ngay cả chuỗi MTM cũng dẫn đến HTM - đúng. Vì vậy, người dùng vẫn ở đỉnh của chuỗi thông tin.

Trong 2 trường hợp đầu tiên, bạn có trường hợp tương tác giữa người với máy, thông tin thực sự được sử dụng bởi người dùng. Trong trường hợp cuối cùng, bạn có một chương trình máy tiêu thụ API REST.

Khái niệm xác thực áp dụng trên bảng. Làm thế nào bạn sẽ thiết kế cái này để API REST của bạn được truy cập một cách thống nhất, bảo mật? Cách tôi nhìn thấy điều này, có 2 cách:

Cách-1:

  1. Không có đăng nhập, để bắt đầu với. Mỗi yêu cầu thực hiện đăng nhập
  2. Máy khách gửi các tham số xác định của nó + các tham số cụ thể của yêu cầu với mỗi yêu cầu
  3. API REST lấy chúng, quay lại, ping cửa hàng người dùng (bất kể đó là gì) và xác nhận auth
  4. Nếu auth được thiết lập, dịch vụ yêu cầu; mặt khác, từ chối với mã trạng thái HTTP thích hợp
  5. Lặp lại ở trên cho mọi yêu cầu trên tất cả các API REST trong danh mục của bạn

Cách 2:

  1. Khách hàng bắt đầu với một yêu cầu xác thực
  2. API REST đăng nhập sẽ xử lý tất cả các yêu cầu như vậy
  3. Nó nhận các tham số auth (khóa API, uid / pwd hoặc bất cứ thứ gì bạn chọn) và xác minh auth đối với cửa hàng người dùng (LDAP, AD hoặc MySQL DB, v.v.)
  4. Nếu được xác minh, hãy tạo mã thông báo xác thực và trao lại cho khách hàng / người gọi
  5. Sau đó, người gọi sẽ gửi mã thông báo xác thực này + yêu cầu các thông số cụ thể với mọi yêu cầu tiếp theo tới các API REST kinh doanh khác, cho đến khi đăng xuất hoặc cho đến khi hết hạn thuê

Rõ ràng, trong Way-2, các API REST sẽ cần một cách để nhận biết và tin tưởng mã thông báo là hợp lệ. API đăng nhập đã thực hiện xác minh xác thực và do đó "khóa valet" cần được tin cậy bởi các API REST khác trong danh mục của bạn.

Tất nhiên, điều này có nghĩa là khóa / mã thông báo xác thực sẽ cần được lưu trữ và chia sẻ giữa các API REST. Kho lưu trữ mã thông báo được chia sẻ, đáng tin cậy này có thể là cục bộ / được liên kết bất cứ điều gì, cho phép các API REST từ các tổ chức khác tin tưởng lẫn nhau.

Nhưng tôi lạc đề.

Vấn đề là, một "trạng thái" (về trạng thái xác thực của khách hàng) cần được duy trì và chia sẻ để tất cả các API REST có thể tạo ra một vòng tròn tin cậy. Nếu chúng tôi không làm điều này, đó là Cách 1, chúng tôi phải chấp nhận rằng một hành động xác thực phải được thực hiện cho bất kỳ / tất cả các yêu cầu đến.

Thực hiện xác thực là một quá trình tốn nhiều tài nguyên. Hãy tưởng tượng thực hiện các truy vấn SQL, cho mọi yêu cầu đến, đối với cửa hàng người dùng của bạn để kiểm tra kết quả khớp uid / pwd. Hoặc, để mã hóa và thực hiện khớp băm (kiểu AWS). Và về mặt kiến ​​trúc, mọi API REST sẽ cần thực hiện điều này, tôi nghi ngờ, bằng cách sử dụng một dịch vụ đăng nhập back-end chung. Bởi vì, nếu bạn không, thì bạn xả rác mã xác thực ở mọi nơi. Một mớ hỗn độn.

Vì vậy, các lớp nhiều hơn, độ trễ nhiều hơn.

Bây giờ, lấy Way-1 và áp dụng cho HTM. Người dùng (con người) của bạn có thực sự quan tâm nếu bạn phải gửi uid / pwd / hash hoặc bất cứ điều gì với mọi yêu cầu không? Không, miễn là bạn không làm phiền cô ấy bằng cách ném trang auth / đăng nhập mỗi giây. Chúc may mắn có khách hàng nếu bạn làm. Vì vậy, những gì bạn sẽ làm là lưu trữ thông tin đăng nhập ở đâu đó ở phía máy khách, trong trình duyệt, ngay từ đầu và gửi nó với mỗi yêu cầu được đưa ra. Đối với người dùng (con người), cô ấy đã đăng nhập và "phiên" có sẵn. Nhưng trong thực tế, cô được xác thực theo mọi yêu cầu.

Tương tự với Way-2. Người dùng (con người) của bạn sẽ không bao giờ nhận thấy. Vì vậy, không có hại đã được thực hiện.

Điều gì xảy ra nếu chúng ta áp dụng Way-1 cho MTM? Trong trường hợp này, vì là một cỗ máy, chúng ta có thể khiến anh chàng này chán nản bằng cách yêu cầu nó gửi thông tin xác thực với mọi yêu cầu. Không ai quan tâm! Thực hiện Way-2 trên MTM sẽ không gợi lên bất kỳ phản ứng đặc biệt nào; nó là một cái máy chết tiệt Nó có thể quan tâm ít hơn!

Vì vậy, thực sự, câu hỏi là những gì phù hợp với nhu cầu của bạn. Không quốc tịch có một cái giá phải trả. Trả giá và di chuyển trên. Nếu bạn muốn trở thành một người theo chủ nghĩa thuần túy, thì hãy trả giá cho điều đó, và tiếp tục.

Cuối cùng, triết học không thành vấn đề. Điều thực sự quan trọng là khám phá thông tin, trình bày và trải nghiệm tiêu dùng. Nếu mọi người yêu thích API của bạn, bạn đã làm công việc của mình.


3
Thưa bạn, bạn đã giải thích điều này rất hay đến nỗi tôi có một ý tưởng rõ ràng về vấn đề / câu hỏi cơ bản trong tay. Bạn giống như Đức Phật! Tôi có thể thêm rằng bằng cách sử dụng HTTPS ở lớp vận chuyển, chúng tôi thậm chí có thể ngăn chặn các cuộc tấn công của Man In the Middle, để không ai chiếm quyền điều khiển khóa định danh của tôi (nếu Cách 1 được chọn)
Vishnoo Rath

Không phải nó luôn luôn là một máy thực hiện xác thực? Con người không nói tào lao về mật khẩu, đó là một sự phiền toái đáng tiếc cho những người dùng hợp lý hóa bảo mật. Đối với tôi, đó là vấn đề của nhà phát triển về cách họ muốn máy hoạt động.
Todd Baur

9
Tôi đọc câu trả lời của bạn; trong giải pháp của bạn, đối với mỗi yêu cầu web duy nhất xuất phát trên trình duyệt bởi các lần nhấp của người dùng sẽ cần gửi lại "mã xác thực" cho bất kỳ API nào mà người dùng nhấp vào đang gọi. Sau đó thì sao? API thực hiện kiểm tra mã thông báo. Chống lại cái gì? Chống lại một số loại "cửa hàng mã thông báo" duy trì xem mã thông báo đó có hợp lệ hay không. Bạn không đồng ý rằng "cửa hàng mã thông báo" sau đó trở thành người giữ "trạng thái"? Thực sự, tuy nhiên, theo cách bạn thấy, một người nào đó ở đâu đó phải biết điều gì đó về "mã thông báo" được truyền qua các hoạt động của người dùng. Đó là nơi thông tin nhà nước sống.
Kingz

5
Và bởi dịch vụ "không trạng thái", điều thực sự có nghĩa là thành phần máy chủ cụ thể đó (API CRUD) không mang bất kỳ trạng thái nào. Họ không nhận ra một người dùng từ người khác và hoàn thành toàn bộ yêu cầu của người dùng trong một giao dịch. Đó là trạng thái không quốc tịch. Nhưng ai đó ở đâu đó phải ngồi và chuyển phán quyết về việc người dùng này có hợp lệ hay không. Không có cách nào khác để làm điều này; chìa khóa hoặc mật khẩu hoặc bất cứ điều gì. Bất cứ điều gì được thông qua từ phía người dùng phải được xác thực và ủy quyền.
Kingz

1
Bạn đang thiếu Way-3, cách tiếp cận lai. Máy khách đăng nhập như trong Way-2nhưng, như trong Way-1, thông tin đăng nhập không được kiểm tra đối với bất kỳ trạng thái phía máy chủ nào. Bất kể, mã thông báo xác thực được tạo và gửi lại cho khách hàng như trong Way-2. Mã thông báo này sau đó được kiểm tra tính xác thực bằng cách sử dụng tiền điện tử bất đối xứng mà không cần tìm kiếm bất kỳ trạng thái cụ thể nào của khách hàng.
jcoffland 7/10/2015

50

Đây là một giải pháp xác thực RESTful thực sự và hoàn toàn:

  1. Tạo một cặp khóa công khai / riêng trên máy chủ xác thực.
  2. Phân phối khóa công khai cho tất cả các máy chủ.
  3. Khi một khách hàng xác thực:

    3.1. phát hành mã thông báo có chứa các mục sau:

    • Thời gian hết hạn
    • tên người dùng (tùy chọn)
    • IP người dùng (tùy chọn)
    • băm mật khẩu (tùy chọn)

    3.2. Mã hóa mã thông báo bằng khóa riêng.

    3.3. Gửi mã thông báo được mã hóa lại cho người dùng.

  4. Khi người dùng truy cập bất kỳ API nào, họ cũng phải chuyển mã thông báo xác thực của họ.

  5. Máy chủ có thể xác minh rằng mã thông báo hợp lệ bằng cách giải mã nó bằng khóa chung của máy chủ xác thực.

Đây là xác thực không trạng thái / RESTful.

Lưu ý rằng nếu bao gồm hàm băm mật khẩu, người dùng cũng sẽ gửi mật khẩu không được mã hóa cùng với mã xác thực. Máy chủ có thể xác minh rằng mật khẩu khớp với mật khẩu đã được sử dụng để tạo mã thông báo xác thực bằng cách so sánh các giá trị băm. Một kết nối an toàn sử dụng một cái gì đó như HTTPS sẽ là cần thiết. Javascript trên các mặt hàng có thể xử lý nhận được mật khẩu của người sử dụng và lưu trữ bên client nó, hoặc trong bộ nhớ hoặc trong một cookie, có thể được mã hóa với máy chủ của công then chốt.


5
Điều gì xảy ra nếu ai đó nắm giữ mã thông báo xác thực đó và gọi API với nó giả vờ là khách hàng?
Abidi

2
@ Abidi, vâng đó là một vấn đề. Bạn có thể yêu cầu một mật khẩu. Băm mật khẩu có thể được bao gồm trong mã xác thực. Nếu ai đó có thể đánh cắp mã thông báo, nó sẽ dễ bị tấn công ngoại tuyến. Nếu một cụm mật khẩu mạnh được chọn sẽ không thành vấn đề. Lưu ý rằng nếu bạn đã sử dụng hành vi trộm cắp mã thông báo https sẽ yêu cầu kẻ tấn công trước tiên có quyền truy cập vào máy của khách hàng.
jcoffland

1
Bởi vì chỉ có máy chủ xác thực biết khóa riêng. Các máy chủ khác có thể xác thực người dùng chỉ bằng cách biết khóa chung và mã thông báo của người dùng.
jcoffland

1
Mã hóa và giải mã bất đối xứng là một thứ tự có độ lớn chậm hơn (chuyên sâu tính toán hơn) so với mã hóa đối xứng. Việc sử dụng máy chủ sử dụng khóa chung để giải mã mã thông báo trên mỗi cuộc gọi sẽ là một nút cổ chai hiệu năng rất lớn .
Craig

3
@jcoffland bạn thực sự đã quảng cáo câu trả lời của mình ở đây (lặp đi lặp lại :-) Nhưng tôi không thể giúp nhận xét về các vấn đề về hiệu suất (cường độ tính toán) của việc sử dụng mã hóa bất đối xứng trên mỗi cuộc gọi. Tôi không thể thấy một giải pháp nào có khả năng mở rộng quy mô. Tra cứu HTTPS và giao thức SPDY. Nó có độ dài để giữ cho các kết nối mở (giữ HTTP, là trạng thái) và phục vụ nhiều tài nguyên theo lô trên cùng một kết nối (trạng thái nhiều hơn) và tất nhiên SSL chỉ sử dụng mã hóa bất đối xứng để trao đổi khóa mật mã đối xứng ( cũng nhà nước).
Craig

37

Thành thật mà nói với bạn, tôi đã thấy những câu trả lời tuyệt vời ở đây nhưng điều khiến tôi bực mình một chút là khi ai đó sẽ đưa toàn bộ khái niệm Không quốc tịch đến cực điểm nơi nó trở nên giáo điều. Nó làm tôi nhớ đến những người hâm mộ Smalltalk cũ đó chỉ muốn nắm lấy OO thuần túy và nếu một cái gì đó không phải là một đối tượng, thì bạn đã làm sai. Hãy cho tôi một break.

Cách tiếp cận RESTful được cho là làm cho cuộc sống của bạn dễ dàng hơn và giảm chi phí và chi phí cho các phiên, hãy cố gắng tuân theo vì đó là một việc làm khôn ngoan, nhưng ngay khi bạn tuân theo một kỷ luật (bất kỳ kỷ luật / hướng dẫn nào) đến mức cực đoan không còn cung cấp lợi ích mà nó đã dự định, sau đó bạn đang làm sai. Một số ngôn ngữ tốt nhất hiện nay có cả hai, lập trình chức năng và định hướng đối tượng.

Nếu cách dễ nhất để bạn giải quyết vấn đề của mình là lưu trữ khóa xác thực trong cookie và gửi nó trên tiêu đề HTTP, thì hãy làm điều đó, đừng lạm dụng nó. Hãy nhớ rằng các phiên là xấu khi chúng trở nên nặng và lớn, nếu tất cả các phiên của bạn bao gồm một chuỗi ngắn chứa một khóa, thì vấn đề lớn là gì?

Tôi sẵn sàng chấp nhận sửa chữa trong các bình luận nhưng tôi chỉ không thấy vấn đề (cho đến nay) trong việc làm cho cuộc sống của chúng ta khốn khổ chỉ đơn giản là tránh giữ một từ điển lớn băm trong máy chủ của chúng tôi.


2
Mọi người không cố gắng cấm bạn sử dụng phiên. Bạn được tự do làm điều đó. Nhưng nếu bạn làm thế, nó không phải là REST.
André Caldas

6
@ AndréCaldas nó không phải là REST theo cùng một cách mà có các hàm hoặc kiểu nguyên thủy trong một ngôn ngữ không phải là oop. Tôi không nói rằng có phiên là khuyến khích. Tôi chỉ đưa ra ý kiến ​​của mình về việc tuân theo một tập hợp thực hành đến một mức độ mà họ không còn cung cấp cho ai đó lợi ích. (Btw, lưu ý rằng tôi đã không phản đối nhận xét của bạn, tuy nhiên, tôi sẽ không nói đó không phải là REST, tôi sẽ nói đó không phải REST thuần túy ).
arg20

Vậy chúng ta gọi nó là gì nếu nó không RESTful? Và chắc chắn nếu một yêu cầu bao gồm Id phiên, thì đó có phải là trạng thái không trạng thái như một yêu cầu bao gồm Id người dùng không? Tại sao Id của người dùng không trạng thái và Id phiên có trạng thái?
mfhholm

1
Cookies rất dễ bị giả mạo yêu cầu trên nhiều trang web, vì vậy chúng giúp cho việc vi phạm an ninh dễ dàng hơn. Tốt hơn là sử dụng một cái gì đó không được trình duyệt tự động gửi như tiêu đề tùy chỉnh hoặc lược đồ ủy quyền tùy chỉnh.
Dobes Vandermeer

1
Trong thực tế, cố gắng không quốc tịch không phải là về chủ nghĩa giáo điều, mà là về một quan niệm phổ biến về chính SOA. Các dịch vụ phải luôn được hưởng lợi từ việc tách rời và không trạng thái: trong thực tế, nó giúp giảm bớt quy mô, tính sẵn có và khả năng bảo trì. Tất nhiên, nó nên càng nhiều càng tốt, và cuối cùng bạn sẽ cần một số "dịch vụ điều phối" để quản lý các dịch vụ phi trạng thái đó thành một cách tiếp cận thực dụng.
Arnaud Bouchez

32

Đầu tiên và quan trọng nhất, một dịch vụ web RESTful là STATELESS (hay nói cách khác là SESSIONLESS). Do đó, dịch vụ RESTful không có và không nên có khái niệm về phiên hoặc cookie liên quan. Cách để xác thực hoặc ủy quyền trong dịch vụ RESTful là sử dụng tiêu đề Ủy quyền HTTP như được định nghĩa trong thông số kỹ thuật HTTP RFC 2616. Mỗi yêu cầu phải chứa tiêu đề Ủy quyền HTTP và yêu cầu phải được gửi qua kết nối HTTP (SSL). Đây là cách chính xác để thực hiện xác thực và xác minh ủy quyền các yêu cầu trong dịch vụ web HTTP RESTful. Tôi đã triển khai dịch vụ web RESTful cho ứng dụng Cisco PRIME Performance Manager tại Cisco Systems. Và như một phần của dịch vụ web đó, tôi cũng đã triển khai xác thực / ủy quyền.


5
Xác thực HTTP vẫn yêu cầu máy chủ theo dõi id người dùng và mật khẩu. Điều này không hoàn toàn không quốc tịch.
jcoffland

21
Theo nghĩa không có nghĩa là mỗi yêu cầu đều có hiệu lực mà không có bất kỳ yêu cầu nào của các yêu cầu trước đó. Làm thế nào điều này được thực hiện trên máy chủ là một vấn đề khác, nếu xác thực tốn kém, bạn có thể thực hiện một số bộ nhớ đệm và xác thực lại trên bộ nhớ cache. Rất ít máy chủ hoàn toàn không trạng thái trong đó đầu ra hoàn toàn là một chức năng của đầu vào. Nó thường là một truy vấn hoặc cập nhật cho một số trạng thái.
Erik Martino

3
Không đúng. Trong trường hợp này, tất cả các yêu cầu của bạn yêu cầu trạng thái từ một giao dịch trước đó, cụ thể là đăng ký người dùng. Tôi không thấy lý do tại sao mọi người cứ cố nói rằng tên người dùng và mật khẩu được lưu trữ trên máy chủ không phải là trạng thái phía máy chủ. Xem câu trả lời của tôi.
jcoffland

1
@jcoffland Ngoài ra, giải pháp của bạn phụ thuộc rất nhiều vào khả năng của máy chủ API để giải mã mã thông báo đã ký. Tôi nghĩ rằng cách tiếp cận này không chỉ quá cụ thể, mà còn hơi phức tạp một chút để có thể nghĩ là THE Phê duyệt R. Fielding có ý định giải quyết vấn đề xác thực RESTful.
Michael Ekoka

2
@jcoffland bạn có hiểu mã hóa bất đối xứng chuyên sâu hơn về mặt tính toán (và do đó sử dụng nhiều tài nguyên và cực kỳ chậm) không? Bạn đang nói về một sơ đồ sẽ sử dụng mã hóa bất đối xứng cho mỗi yêu cầu. Khía cạnh chậm nhất của HTTPS, không có gì, là cái bắt tay ban đầu liên quan đến việc tạo khóa công khai / riêng tư để mã hóa bất đối xứng một bí mật chung được sử dụng để mã hóa đối xứng tất cả các giao tiếp tiếp theo.
Craig

22

Nó chắc chắn không phải là về "khóa phiên" vì nó thường được sử dụng để chỉ xác thực không phiên được thực hiện trong tất cả các ràng buộc của REST. Mỗi yêu cầu là tự mô tả, mang đủ thông tin để tự mình ủy quyền yêu cầu mà không có bất kỳ trạng thái ứng dụng phía máy chủ nào.

Cách dễ nhất để tiếp cận điều này là bắt đầu với các cơ chế xác thực tích hợp sẵn của HTTP trong RFC 2617 .


Xác thực HTTP yêu cầu máy chủ lưu trữ tên người dùng và mật khẩu. Đây là trạng thái phía máy chủ và do đó không hoàn toàn REST. Xem câu trả lời của tôi.
jcoffland

3
@jcoffland: Điều đó đơn giản là không đúng, trên cả hai tài khoản. Auth HTTP đầu tiên không yêu cầu máy chủ lưu trữ mật khẩu. Thay vào đó, hàm băm của mật khẩu được lưu trữ (bcrypt với hơn 8 vòng được khuyến nghị). Thứ hai, máy chủ không có bất kỳ trạng thái nào vì tiêu đề ủy quyền được gửi với mọi yêu cầu. Và nếu bạn coi băm mật khẩu được lưu trữ là trạng thái , chúng không còn trạng thái hơn các khóa công khai được lưu trữ.
Boris B.

1
@Boris B., vâng tôi hiểu rằng mật khẩu được lưu dưới dạng băm. Mật khẩu băm vẫn là trạng thái cụ thể của khách hàng. Sự khác biệt với việc lưu trữ khóa công khai, như được mô tả trong giải pháp của tôi, là chỉ có một khóa chung, khóa chung của máy chủ xác thực. Điều này rất khác so với việc lưu trữ một mật khẩu băm cho mỗi người dùng. Bất kể bạn ăn mặc như thế nào nếu máy chủ lưu mật khẩu cho mỗi người dùng thì nó sẽ được lưu trên mỗi trạng thái người dùng và không phải là 100% REST.
jcoffland

7
Tôi không nghĩ việc lưu trữ mật khẩu băm của người dùng trên máy chủ nên được coi là trạng thái phía máy chủ. Người dùng là tài nguyên, chứa thông tin như tên, địa chỉ hoặc mật khẩu băm.
Codepunkt

15

Bài viết 'rất sâu sắc' được đề cập bởi @skrebel ( http://www.berenddeboer.net/rest/authentication.html ) thảo luận về một phương pháp xác thực phức tạp nhưng thực sự bị phá vỡ.

Bạn có thể thử truy cập trang (được cho là chỉ có thể xem được đối với người dùng được xác thực) http://www.berenddeboer.net/rest/site/authenticated.html mà không có bất kỳ thông tin đăng nhập nào.

(Xin lỗi tôi không thể nhận xét về câu trả lời.)

Tôi muốn nói REST và xác thực đơn giản là không trộn lẫn. REST có nghĩa là không trạng thái nhưng 'xác thực' là một trạng thái. Bạn không thể có cả hai ở cùng một lớp. Nếu bạn là người ủng hộ RESTful và cau mày với các trạng thái, thì bạn phải đi với HTTPS (nghĩa là để vấn đề bảo mật sang lớp khác).


Stripe.com sẽ nói khác với nhận xét của bạn về REST và Xác thực không trộn lẫn ..
Erik

Statless chỉ đề cập đến máy chủ, không phải máy khách. Khách hàng có thể nhớ tất cả trạng thái của phiên và gửi những gì có liên quan với từng yêu cầu.
Dobes Vandermeer

Cuối cùng ai đó nói một số ý nghĩa, nhưng xác thực không trạng thái có thể sử dụng tiền điện tử khóa công khai. Xem câu trả lời của tôi.
jcoffland

1
Máy chủ không có trạng thái "xác thực". Nó nhận được thông tin qua hypermedia và phải làm việc với nó để trả lại những gì được yêu cầu. Không hơn không kém Nếu tài nguyên được bảo vệ và yêu cầu xác thực và ủy quyền, hypermedia được cung cấp phải bao gồm thông tin đó. Tôi không biết khái niệm xác thực người dùng trước khi trả lại tài nguyên có nghĩa là máy chủ đang theo dõi trạng thái đến từ đâu. Cung cấp tên người dùng và mật khẩu rất có thể được coi là chỉ đơn giản là cung cấp nhiều tham số lọc hơn.
Michael Ekoka

"Tôi sẽ nói REST và xác thực đơn giản là không trộn lẫn." Âm thanh như một số ý nghĩa thông thường. Tất nhiên, ngoại trừ việc một hệ thống không tương thích với xác thực (bản thân "được xác thực" là một trạng thái) có tính hữu dụng hạn chế. Tôi cảm thấy như tất cả chúng ta đang tranh cãi ở giao điểm của thực tiễn và chủ nghĩa giáo điều thuần túy, và thực tế thẳng thắn nên chiến thắng. Có rất nhiều khía cạnh của REST rất có lợi mà không gặp phải các vấn đề cố gắng tránh trạng thái liên quan đến xác thực, phải không?
Craig

12

Tôi nghĩ rằng xác thực yên tĩnh liên quan đến việc chuyển mã thông báo xác thực làm tham số trong yêu cầu. Ví dụ là việc sử dụng apikeys của api's. Tôi không tin việc sử dụng cookie hoặc http auth đủ điều kiện.


Nên tránh sử dụng Cookies và HTTP Auth vì lỗ hổng CSRF.
Dobes Vandermeer

@DobesVandermeer Bạn có thể vui lòng xem câu hỏi của tôi nếu bạn có thể giúp đỡ? stackoverflow.com/questions/60111743/ từ
Hemant Metalia

12

Cập nhật vào ngày 16 tháng 2 năm 2019

Cách tiếp cận được đề cập trước đây về cơ bản là loại cấp quyền "Thông tin mật khẩu của chủ sở hữu tài nguyên" của OAuth2.0 . Đây là một cách dễ dàng để đứng dậy và chạy. Tuy nhiên, với cách tiếp cận này, mọi ứng dụng trong tổ chức sẽ kết thúc với các cơ chế xác thực và ủy quyền riêng. Cách tiếp cận được đề xuất là loại cấp "Mã ủy quyền". Ngoài ra, trong câu trả lời trước đây của tôi bên dưới, tôi đã đề xuất trình duyệt localStorage để lưu trữ mã thông báo xác thực. Tuy nhiên, tôi đã tin rằng cookie là lựa chọn phù hợp cho mục đích này. Tôi đã nêu chi tiết lý do của mình, cách tiếp cận triển khai loại cấp mã ủy quyền, cân nhắc bảo mật, v.v. trong câu trả lời StackOverflow này .


Tôi nghĩ rằng cách tiếp cận sau đây có thể được sử dụng để xác thực dịch vụ REST:

  1. Tạo API RESTful đăng nhập để chấp nhận tên người dùng và mật khẩu để xác thực. Sử dụng phương pháp POST HTTP để ngăn bộ nhớ đệm và SSL để bảo mật trong quá trình Khi xác thực thành công, API trả về hai JWT - một mã thông báo truy cập (có hiệu lực ngắn hơn, giả sử là 30 phút) và một mã thông báo làm mới (có hiệu lực lâu hơn, giả sử là 24 giờ)
  2. Máy khách (giao diện người dùng dựa trên web) lưu trữ JWT trong bộ nhớ cục bộ và trong mọi lệnh gọi API tiếp theo sẽ chuyển mã thông báo truy cập trong tiêu đề "Authorization: Bearer #access token"
  3. API kiểm tra tính hợp lệ của mã thông báo bằng cách xác minh chữ ký và ngày hết hạn. Nếu mã thông báo hợp lệ, hãy kiểm tra xem người dùng (Nó diễn giải khiếu nại "phụ" trong JWT là tên người dùng) có quyền truy cập vào API bằng cách tra cứu bộ đệm. Nếu người dùng được phép truy cập API, hãy thực hiện logic nghiệp vụ
  4. Nếu mã thông báo hết hạn, API sẽ trả về mã phản hồi HTTP 400
  5. Máy khách, khi nhận được 400/401, gọi một API REST khác với mã thông báo làm mới trong tiêu đề "Ủy quyền: Bearer #refresh token" để nhận mã thông báo truy cập mới.
  6. Khi nhận được cuộc gọi bằng mã thông báo làm mới, hãy kiểm tra xem mã thông báo làm mới có hợp lệ không bằng cách kiểm tra chữ ký và ngày hết hạn. Nếu mã thông báo làm mới là hợp lệ, hãy làm mới bộ đệm quyền truy cập của người dùng từ DB và trả lại mã thông báo truy cập mới và mã thông báo làm mới. Nếu mã thông báo làm mới không hợp lệ, hãy trả về mã phản hồi HTTP 400
  7. Nếu mã thông báo truy cập mới và mã thông báo làm mới được trả về, hãy chuyển đến bước 2. Nếu mã phản hồi HTTP 400 được trả về, khách hàng giả định rằng mã thông báo làm mới đã hết hạn và yêu cầu tên người dùng và mật khẩu từ người dùng
  8. Để đăng xuất, thanh lọc bộ nhớ cục bộ

Với phương pháp này, chúng tôi đang thực hiện thao tác tốn kém là tải bộ đệm với quyền truy cập cụ thể của người dùng sau mỗi 30 phút. Vì vậy, nếu quyền truy cập bị thu hồi hoặc quyền truy cập mới được cấp, phải mất 30 phút để phản ánh hoặc đăng xuất sau khi đăng nhập.


Vì vậy, bạn sẽ sử dụng điều này cho một api với một trang web tĩnh được làm bằng góc chẳng hạn? và những gì về ứng dụng di động?
Yazan Rawashdeh

8

Đó là cách để làm điều đó: Sử dụng OAuth 2.0 để đăng nhập .

Bạn có thể sử dụng các phương thức xác thực khác ngoài Google miễn là nó hỗ trợ OAuth.


1
OAuth2 không an toàn nếu không có HTTPS, cũng như không trạng thái.
Arnaud Bouchez

4
Không có gì là an toàn nếu không có HTTPS.
Craig

1
@Craig Và HTTPS cũng có thể không an toàn, nếu chuỗi chứng chỉ bị hỏng, điều này có thể tốt hơn - en.wikipedia.org/wiki/Bullrun_(decoding_program) ;)
Arnaud Bouchez

1
@ArnaudBouchez Hãy làm rõ làm thế nào để có một chuỗi chứng chỉ bị hỏng là tốt hơn? Tôi không hiểu bạn đang đi đâu với điều đó. ;)
Craig

@Craig Hãy theo liên kết, và tận hưởng! Cách tiếp cận "tốt hơn" này rõ ràng là yếm thế trong nhận xét của tôi: Các hệ thống giống như Bullrun có nghĩa là "lợi ích của chính chúng ta" bởi các chính phủ yêu quý và đáng tin cậy của chúng ta.
Arnaud Bouchez

3

Sử dụng cơ sở hạ tầng khóa công khai trong đó việc đăng ký khóa liên quan đến ràng buộc phù hợp đảm bảo rằng khóa chung được ràng buộc với cá nhân được gán theo cách đảm bảo không thoái thác

Xem http://en.wikipedia.org/wiki/Public_key_infr Hạ tầng . Nếu bạn tuân theo các tiêu chuẩn PKI thích hợp, người hoặc đại lý sử dụng khóa bị đánh cắp không đúng cách có thể được xác định và khóa. Nếu tác nhân được yêu cầu sử dụng chứng chỉ, ràng buộc sẽ khá chặt chẽ. Một tên trộm thông minh và nhanh nhẹn có thể trốn thoát, nhưng chúng để lại nhiều mảnh vụn hơn.


2

Để trả lời câu hỏi này từ sự hiểu biết của tôi ...

Một hệ thống xác thực sử dụng REST để bạn không thực sự cần theo dõi hoặc quản lý người dùng trong hệ thống của mình. Điều này được thực hiện bằng cách sử dụng các phương thức HTTP POST, GET, PUT, DELETE. Chúng tôi sử dụng 4 phương thức này và nghĩ về chúng theo cách tương tác cơ sở dữ liệu là TẠO, ĐỌC, CẬP NHẬT, XÓA (nhưng trên web chúng tôi sử dụng POST và GET vì đó là những gì thẻ neo hỗ trợ hiện tại). Vì vậy, coi POST và GET là CREATE / READ / UPDATE / DELETE (CRUD) sau đó chúng ta có thể thiết kế các tuyến đường trong ứng dụng web của mình để có thể suy ra hành động nào của CRUD mà chúng ta đang đạt được.

Ví dụ: trong ứng dụng Ruby on Rails, chúng tôi có thể xây dựng ứng dụng web của mình sao cho nếu người dùng đã đăng nhập truy cập http://store.com/account/logout thì GET của trang đó có thể được xem khi người dùng cố gắng đăng xuất . Trong bộ điều khiển đường ray của chúng tôi, chúng tôi sẽ xây dựng một hành động để đăng xuất người dùng và gửi họ trở lại trang chủ.

Một GET trên trang đăng nhập sẽ mang lại một hình thức. một POST trên trang đăng nhập sẽ được xem như một lần thử đăng nhập và lấy dữ liệu POST và sử dụng nó để đăng nhập.

Đối với tôi, đó là một cách sử dụng các phương thức HTTP được ánh xạ tới ý nghĩa cơ sở dữ liệu của chúng và sau đó xây dựng một hệ thống xác thực với ý nghĩ rằng bạn không cần phải vượt qua bất kỳ phiên id hoặc phiên theo dõi nào.

Tôi vẫn đang học - nếu bạn tìm thấy bất cứ điều gì tôi đã nói là sai xin vui lòng sửa lỗi cho tôi và nếu bạn tìm hiểu thêm hãy đăng lại ở đây. Cảm ơn.


2

Mẹo hợp lệ để bảo mật bất kỳ ứng dụng web nào

Nếu bạn muốn bảo mật ứng dụng của mình, thì bạn chắc chắn nên bắt đầu bằng cách sử dụng HTTPS thay vì HTTP , điều này đảm bảo tạo kênh an toàn giữa bạn và người dùng sẽ ngăn chặn việc đánh hơi dữ liệu được gửi qua lại cho người dùng & sẽ giúp giữ dữ liệu trao đổi bí mật.

Bạn có thể sử dụng JWT (JSON Web Tokens) để bảo mật API RESTful , điều này có nhiều lợi ích khi so sánh với các phiên phía máy chủ, các lợi ích chủ yếu là:

1- Khả năng mở rộng hơn, vì các máy chủ API của bạn sẽ không phải duy trì phiên cho mỗi người dùng (có thể là một gánh nặng lớn khi bạn có nhiều phiên)

2- Các JWT độc lập và có các khiếu nại xác định vai trò người dùng chẳng hạn & những gì anh ta có thể truy cập và ban hành vào ngày & ngày hết hạn (sau đó JWT sẽ không hợp lệ)

3- Dễ dàng xử lý trên các bộ cân bằng tải hơn và nếu bạn có nhiều máy chủ API vì bạn sẽ không phải chia sẻ dữ liệu phiên cũng như cấu hình máy chủ để định tuyến phiên tới cùng một máy chủ, bất cứ khi nào một yêu cầu với JWT có thể được xác thực & ủy quyền

4- Ít áp lực hơn đối với DB của bạn cũng như bạn sẽ không phải liên tục lưu trữ & truy xuất id và dữ liệu phiên cho mỗi yêu cầu

5- Các JWT không thể bị can thiệp nếu bạn sử dụng khóa mạnh để ký JWT, vì vậy bạn có thể tin tưởng vào các khiếu nại trong JWT được gửi với yêu cầu mà không phải kiểm tra phiên người dùng & liệu anh ta có được ủy quyền hay không , bạn chỉ có thể kiểm tra JWT và sau đó bạn đã sẵn sàng để biết ai & người dùng này có thể làm gì.

Nhiều thư viện cung cấp các cách dễ dàng để tạo và xác thực JWT trong hầu hết các ngôn ngữ lập trình, ví dụ: trong node.js, một trong những phổ biến nhất là jsonwebtoken

Do API REST thường nhằm mục đích giữ cho máy chủ không trạng thái, do đó JWT tương thích hơn với khái niệm đó vì mỗi yêu cầu được gửi với mã thông báo ủy quyền được bao gồm (JWT) mà không cần máy chủ phải theo dõi phiên của người dùng so với các phiên tạo ra máy chủ có trạng thái để nó ghi nhớ người dùng và vai trò của anh ta, tuy nhiên, các phiên cũng được sử dụng rộng rãi và có ưu điểm của họ, mà bạn có thể tìm kiếm nếu muốn.

Một điều quan trọng cần lưu ý là bạn phải cung cấp JWT an toàn cho khách hàng bằng HTTPS và lưu nó ở nơi an toàn (ví dụ: trong bộ nhớ cục bộ).

Bạn có thể tìm hiểu thêm về JWT từ liên kết này

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.