A 500 điểm bounty được cung cấp. Complete code và hướng dẫn để nhanh chóng tái tạo vấn đề được đưa ra dưới đây.
HttpSession null sau khi thay thế AuthorizationRequest
CÁC VẤN ĐỀ:
Các
HttpSession
trở thành null
sau một thực hiện tùy chỉnh của DefaultOAuth2RequestFactory
thay thế hiện tại với một AuthorizationRequest
lưu AuthorizationRequest
. này gây
thất bại của yêu cầu tiếp theo để
/oauth/token
vì
CsrfFilter trong chuỗi lọc Xuân An trước
/oauth/token
endpoint là không thể tìm thấy một
session
Csrf token
trong
null
session
để so sánh với 's
Csrf token
request
.
KIỂM SOÁT LƯU TRONG LỖI:
Biểu đồ dưới đây minh họa nơi Bước 14 và Bước 15 bằng cách nào đó null
-ify các HttpSession
. (Hoặc có thể không khớp với số JSESSIONID
.) A SYSO
khi bắt đầu CustomOAuth2RequestFactory.java
trong Bước 14 cho thấy thực tế có một số HttpSession
thực tế chứa đúng CsrfToken
. Tuy nhiên, bằng cách nào đó, HttpSession
đã trở thành null
vào thời điểm Bước 15 kích hoạt cuộc gọi từ máy khách tại địa chỉ localhost:8080/login
trở lại điểm cuối localhost:9999/oauth/token
.
Điểm ngắt được thêm vào mỗi dòng của HttpSessionSecurityContextRepository
được đề cập trong nhật ký gỡ lỗi bên dưới. (Nó nằm trong thư mục Maven Dependencies
của dự án authserver
eclipse.) Các điểm ngắt này xác nhận rằng HttpSession
là null
khi yêu cầu cuối cùng đến /oauth/token
được thực hiện trong sơ đồ dưới đây. (Dưới cùng bên trái của sơ đồ.)null
HttpSession
có thể là do JSESSIONID
vẫn còn trong trình duyệt bị lỗi thời sau khi mã tùy chỉnh DefaultOAuth2RequestFactory
chạy.
Làm cách nào để khắc phục sự cố này, sao cho cùng HttpSession
vẫn còn trong cuộc gọi cuối cùng đến điểm cuối /oauth/token
, sau khi kết thúc Bước 15 trong sơ đồ?
MÃ LIÊN QUAN VÀ GỖ:
Mã hoàn toàn CustomOAuth2RequestFactory.java
can be viewed at a file sharing site by clicking on this link.Chúng ta có thể đoán rằng null
session
là do một trong hai 1.) các JSESSIONID
không được cập nhật trong trình duyệt theo mã trong số CustomOAuth2RequestFactory
hoặc 2.) HttpSession
thực sự là null
đã được hợp nhất.
Các mùa xuân Boot bản ghi gỡ lỗi cho các cuộc gọi đến /oauth/token
sau Bước 15 nêu rõ rằng không có HttpSession
bởi thời điểm đó, và có thể được đọc như sau:
2016-05-30 15:33:42.630 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 1 of 12 in additional filter chain; firing Filter: 'WebAsyncManagerIntegrationFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 2 of 12 in additional filter chain; firing Filter: 'SecurityContextPersistenceFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No HttpSession currently exists
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : No SecurityContext was available from the HttpSession: null. A new one will be created.
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 3 of 12 in additional filter chain; firing Filter: 'HeaderWriterFilter'
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.s.w.header.writers.HstsHeaderWriter : Not injecting HSTS header since it did not match the requestMatcher org.springframework.se[email protected]2fe29f4b
2016-05-30 15:33:42.631 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.FilterChainProxy : /oauth/token at position 4 of 12 in additional filter chain; firing Filter: 'CsrfFilter'
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] o.s.security.web.csrf.CsrfFilter : Invalid CSRF token found for http://localhost:9999/uaa/oauth/token
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] w.c.HttpSessionSecurityContextRepository : SecurityContext is empty or contents are anonymous - context will not be stored in HttpSession.
2016-05-30 15:33:42.644 DEBUG 13897 --- [io-9999-exec-10] s.s.w.c.SecurityContextPersistenceFilter : SecurityContextHolder now cleared, as request processing completed
TÁI TẠO VẤN ĐỀ VỀ MÁY TÍNH CỦA BẠN:
Bạn có thể tạo lại sự cố trên bất kỳ máy tính nào chỉ trong vài phút bằng cách làm theo các bước đơn giản này ps:
1.) Tải xuống zipped version of the app from a file sharing site by clicking on this link.
2.) Giải nén ứng dụng bằng cách gõ: tar -zxvf oauth2.tar(4).gz
3.) Khởi chạy ứng dụng authserver
bằng cách điều hướng đến oauth2/authserver
và sau đó gõ mvn spring-boot:run
.
4.) Khởi chạy ứng dụng resource
bằng cách điều hướng đến oauth2/resource
và sau đó gõ mvn spring-boot:run
5.) Khởi chạy ứng dụng ui
bằng cách điều hướng đến oauth2/ui
và sau đó gõ mvn spring-boot:run
6.) Mở trình duyệt web và điều hướng đến http : // localhost : 8080
7.) Nhấp Login
và sau đó nhập Frodo
làm người dùng và MyRing
làm mật khẩu và nhấp vào để nộp.
8.) Nhập 5309
làm Pin Code
và nhấp gửi. Điều này sẽ kích hoạt lỗi được hiển thị ở trên.
Các mùa xuân Boot bản ghi gỡ lỗi sẽ hiển thị A LOT của SYSO
, mang đến cho các giá trị của các biến như XSRF-TOKEN
và HttpSession
tại mỗi bước thể hiện trong sơ đồ. SYSO
giúp phân đoạn nhật ký gỡ lỗi để chúng dễ hiểu hơn. Và tất cả các SYSO
được thực hiện bởi một lớp được gọi bởi các lớp khác, vì vậy bạn có thể thao tác với lớp học SYSO
để thay đổi báo cáo ở mọi nơi trong luồng điều khiển. Tên của lớp học SYSO
-generating là TestHTTP
và mã nguồn của nó có thể được tìm thấy trong cùng một gói demo
.
SỬ DỤNG Debugger:
1.) Chọn cửa sổ terminal đang chạy ứng dụng authserver
và gõ Ctrl-C
để ngăn chặn các ứng dụng authserver
.
2.) Nhập ba ứng dụng (authserver
, resource
và ui
) vào nhật thực như dự án maven hiện.
3.Trong Trình thám hiểm dự án nhật thực của authserver
, nhấp để mở rộng thư mục Maven Dependencies
, sau đó cuộn xuống bên trong nó để nhấp vào để mở rộng Spring-Security-web...
jar như được minh họa bằng màu cam trong hình ảnh bên dưới. Sau đó cuộn để tìm và mở rộng gói org.springframework.security.web.context
. Sau đó, nhấp đúp để mở lớp HttpSessionSecurityContextRepository
được đánh dấu bằng màu xanh lam trong ảnh chụp màn hình bên dưới. Thêm điểm ngắt cho mỗi dòng trong lớp này. Bạn có thể muốn thực hiện tương tự với lớp SecurityContextPersistenceFilter
trong cùng một gói. Các điểm ngắt này sẽ cho phép bạn xem giá trị của HttpSession
, hiện đang trở thành null
trước khi kết thúc luồng kiểm soát, nhưng cần phải có giá trị hợp lệ có thể được ánh xạ tới XSRF-TOKEN
để giải quyết OP này.
4.) Trong gói demo
của ứng dụng, thêm breakpoint trong CustomOAuth2RequestFactory.java
. Sau đó, Debug As... Spring Boot App
để bắt đầu trình gỡ lỗi.
5.) Sau đó lặp lại các bước từ 6 đến 8 ở trên. Bạn có thể xóa bộ nhớ cache của trình duyệt trước mỗi lần thử mới. Và bạn có thể muốn tab Mạng của các công cụ phát triển của trình duyệt mở.
Cảm ơn bạn RẤT NHIỀU. Bạn đã giải quyết được vấn đề. Tôi đánh dấu đây là câu trả lời được chấp nhận. Tôi ước rằng thời gian của chúng tôi đã cho phép tiền thưởng vẫn có sẵn khi bạn đưa ra câu trả lời của bạn, bởi vì câu trả lời của bạn là giải pháp thực sự cho vấn đề. Chào mừng bạn đến tràn ngăn xếp. – CodeMed
Đây là một chiến thắng-thắng vì tôi cần một mẫu hoàn chỉnh và biểu đồ khái niệm rõ ràng cho nhóm của tôi để làm việc với. Cảm ơn bạn rất nhiều vì sự đóng góp của bạn đã giúp tôi tiết kiệm thời gian tạo ra của riêng mình. Dự án của bạn là nguồn hoàn chỉnh duy nhất tôi có thể tìm thấy trong cộng đồng. –
Thay đổi nhỏ này cũng có thể khắc phục sự cố trong câu hỏi khác của bạn. http://stackoverflow.com/questions/37061697/invalid-xsrf-token-at-oauth-token –