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.
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.
Câu trả lời:
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:
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×tamp=1261496500
và 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.
Cookie
như một sự thay thế tốt hơn cho HTTP Basic Auth
bạ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-Auth
vớ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.
Cookie
) có thể được sử dụng thay thế.
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à:
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:
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?
Đã đủ 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:
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:
Cách 2:
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.
Way-3
, cách tiếp cận lai. Máy khách đăng nhập như trong Way-2
như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.
Đây là một giải pháp xác thực RESTful thực sự và hoàn toàn:
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:
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.
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ọ.
Đâ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.
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.
Đầ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.
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 .
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).
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.
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:
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.
Đó 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.
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.
Để 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.
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