CFSDN nhấn mạnh vào giá trị tạo ra nguồn mở và chúng tôi cam kết xây dựng nền tảng chia sẻ tài nguyên để mọi nhân viên CNTT có thể tìm thấy thế giới tuyệt vời của bạn tại đây.
Bài đăng trên blog CFSDN này sẽ đưa nó vào hoạt động! Làm cách nào để sử dụng ngoại lực để vô hiệu hóa mã thông báo JWT khi đăng xuất? Được tác giả sưu tầm và biên soạn. Nếu các bạn quan tâm tới bài viết này thì nhớ like nhé.

Bài viết hôm nay giới thiệu cách vô hiệu hóa JWT trong các tình huống như thay đổi mật khẩu, sửa đổi quyền, đăng xuất, v.v.
Mục lục của bài viết như sau:

giải pháp
Một trong những ưu điểm lớn nhất của JWT là nó không trạng thái và chứa tất cả thông tin cần thiết để xác thực và xác thực. Máy chủ không cần lưu trữ thông tin đó, do đó giảm chi phí lưu trữ cho máy chủ.
Nhưng những vấn đề do tình trạng không quốc tịch gây ra cũng có thể hiểu được. Nó không thể làm mất hiệu lực của JWT chưa hết hạn. Ví dụ: trong kịch bản đăng xuất, với cơ chế xác thực cookie/phiên truyền thống, bạn chỉ cần xóa phiên tồn tại ở phía máy chủ.
Nhưng đối với JWT, nó không tồn tại ở phía máy chủ. Được rồi, hãy để tôi xóa JWT được lưu trữ ở phía máy khách. Chà, xã hội rất phức tạp, vì vậy hãy ngừng lừa dối chính mình. JWT bị bạn xóa trên máy khách vẫn có thể vượt qua xác thực phía máy chủ.
Một điều cần phải hết sức rõ ràng khi sử dụng JWT: cách duy nhất để JWT trở nên không hợp lệ là đợi hết thời gian.
Nhưng trạng thái của JWT có thể được cứu nhờ sự trợ giúp của ngoại lực. Lúc này, có người hỏi: Đây không phải là một cái tát vào mặt sao? JWT được sử dụng vì tình trạng không quốc tịch của nó, và bây giờ trạng thái của nó cần được cứu?
Trên thực tế, đây không phải là một tình huống tuyệt vọng sao? Nếu không dùng ngoại lực để cứu trạng thái JWT, bạn nghĩ việc đăng xuất sẽ bị vô hiệu như thế nào?
Có hai giải pháp thường được sử dụng là danh sách trắng và danh sách đen.
1. Danh sách trắng.
Logic của danh sách trắng rất đơn giản: khi xác thực được thông qua, JWT được lưu trữ trong redis và khi người dùng đăng xuất, JWT sẽ bị xóa khỏi redis. Phương pháp này tương tự như phương pháp cookie/phiên.
2. Danh sách đen.
Logic của danh sách đen cũng rất đơn giản: khi đăng xuất, đặt JWT vào redis và đặt thời gian hết hạn thành thời gian hết hạn của JWT khi yêu cầu tài nguyên, xác định xem JWT có ở trạng thái redis hay không và từ chối truy cập nếu có; tồn tại.
Cả hai giải pháp, danh sách trắng và danh sách đen, đều tương đối dễ thực hiện, nhưng áp lực mà danh sách đen mang lại cho máy chủ ít hơn nhiều so với danh sách trắng. Suy cho cùng, đăng xuất không phải là một thao tác thường xuyên.
Thực hiện danh sách đen
Phần sau đây sử dụng danh sách đen để giới thiệu cách triển khai tính năng vô hiệu hóa đăng xuất JWT ở cấp cổng.
Chính xác những gì được lưu trữ trong Redis?
Tất nhiên là có thể lưu trữ JWT token trực tiếp nhưng JWT token rất dài nên yêu cầu về bộ nhớ cũng khá cao.
Bất cứ ai quen thuộc với mã thông báo JWT đều biết rằng có một trường jti trong mã thông báo JWT, trường này có thể nói là ID duy nhất của mã thông báo JWT, như sau:

Do đó, trường jti này có thể được lưu trữ trong redis dưới dạng mã định danh mã thông báo duy nhất. Điều này có tiết kiệm được nhiều bộ nhớ không?
Làm thế nào để đạt được nó? Nó được chia thành hai bước:
- Bộ lọc toàn cầu ở lớp cổng cần xác định xem JWT hiện tại có tồn tại trong danh sách đen hay không
- Trong giao diện đăng xuất, trường jti của JWT được lưu trữ trong redis dưới dạng khóa và thời gian hết hạn của JWT được đặt.
1. Lớp cổng phân tích jti và thời gian hết hạn của JWT và đặt chúng vào tiêu đề yêu cầu.
Trong bộ lọc toàn cầu GlobalAuthenticationFilter của cổng, jti và thời gian hết hạn được phân tích cú pháp trực tiếp từ mã thông báo.
Logic ở đây được chia thành các bước sau:
Phân tích jti và thời gian hết hạn của mã thông báo JWT.
Kiểm tra xem nó có nằm trong danh sách đen từ redis theo jti hay không. Nếu nó tồn tại, hãy chặn nó trực tiếp, nếu không thì bỏ qua.
Đóng gói jti đã phân tích cú pháp và thời gian hết hạn vào JSON rồi chuyển nó tới các vi dịch vụ xuôi dòng.
Mã khóa như sau:

2. Sửa đổi bộ lọc của vi dịch vụ xuôi dòng.
Còn nhớ bài viết trước: Thông tin thực tế! Spring Cloud Gateway tích hợp OAuth2.0 để hiện thực hóa xác thực và ủy quyền thống nhất phân tán!
Bộ lọc AuthenticationFilter được sử dụng để giải mã dữ liệu JSON được truyền qua lớp cổng và gói nó vào Yêu cầu, để có thể lấy được thông tin người dùng mong muốn bất kỳ lúc nào trong phương thức kinh doanh.
Ở đây mình gói gọn các thông tin liên quan đến JWT vào trong request cùng lúc. Lớp thực thể là JwtInformation, như sau:

loginVal kế thừa JwtInformation như sau:

Tại thời điểm này, bộ lọc AuthenticationFilter rất đơn giản để sửa đổi. Bạn chỉ cần gói gọn jti và thời gian hết hạn vào loginVal.

Logic rất đơn giản và được đánh dấu trong hình trên.
3. Thực hiện giao diện đăng xuất.
Giao diện đăng xuất không được cung cấp trong bài viết trước, vì JWT không trạng thái hoàn toàn không cần đăng xuất và thật ngu ngốc khi chờ hết hạn.
Tất nhiên, để thực hiện đăng xuất và đăng nhập thì Redis được sử dụng nên giao diện đăng xuất là không thể thiếu.
Logic rất đơn giản, chỉ cần đặt jti của mã thông báo JWT để đăng xuất trực tiếp vào Redis và đặt thời gian hết hạn thành thời gian hết hạn JWT. Mã này như sau:

OK, bây giờ chức năng đăng xuất và đăng nhập JWT đã được triển khai...
Những thay đổi đối với ba mô-đun liên quan như sau:
tên |
Chức năng |
oauth2-cloud-auth-server |
Dịch vụ xác thực và ủy quyền OAuth2.0 |
cổng đám mây oauth2 |
Dịch vụ cổng |
oauth2-cloud-auth-common |
Mô-đun công khai |
Tóm tắt
Ý tưởng rất đơn giản vì JWT không có trạng thái nên nó chỉ có thể sử dụng Redis để ghi lại trạng thái của nó, nhằm đạt được mục đích vô hiệu hóa nó.
Bài kiểm tra
Công việc kinh doanh về cơ bản đã hoàn thành. Chúng ta hãy thực hiện một quá trình để kiểm tra nó, như sau:
1. Đăng nhập và đăng ký mã thông báo.
2. Truy cập giao diện bằng token.
Token chưa được đăng xuất nên có thể truy cập bình thường như sau:
3. Gọi giao diện để đăng xuất.
Yêu cầu như sau:
4. Truy cập giao diện bằng token đã đăng xuất.
Vì mã thông báo đã bị hủy nên giao diện không thể truy cập được và kết quả trả về như sau:
Liên kết gốc: https://mp.weixin.qq.com/s/DoQt5JWy3nx7Oso1fJRnTw.
Bài cuối cùng là về thực chiến! Làm cách nào để sử dụng ngoại lực để vô hiệu hóa mã thông báo JWT khi đăng xuất? Bài viết này chỉ vậy thôi, nếu bạn muốn biết thêm về chiến đấu thực tế! Làm cách nào để sử dụng ngoại lực để vô hiệu hóa mã thông báo JWT khi đăng xuất? Về nội dung, vui lòng tìm kiếm các bài viết của CFSDN hoặc tiếp tục duyệt các bài viết liên quan. Tôi hy vọng bạn sẽ ủng hộ blog của tôi trong tương lai! .
Tôi là một lập trình viên xuất sắc, rất giỏi!