Java spring boot 3 tutorial: logout with JWT token

  Рет қаралды 9,235

Devteria

Devteria

Күн бұрын

Java spring boot 3 tutorial
Logout with JWT token, secured and performance
Link Github to get source code:
github.com/dev...
Branch: course/logout-with-jwt
Link to previous video:
1. Spring boot 3 roadmap: • Video
2. Connect Database abd create CRUD Api: • Khóa học Java spring b...
3. Handling Exception and validation: • Khóa học Java spring b...
4. Advance handling Exception and normalize Api Response: • Khóa học Java spring b...
5. Using Lombok andMapstruct: • Khóa học Java spring b...
6. Encrypt password with Bcrypt: • Khóa học Java spring b...
7. Create, sign and verify JWT: • Khóa học Java spring b...
8. Authentication with JWT: • Khóa học Java spring b...
9. Authorization with JWT: • Khóa học Java spring b...
10. Authorize with @PreAuthorize @PostAuthorize: • Khóa học Java spring b...
11. Advance exception handling: • Khóa học Java spring b...
12. Build Role, Permission: • Khóa học Java spring b...
13. Authorize with Role, Permission withJWT: • Khóa học Java spring b...
14. Validation with custom annotation: • Khóa học Java spring b...
15. Validation, get param in annotation: • Khóa học Java spring b...
Support me:
www.buymeacoff...
#Java #Springboot3 #jwt

Пікірлер: 99
@vle1305
@vle1305 10 сағат бұрын
tại sao method introspect đã gọi method verifyToken vậy mình cần tạo object Nimbus... để decode và verify token làm gì nữa a?
@duynguyenvan1207
@duynguyenvan1207 9 ай бұрын
Sang microservices đi bác ơi, seri quá chất lượng, phải login để comment vì hay
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Thanks bạn, series microservices sẽ sớm có thôi.
@linhnd.2526
@linhnd.2526 8 ай бұрын
Theo quan điểm cá nhân của em: - Nếu lưu lại token logout vào DB thì nhược điểm: 1. Nếu access được vào DB và query theo expiryTime thì có thể lấy được token User còn hạn để tương tác với web. 2. Khi lưu token như vậy thì với system lớn thì càng chạy data phát sinh trong bảng invalidated_token càng lớn dẫn đến có thể query lâu hơn. 3. Đối với kiến trúc monolithic thì em nghĩ không sao nhưng với microservices khi mọi request tới đều phải check authen/author/ token thì việc query liên tục với lượng data trên bảng invalidated_token sẽ gây nghẽn cổ chai. - Hiện tại em nghĩ nên tạo thêm column is_logout trong table user chung logic với column is_active để kiểm tra xem user đó đã thực hiện action logout hay chưa, nếu is_logout là true thì user cần login lại còn false nghĩ là user không thực hiện logout - logic tương tự với column is_active Nhờ các bác vui vẻ đóng góp thêm ý kiến ạ. Em cảm ơn ! 😃
@phucminh8354
@phucminh8354 8 ай бұрын
Mình nghĩ lưu cái access-token đấy vào cache, đặt thời gian tự động xoá là thời gian hết hạn của nó
@thiendaolaototuduong
@thiendaolaototuduong 6 ай бұрын
cái thứ 3 mà bạn nói thì khi đăng xuất là đăng xuất tất cả các phiên luôn
@CoderQD
@CoderQD 5 ай бұрын
1. làm gì có lưu token được tạo vào BD đâu mà lấy nhỉ, chỉ lưu data về token đã bị loại bỏ.
@nguyenduc3012
@nguyenduc3012 3 ай бұрын
không được bạn ơi nếu làm như bạn khi token lộ ra ngoài và chỉ cần user đó đăng nhập lại trong thời gian token bị lộ kia vẫn còn là hacker vẫn dùng token đó request dc . Chắn chắn khi logout sẽ phải lưu token hoặc lưu jwtid b nhé
@nguyentienminh0710
@nguyentienminh0710 2 ай бұрын
Nếu request login mình có đính kèm thêm jwt thì nó vẫn check jwt đấy ạ? tại em để token hết hạn gửi lên nó báo lỗi nhưng cứ xoá đi lại được! Em tưởng cấu hình permitAll() là nó không check token chứ ạ?
@LinhPham-4568
@LinhPham-4568 3 ай бұрын
26:55 để jwtdecoder nhận biết token đó đã bị invalid >> customjwtdecoder
@ndtuan_dev
@ndtuan_dev 25 күн бұрын
em làm phần customJwtDecoder thì xảy ra lỗi circular dependency, em có đọc tìm hiểu h không hiểu sao trong bài mình có thể tránh được lỗi này mong anh giải đáp. Vấn đề: CustomJwtDecoder phụ thuộc vào AuthenticationService (để gọi introspect cho việc kiểm tra token). AuthenticationService lại có thể sử dụng CustomJwtDecoder gián tiếp thông qua Security Filter Chain khi xác thực request có bearer token. Vòng lặp: CustomJwtDecoder -> AuthenticationService -> Security Filter Chain -> CustomJwtDecoder.
@tranthi-n5s
@tranthi-n5s 21 күн бұрын
mình cũng bị giống bạn
@tranthi-n5s
@tranthi-n5s 21 күн бұрын
không biết bận đã fix được chưa
@tranthi-n5s
@tranthi-n5s 21 күн бұрын
mình fix được rồi nha, bạn cứ bỏ cái @Autowire của CustomJwtDecoder là được
@huyquang7943
@huyquang7943 16 күн бұрын
introspectUser để permitAll là đc mà bạn
@PhucNguyen-gj3vo
@PhucNguyen-gj3vo 13 күн бұрын
bạn thêm @Lazy trong CustomJwtDecoder nhé @Autowired @Lazy private AuthenticationService authenticationService;
@TrungNguyen-vr8kk
@TrungNguyen-vr8kk 9 ай бұрын
hóng anh làm duy trì đăng nhập khi token hết hạn ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Sure, video tiếp theo anh sẽ hướng dẫn cách refresh token ha.
@nguyenduyquoc2397
@nguyenduyquoc2397 9 ай бұрын
cho em hỏi với ạ, lúc e test sử dụng token đã hết hạn thì api trả về là { "timestamp": "2024-04-30T08:49:56.384+00:00", "status": 500, "error": "Internal Server Error", "path": "/api/v1/lands" } và log ghi là org.springframework.security.authentication.AuthenticationServiceException: Token invalid chứ k giống như anh test ạ, em cần sửa như thế nào vậy anh
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Như này cũng khó. Em có thể post chi tiết code và error lên group facebook sẽ dễ support hơn.
@hieunguyen0801
@hieunguyen0801 9 ай бұрын
Khi nào có video microservice vậy anh😂
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
A đang planning cho nó, sẽ sớm có thôi. Hold on.
@TríLê-l5t
@TríLê-l5t 9 ай бұрын
anh cho em hỏi e học trên trường toàn crud , thì cho em hỏi lúc đi làm thực tế thì backend spring còn làm những j nữa ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Em follow theo series này đến cuối chính là những thứ đi làm thực tế sẽ làm. Tất cả những thứ anh chia sẻ đều là thực tế đó, cố gắng follow nhé.
@DungNgo-bu3op
@DungNgo-bu3op 5 ай бұрын
Hi anh, cho em hỏi đoạn 33:25 lúc a throw new JwtException("Token invalid") thì lúc a test API trên postman phải quăng ra lỗi Token invalid chứ nhỉ. Tại sao lại quăng ra lỗi unauthenticated ạ. Cám ơn anh
@DevteriaChannel
@DevteriaChannel 5 ай бұрын
Có xử lý Exception trong class GlobalExceptionHanlder đó em, nếu chưa rõ em có thể xem lại các video về xử lý Exception trong series này
@vle1305
@vle1305 14 сағат бұрын
cái đấy throw exception thôi còn return thông tin error thì ở class GlobalExceptionHandler, cơ mà error token của user log out nó xảy ra ở filter, bác thử chỉnh errorcode khác ở class EntryPoint là thấy
@benamngungoc797
@benamngungoc797 9 ай бұрын
A ơi lúc nào a lm về xác thực qua gg, github các kiểu đc ko ạ?
@ahnlinh2197
@ahnlinh2197 7 ай бұрын
18:45 khúc này em hiểu là khi hacker đã có token thì đã có các quyền của token đó trên application trên ứng dụng rồi nên việc authorize là không cần thiết có đúng không ạ?
@DevteriaChannel
@DevteriaChannel 7 ай бұрын
Tại vì api logout nó cũng thuộc dạng api mà user không mong muốn nhận được response dạng như: ops lỗi bì bạn đã logout rồi. Do đó đơn thuần user sẽ luôn luôn nhận được thông response logout thành công.
@hongsonnguyen109
@hongsonnguyen109 9 ай бұрын
đoạn này e hơi thắc mắc là sao a k dùng cache như redis chẳng hạn với expire time, như vậy thì k cần chạy schedule ạ.
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Vì dữ liệu session rất quan trọng nên mình sẽ không sử dụng theo dạng cache được.
@tranvansi6302
@tranvansi6302 9 ай бұрын
anh có nói theo định kì sẽ chạy cái gì đó để clean bảng InvalidatedToken để tránh dữ liệu phình to, anh có thể cho em từ khóa về cái này để tìm hiểu không ạ em cảm ơn
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Em search Mysql scheduler nhé.
@hungdomanh6653
@hungdomanh6653 6 ай бұрын
set expiryTime thì phải set Now() chứ anh (thời điểm logout) chứ sao lại set lúc token hết hạn ạ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Cái đó để dành cho mục đích clean up nha em chứ kg phải thời điểm mình invalidate cái token
@caovancuongk15hl29
@caovancuongk15hl29 8 ай бұрын
Anh có thể nói chi tiết hơn hoặc keyword về cách quét token exp date trong db để mình có thể tự động xóa đi những token đã hết hạn trong bảng invalidatedToken được không ạ
@DevteriaChannel
@DevteriaChannel 8 ай бұрын
Trong mysql có cho phép tạo cronjob, em tạo cronjob xoá những token có expiredtime nhỏ hơn thời điểm chạy cronjob là xong. Lưu ý set cronjob chạy vào giờ thấp điểm của hệ thống để giảm impact. Có thể cho chạy daily.
@augustinegoat
@augustinegoat 6 ай бұрын
anh ơi, cho em hỏi nếu mà logout như này thì SecurityContextHolder có tự động clear đi không vậy ạ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Security Context nó đi theo mỗi request nên, request kết thúc là cái Context cũng được clear luôn. Request khác thì sẽ đi với một Context khác
@pipilyly
@pipilyly 8 ай бұрын
Anh ơi nếu user có token của admin thì có những cách nào để chặn quyền truy cập nhỉ? Em nghĩ được cách là thêm token đó vào bảng expired hoặc invalid token.
@DevteriaChannel
@DevteriaChannel 8 ай бұрын
Đúng rồi em nếu token bị lộ thì invalidate nó thôi.
@tuandanh7048
@tuandanh7048 9 ай бұрын
org.springframework.security.authentication.AuthenticationServiceException: Token Invalid Đoạn cuối refresh token nó đổ ra log lỗi này anh ạ. Làm sao để catch lỗi này anh nhỉ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Em gửi log lỗi anh xem thử
@ChiHieuLe-fp2ji
@ChiHieuLe-fp2ji 8 ай бұрын
ban fix duoc chua , minh cung bi loi
@tuandanh7048
@tuandanh7048 7 ай бұрын
@@ChiHieuLe-fp2ji dạo này bận quá nên chưa làm tiếp được ý . ô fix được chưa thế
@ChiHieuLe-fp2ji
@ChiHieuLe-fp2ji 7 ай бұрын
@@tuandanh7048 Ban xem lại class JwtAuthenticationEntryPoint , tui implement sai chổ response api nên lỗi :v
@ongNguyen-pm4kz
@ongNguyen-pm4kz 6 ай бұрын
Bạn dùng BadJwtException thay cho JwtException là được
@phucbaonhannguyen7358
@phucbaonhannguyen7358 7 ай бұрын
video của anh rất hay và hữu ích ạ. nhưng mà em có một thắc mắc giả sử trong trường hợp mình muốn logout đồng thời các token mình đã logout thay vì chỉ logout với mỗi token thì mình có hướng xử lý ntn không ạ
@DevteriaChannel
@DevteriaChannel 7 ай бұрын
Trường hợp này cần persist token. Khi xuất hiện những use case phức tạp như thế này em có thể cân xem xét đến third party IDP. Em có thể tham khảo ở series Keycloak của anh.
@NguyenKhoidotnet
@NguyenKhoidotnet 8 ай бұрын
Nếu mà nó có secret key của mình, nó giả mạo token thì sao ạ?. Em nghĩ làm mình nên lưu thêm token đang đăng nhập để cho client không giả mạo được
@DevteriaChannel
@DevteriaChannel 8 ай бұрын
Việc lưu thêm token sẽ vô hiệu tính năng self validated của JWT token, mà đây chính là điểm quan trọng nhất của JWT. Mọi thứ sẽ turn out giống như cách dùng session ngày xưa.
@ntk99999
@ntk99999 6 ай бұрын
anh cho em hỏi theo ý hiểu của em tức là khi user logout thì cái token của user đã logout đó mình sẽ lưu vào trong db khi mà có user đăng nhập xử dụng token để login nếu token đó tồn tại trong db thì không cho phép vào có phải không ạ mong anh giải đáp giúp em ạ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Đúng rồi đó em. Và em sẽ có cơ chế để clean cái bảng đó thường xuyên dựa vào expiryDate, có thể là schedule job của MySQL
@TiFu-mi8im
@TiFu-mi8im 6 ай бұрын
anh có phần xử lý bearer token từ phía client không ạ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Em xem video này Khóa học Java spring boot 3: #24 cấu hình CORS và integrate với Front End bằng React JS kzbin.info/www/bejne/pmHUcq2Eoqerm6M
@DuyKhoa-yd5tf
@DuyKhoa-yd5tf 6 ай бұрын
cho mình hỏi !(verified && expiryDateAfter) phải là !verified || !expiryDateAfter chứ nhỉ
@lapnghiepshopee
@lapnghiepshopee 5 ай бұрын
tesst di ban. A y dung do
@chungnguyen4570
@chungnguyen4570 7 ай бұрын
cho em hỏi nếu tạo ra 1 custom decoder và gọi nó ở config sẽ bị 1 cái là: "Circular Dependencies" thì làm sao để khắc phục ạ
@DevteriaChannel
@DevteriaChannel 7 ай бұрын
Spring có config đê cho phép việc đó. Tuy nhiên tốt nhất là em tìm giải pháp khác đừng để nó bị circular dependencies
@n.tuanz_1418
@n.tuanz_1418 7 ай бұрын
mình cũng bị lỗi ở đây, b khắc phục chưa, chỉ mình với đc ko ạ
@on611
@on611 9 ай бұрын
Theo e biết thì jwt sinh ra để dùng cho stateless (thay cho session statefull), nên việc lưu token vào database như vậy thì nó mất tính stateless của jwt rồi đúng không anh? Nma ngoài cách của anh để invalide token thì em vẫn kh thấy cách nào nữa 🥲
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Chính xác là JWT sinh ra để phục vụ stateless. Tuy nhiên khi dùng vào mục đích authentication và authorization thì stateless không thì không đủ. Do đó các hệ thống IDP đều kết hợp cả 2.
@phamquangha-c529h6
@phamquangha-c529h6 8 ай бұрын
Đoạn cuối phần customJwtDecoder anh throw JwtException ra nhưng chưa bắt lại ạ
@hiepnt4082
@hiepnt4082 6 ай бұрын
bắt lại như thế nào vậy bạn
@ongNguyen-pm4kz
@ongNguyen-pm4kz 6 ай бұрын
Bạn dùng BadJwtException thay cho JwtException trong CustomJwtDecoder thử xem
@nguyenanhduck16_hcm57
@nguyenanhduck16_hcm57 5 ай бұрын
anh ơi sao e bị lỗi BeanCurrentlyInCreationException ở AuthenticationService, PasswordEncoder passwordEncoder = new BCryptPasswordEncoder(10); như anh thì không lỗi - mà khi sửa lại @Service @RequiredArgsConstructor @FieldDefaults(level = AccessLevel.PRIVATE, makeFinal = true) public class AuthenticationService { UserRepository userRepository; InvalidatedTokenRepository invalidatedTokenRepository; PasswordEncoder passwordEncoder; như thế thì bị lỗi vậy anh
@DevteriaChannel
@DevteriaChannel 5 ай бұрын
Cái này do 2 bean require lẫn nhau nên bị, em cần tránh việc đó.
@HieuTran-nb3ml
@HieuTran-nb3ml 6 ай бұрын
Anh cho em hỏi nếu em lưu jwt trong cooki khi logout thì em xoá cái jwt đấy đi thì có ổn ko ạ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Vấn đề vs cookie là trình duyệt sẽ tự động gửi cookie đi với mọi request, thứ 2 nữa là theo chuẩn Oauth2 thì token sẽ nằm ở header Authorization. Do đó việc lưu token trong cookie là không recommend, nên lưu nó vào localstorage
@pounguyen8660
@pounguyen8660 9 ай бұрын
Anh ơi em gặp lỗi rất lạ. Hôm qua em start app vẫn chạy bình thường, sau đó em tắt app, sáng hôm nay start lại thì tất cả endpoint đều bị 401, kể cả các public endpoint, dù em chỉ start lại chứ ko hề chỉnh sửa bất cứ cái gì. Log chỉ thấy là "Initializing Spring DispatcherServlet 'dispatcherServlet'" , "Initializing Servlet 'dispatcherServlet'" , "Completed initialization in 0 ms"
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Không có gì lạ đâu em, token hết hạn thôi :)), em phải lấy token mới xài chứ.
@pounguyen8660
@pounguyen8660 9 ай бұрын
@@DevteriaChannel những public endpoint đâu có yêu cầu token đâu anh. Ví dụ như api tạo account mới hoặc login thì làm sao có token được ạ?
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Vậy em check lại xem có thay đổi endpoint gì kg? Nếu emdpoint sai nó cũng sẽ bị chặn 401.
@tratranthanh6659
@tratranthanh6659 5 ай бұрын
e theo từ video đầu tiên đến nay , nhưng videos này ah tự dưng ko nói không rắng ném ra thêm 2 class CustomJwtDecoder( có nhắc tới sơ ) và JwtAuthenticationEntryPoin làm người theo học không thể theo kịp, và github thì không phải là nội dung của video này luôn ....zzz hầy
@DevteriaChannel
@DevteriaChannel 5 ай бұрын
Anh đã check lại branch, nó đang đúng với nội dung video nhé. Còn về CuútomJwtDecoder anh nghĩ anh đã giải thích khá kỹ. Anh cũng nhận thấy việc tạo trước class như vậy cũng hơi khó follow nên các series sau anh luôn có 2 branch cho mỗi video, bắt đầu video sẽ có một branch và kết thúc video sẽ có một branch. Anyway, thanks em đã góp ý.
@khanhtoan827
@khanhtoan827 9 ай бұрын
Anh ơi cho em hỏi nếu dùng freshtoken thì nên lưu trữ này ở trong DB k ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Không nha em, ở video tiếp theo anh sẽ nói kỹ hơn.
@khanhtoan827
@khanhtoan827 9 ай бұрын
@@DevteriaChannel dạ vâng ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Có video mới về refresh token rồi đó em.
@danghuynguyen3020
@danghuynguyen3020 9 ай бұрын
Anh ơi cho em hỏi là nếu logout như thế này thì khi một account được logout thì mọi browse đã login rồi sẽ bị logout hết đúng không anh. Em đang cần cách xử lý để nó không bị logout trên mọi browse ạ, e cảm ơn a!
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Cái này nó chỉ logout riêng cho cái token đó thôi chứ không phải logout mọi browser nha em.
@danghuynguyen3020
@danghuynguyen3020 9 ай бұрын
@@DevteriaChannel dạ nếu vậy cho e hỏi là, ở 2 browser khác nhau đều đăng login bằng 1 account (cùng username, password) thì khi logout trên browser này thì browser đã login còn lại có bị logout không ạ
@danghuynguyen3020
@danghuynguyen3020 9 ай бұрын
vì e hiểu cùng usename password nên nó sẽ đang login bằng một token giống nhau nên khi logout nó sẽ tìm dưới DB có cùng JWTID nên sẽ bị logout hết trên mọi browser ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Không nha em mỗi lần login là mộ token khác nhau chứ không giống nhau nhé.
@danghuynguyen3020
@danghuynguyen3020 9 ай бұрын
@@DevteriaChannel dạ em hiểu rồi, e cảm ơn a ạ
@HoangPham-by4lq
@HoangPham-by4lq 9 ай бұрын
Thầy ơi chỉ cách upload file và tải file xuống đi ạ
@DevteriaChannel
@DevteriaChannel 9 ай бұрын
Anh sẽ làm một video về chủ đề này khi phù hợp, có thể là uplpad ảnh avatar cho profile chẳng hạn. Hold on :)
@taitrinhnguyen339
@taitrinhnguyen339 9 ай бұрын
@@DevteriaChannel em có ý định triển khai chức năng này cho dự án cá nhân dùng AWS S3, mong anh sớm ra clip hehe
@theeyesschico
@theeyesschico 8 ай бұрын
cái này gg là có đó bro, cũng dễ lắm
@hiepnt4082
@hiepnt4082 6 ай бұрын
org.springframework.security.authentication.AuthenticationServiceException: Token Invalid Đoạn cuối 35:09 nó đổ ra log lỗi này anh ạ. Làm sao để catch lỗi này anh nhỉ
@DevteriaChannel
@DevteriaChannel 6 ай бұрын
Anh nhớ nó đã cactch rồi mà ta? Em chụp hình gửi lên group facebook devteria a xem thử
@VanQuang-h1z
@VanQuang-h1z 3 ай бұрын
tìm được lời giải chưa bạn
@HoangTran-ur8rn
@HoangTran-ur8rn 3 ай бұрын
@@VanQuang-h1z bạn tìm được lời giải chưa?
@AnB52
@AnB52 2 ай бұрын
bạn sử dụng BadJwtException thay JwtException là được á
Java spring boot 3 tutorial: refresh JWT token
18:05
Devteria
Рет қаралды 7 М.
It’s all not real
00:15
V.A. show / Магика
Рет қаралды 20 МЛН
Гениальное изобретение из обычного стаканчика!
00:31
Лютая физика | Олимпиадная физика
Рет қаралды 4,8 МЛН
How Strong Is Tape?
00:24
Stokes Twins
Рет қаралды 96 МЛН
AI Is Making You An Illiterate Programmer
27:22
ThePrimeTime
Рет қаралды 268 М.
[P5] Booking App | Logging Aop, cực kỳ hữu ích
11:33
Mẹo Lập Trình / SlowV
Рет қаралды 100
Java spring boot 3 tutorial: format code with Spotless
12:14
Devteria
Рет қаралды 3,6 М.
It’s all not real
00:15
V.A. show / Магика
Рет қаралды 20 МЛН