Bạn nào bị lỗi "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client" thì nhớ thêm return trước "res.status().json" nhé :D
em vẫn chưa hiểu code nó chạy ở đoạn verifyTokenAndAdminAuth là như thế nào , khi mình gọi tới middlewareController.verifyToken(req,res,()=> {...}) , cái tham số thứ 3 ở đây là kiểu sao v ạ , nó có phải thay thế cho thằng next không ạ
anh ơi vì sao mình lưu refreshToken lên cookies rồi mà mình còn phải lưu lên database làm gì vậy ạ và nếu mình mún dùng refreshToken để tạo ra newAccessToken thì mình nên lấy từ cái nào ra ạ. mong trả lời thắc mắc này của em ạ
1:10:03 không cần nhập Cookie thì cũng refresh tken đc a, điều kiện là phải login trước, vì khi login thì mình có set refre tken vào cookie. em ko biết có phải bug ko
Thường thì project bên ngoài họ sẽ xài mấy cái có sẵn như là Auth0, Clerk, NextAuth chẳng hạn, chứ ít khi nào mà cần phải tự tạo từ đầu như này lắm, này chủ yếu để hiểu về cái jwt hoạt động ra sao th
Mong mn giải đáp giúp ở là khi làm refresh token, logout có cần tới cái database mà e thấy trong video có sự dụng database là mongodb mà tại sao admin lại nói là không có database nên sự dụng mảng v ạ. Em xin cảm ơn
Bạn ơi cho mình hỏi xíu. Mình đang có trường hợp xác suất nhỏ xảy ra nhưng mình vẫn muốn hỏi là như này. Nếu khi mà mình đăng nhập và bị mất refresh token trong khoảng thời gian token còn hạn nhưng mình close tab không call lại refresh token mà hacker sửa dụng refresh token của mình để tiếp tục truy cập tiếp, 1 tuần sau mình mới vào lại và khi ấy mình mới vào lại thì xử lý thế nào cho ổn phía server đc bạn nhỉ.
A ơi cho e hỏi với ạ. Tại sao phải filter trong khi mình có thể remove đi cái token cũ ạ, em thấy cái mảng refreshtoken thì cũng chỉ chứ 1 hoặc 2 phần tử thui ạ 1:06:55
cái chức năng đó để giả lập nếu e lưu trữ token trong cái database như Redis chẳng hạn rồi e xoá nó đi th, em phải tìm cái token đó r filter đi trả về một dãy token mới kh bao gồm nó chứ em remove bằng .pop thì lỡ như đó kh phải là cái refreshToken mà em đang xài thì sao?
Duy cho mình hỏi, tại 1:05:52, bạn đặt câu lệnh để bắt 403, mình chạy thì nó báo do mảng "refreshTokens" ban đầu rỗng nên nó luôn bắn ra 403, comment dòng 403 đó thì code chạy bth. Nhưng sao của bạn chạy vẫn bình thường nhỉ, nhờ Duy gthich giúp mình
Redux saga là middleware để xử lý bất đồng bộ th, thì với mấy cái project đơn giản a dùng luôn redux toolkit để xử lý bất đồng bộ bằng cách chia ra 3 action riêng: start, success, failed. Còn e có thể xài Redux Thunk hoặc Redux Saga để xử lý bất đồng bộ như API call, Thunk thì dễ hiểu hơn Saga vì Saga sẽ khá phực tạp về logic nên sẽ phù hợp với mấy project lớn hơn
Cho mình hỏi vậy là mỗi lần hết 20s thì sẽ gọi refreshToken để lấy accessToken mới và lại xoá refreshToken cũ trong DB đi và cấp cho nó refreshToken mới gắn vào cookie thì như v là refreshToken sẽ không bào giờ hết hạn ạ, trừ khi là không gọi requestRefreshToken trong vòng 365d sao ạ
ngoaif đời thì mấy cái token này sẽ do bên thứ 3 xử lý như nếu b sử dụng API của facebook hay Github thì nó đều có ngày hết hạn r phải tạo token mới ấy, JWT chỉ là concept th chứ ngoài đời kh ai áp dụng y chang như v để làm đâu, đa số xài xác minh bên thứ ba như Auth0 hay Google Auth chẳng hạn, nma bth thì kh ai đẻ hạn của token 20s đâu =)) mình dể v trong video để ví dụ th
A ơi e tìm hiểu về library passportJs để login gg vs fb thì nó dùng session để tạo phiên đăng nhập, passport nó có serializeUser và desesrializeUser để generate req.user ở mỗi request, vậy thế là khỏi cần jwt luôn ạ
theo mình biết thì jwt cũng là 1 kiểu session nên chỉ cần 1 trong 2 thôi, cơ mà có vẻ jwt vẫn hay được sử dụng hơn, với cả đăng nhập bằng mạng xã hội thì thấy hay dc làm ở frontend với CSR hơn
đoạn 24:17 ấy mình thấy bạn có dùng user._doc mình có consolog thử ra thì thấy user và user._doc đều giống nhau nhưng nếu mình bỏ _doc đi thì khi đăng nhập code nó lại chạy không bình thường là sao vậy bạn? Mình có tìm thử rồi nhưng không thấy chỗ nào nói về chức năng của _doc bạn ạ
mình xài ._doc là để loại bỏ thằng password ra khỏi cái document nên nếu bạn bỏ nó ra thì nó kh hoạt động được, nhưng mà thật ra kh nên xài thg ._doc vì nó là internal storage, bạn có thể xài .exclude(“password”) để loại nó ra, sau này mình cũng sẽ kh xài thg ._doc này nữa :D
anh ơi cho em hỏi nếu em tạo 2 user 1 user là admin và 1 user bình thường khi admin login rồi đính refreshToken của admin vào cookies rồi vậy thằng user lúc này cũng đăng nhập thì cái refreshToken của user sẽ đính vào cookies vậy thì làm sao có thể renew lại token của thằng admin được ạ ? không lẽ chỉ được login 1 lần với 1 tài khoản ạ ? giả sử em có 2 cái smartphone khác nhau và mỗi cái đăng nhập 1 tài khoản thì làm sao để mình có thể renew cái token của tài khoản mình đang sử dụng ạ ? em chưa hiểu logic chỗ này lắm
@@DanielTruongDev dạ em bị nhầm, là mỗi thằng client (web browser hay mobile) thì đều có cookie riêng nên ko thể làm theo kiểu phân biệt như trên được. em thắc mắc là cách Fb hoạt động rằng 1 tài khoản được login cả trên app cả trên web vậy có phải nó tạo ra 2 accessToken riêng biệt ứng với mỗi thằng client ko ? nếu đúng như vậy thì có những trường hợp rằng trên 1 web browser chỉ được login 1 tài khoản là sao anh nhỉ ?
bạn cho mình hỏi mình code bài này của bạn bằng typescipt ấy tới cái đoạn const refreshToken = req.cookies.refreshToken, khi mình run thì nó báo TypeError: Cannot read properties of undefined (reading 'refreshToken') thì đây là lỗi gì được không vậy
anh ơi cho em hỏi với ạ, vậy khi mình đăng nhập xong mình cứ dùng web liên tục, cứ hết hạn token xong lại refresh token mới, nhưng khi mình không dùng trong 1 khoảng thời gian thì logout ra. Anh có thể giải thích cho em tại sao không ạ
cái kh dùng trong 1 khoảng thời gian sẽ bị logout mà e đề cập thì nó sẽ là logic của code th, chứ kh phụ thuộc vào JWT nữa, JWT hết hạn sau 1 khoảng thời gian, nếu e k refresh token thì khi e gọi API sẽ bị fail vì kh có token headers
còn kh e có thể đặt hạn của refresh token tầm 5 phút rồi nếu user kh chuyển trang mặc dù lúc đó access token cũng đã hết hạn mà sau 5 phút user kh chuyển trang để refresh token thì mình cho user out ra đăng nhập lại th vì refresh token cũng đã hết hạn luôn r
Mình bị lỗi" TypeError: res.status is not a function" và bị out khỏi chương trình ! là thế nào vậy bạn ? Mình xin hướng khắc phục. Mình đã đặt return ngay trước res.status nhưng vẫn !.
Anh Daniel ơi, sau khi coi và thực hành những kiến thức có trong Video, em đang gặp phải 1 vấn đề ở chỗ Logout. Khi em Login thì create accessToken và create refreshToken sau đó save refreshToken vào 1 array của user trong MongoDB vậy khi em muốn Logout thì em phải xóa refreshToken trong array đó đi, tức là em phải xác định được thằng user. VẬY CÓ PHẢI EM PHẢI TRUYỀN PARAMS LÀ ID CỦA USER TRONG ROUTES LOGOUT KHÔNG Ạ ? EM THẤY NÓ CÓ VẺ HƠI BẤT TIỆN. mong được anh giải đáp ạ
Bạn tạo array tại 1 user thôi thì rất bất tiện. Bạn nên tạo 1 bảng token r đặt tên là Tokens để type: [String] tức là array string như v sẽ tiện hơn vì cơ bản chỗ lưu tokens mục đích là để không trùng nhau thôi. Nên sẽ kh liên quan đến mấy bảng khác
em chưa coi phần 3 nhưng coi phần này thấy cái bug to đùng luôn . đó khi khi logout rồi vẫn logout đc tiếp vì token vẫn chưa hêt time :( , còn cái mảng refreshTokens kia khi post url refreshToken nó không xóa refreshToken cũ lúc login sinh ra => Thành ra cả 2 refreshToken đều hoạt động .Thậm chí refreshToken càng nhiều thì càng càng có nhiều refreshToken có thể lấy token
accessToken vẫn xài được sau khi logout là bth mà e, e lên check của Auth0 thì sau khi e logout e vẫn xài token đó đc bth, bởi v nên accessToken là ngắn hạn đó, còn việc giữ refreshToken hay xoá đi thì mỗi ng 1 ý kiến th, e muốn bảo mật hơn thì cứ việc xoá, nên kh hẵng là bug nhé :D
khi accessToken hết hạn thì server sẽ dựa vào refreshToken để tạo ra một accessToken mới , rồi gửi về cho client. Có accessToken mới thì phía client mới có thể thực hiện request thành công.
Góp ý :Cái phần await new User , await User.find() , anh làm sai nhé ! . Vì mấy hàm này không trả ra Promise cho nên anh gọi await như thế để làm gì ạ ? . Nhưng mà cảm ơn bài giảng của anh nhé hihi
@@HuyTruong-hu9sn cái new User thì kh cần await đâu bạn vì User được tạo trong database bằng cái .save mới cần await vì nó return Promise, còn cái .find thì cần await đấy vì nó return Promise nên bạn kia cmt đúng 1 phần thui
const newAccessToken = authController.generateAccessToken(user) const newRefreshToken = authController.generateRefreshToken(user) ai cho mình hỏi chút là sao user ở đây lại là undefine nhir?
Bạn nào bị lỗi "Error [ERR_HTTP_HEADERS_SENT]: Cannot set headers after they are sent to the client" thì nhớ thêm return trước "res.status().json" nhé :D
em vẫn chưa hiểu code nó chạy ở đoạn verifyTokenAndAdminAuth là như thế nào , khi mình gọi tới middlewareController.verifyToken(req,res,()=> {...}) , cái tham số thứ 3 ở đây là kiểu sao v ạ , nó có phải thay thế cho thằng next không ạ
Cho mình hỏi đoạn bạn refresh access token mới, nếu refresh token cũ còn hạn thì sao phải gen cả refresh token mới v bạn
cảm ơn bạn rất nhiều, video của bạn rất chất lượng, cụ thể, chi tiết, hữu ích. Tôi xem rất thích!
Sắp tới hi vọng e sẽ làm 1 video hướng dẫn full MERN Project, thanks e
anh ơi vì sao mình lưu refreshToken lên cookies rồi mà mình còn phải lưu lên database làm gì vậy ạ và nếu mình mún dùng refreshToken để tạo ra newAccessToken thì mình nên lấy từ cái nào ra ạ. mong trả lời thắc mắc này của em ạ
Hay quá , xem mà nghiện
1:04:06 lưu các refresh token dưới dạng array như thế nào v a ơi, e đang dùng mySQL
24:18 anh ơi cho em hỏi vì sao phải có ._doc vậy anh
anh cho e hỏi là, mình sẽ dựa trên access token để logout, vì short lived nên nếu hết hạn thì phải refresh đúng ko ạ
52:25 ngay từ đầu a nói how to store token là e nghĩ luôn đến redux rùi. Hai cái kia thì e chỉ học đc cái localStorage còn cookies e chưa học qua
refresh và access token mình ghim cả 2 ở cookie đc ko a?
Anh cho em hỏi là khi mình lưu refresherTokens vào database thì nó có tác dụng gì vây ạ? Anh có thể ví dụ cụ thể trường hợp mình sẽ sử dụng đến ko a ?
bảo mật hơn chứ còn sao nữa
Bạn cho mình hỏi là nếu chỉ cần tạo login/register API thôi thì xem Video phần 1 và Phần 2 đến phút 26 là đủ rồi đúng k ạ
đủng r b, phần 3 chủ yếu mình nói về login/register phía front-end cũng như cách sử dụng mấy cái token ở phía front-end
1:10:03 không cần nhập Cookie thì cũng refresh tken đc a, điều kiện là phải login trước, vì khi login thì mình có set refre tken vào cookie. em ko biết có phải bug ko
Rất hay và bổ ích, bạn rất thành thạo về JWT và các phần liên quan. Respect!
lỗi code 11000 khi đăng ký username thư 2. thì fix như nào vậy. cám ơn
anh dùng theme vscode gì vậy ạ
a cho em hỏi tại sao khi lưu refresh token vào cookie những bên trình duyệt nó lại không thêm được mặc dù Api response cookie đấy
bạn cho mình hỏi phút 18:01 user._id, sao lại là user.id nhỉ
đi làm thì nó có thực sự giống vậy không bạn?
Thường thì project bên ngoài họ sẽ xài mấy cái có sẵn như là Auth0, Clerk, NextAuth chẳng hạn, chứ ít khi nào mà cần phải tự tạo từ đầu như này lắm, này chủ yếu để hiểu về cái jwt hoạt động ra sao th
Thanks bạn nhiều
Mong mn giải đáp giúp ở là khi làm refresh token, logout có cần tới cái database mà e thấy trong video có sự dụng database là mongodb mà tại sao admin lại nói là không có database nên sự dụng mảng v ạ. Em xin cảm ơn
Ko có bảng lưu. Chỉ tạo mỗi table user
sao e không thấy phần 3 vậy a
Đang cần học JWT gặp video bạn bổ ích quá, cho mình hỏi user._doc là cú pháp gì vậy bạn, mình gg ko ra
user._doc trả về object đã được truy xuất từ hàm find bạn dùng ở trên ấy
Mình đã hoàn thành 2 /3 cảm ơn bạn nhìu
Cảm ơn bạn đã hướng dẫn tận tình
Bạn ơi cho mình hỏi xíu. Mình đang có trường hợp xác suất nhỏ xảy ra nhưng mình vẫn muốn hỏi là như này. Nếu khi mà mình đăng nhập và bị mất refresh token trong khoảng thời gian token còn hạn nhưng mình close tab không call lại refresh token mà hacker sửa dụng refresh token của mình để tiếp tục truy cập tiếp, 1 tuần sau mình mới vào lại và khi ấy mình mới vào lại thì xử lý thế nào cho ổn phía server đc bạn nhỉ.
A ơi cho e hỏi với ạ. Tại sao phải filter trong khi mình có thể remove đi cái token cũ ạ, em thấy cái mảng refreshtoken thì cũng chỉ chứ 1 hoặc 2 phần tử thui ạ 1:06:55
cái chức năng đó để giả lập nếu e lưu trữ token trong cái database như Redis chẳng hạn rồi e xoá nó đi th, em phải tìm cái token đó r filter đi trả về một dãy token mới kh bao gồm nó chứ em remove bằng .pop thì lỡ như đó kh phải là cái refreshToken mà em đang xài thì sao?
Duy cho mình hỏi, tại 1:05:52, bạn đặt câu lệnh để bắt 403, mình chạy thì nó báo do mảng "refreshTokens" ban đầu rỗng nên nó luôn bắn ra 403, comment dòng 403 đó thì code chạy bth. Nhưng sao của bạn chạy vẫn bình thường nhỉ, nhờ Duy gthich giúp mình
chỗ verify TokenAdmin , user.id của mình trả về undefined là do đâu nhỉ
Hay nha, chi tiết đầy đủ nha
a ơi cho em hỏi khi nào mình nên dùng redux saga và dự án vậy a
Redux saga là middleware để xử lý bất đồng bộ th, thì với mấy cái project đơn giản a dùng luôn redux toolkit để xử lý bất đồng bộ bằng cách chia ra 3 action riêng: start, success, failed. Còn e có thể xài Redux Thunk hoặc Redux Saga để xử lý bất đồng bộ như API call, Thunk thì dễ hiểu hơn Saga vì Saga sẽ khá phực tạp về logic nên sẽ phù hợp với mấy project lớn hơn
Cho mình hỏi vậy là mỗi lần hết 20s thì sẽ gọi refreshToken để lấy accessToken mới và lại xoá refreshToken cũ trong DB đi và cấp cho nó refreshToken mới gắn vào cookie thì như v là refreshToken sẽ không bào giờ hết hạn ạ, trừ khi là không gọi requestRefreshToken trong vòng 365d sao ạ
ngoaif đời thì mấy cái token này sẽ do bên thứ 3 xử lý như nếu b sử dụng API của facebook hay Github thì nó đều có ngày hết hạn r phải tạo token mới ấy, JWT chỉ là concept th chứ ngoài đời kh ai áp dụng y chang như v để làm đâu, đa số xài xác minh bên thứ ba như Auth0 hay Google Auth chẳng hạn, nma bth thì kh ai đẻ hạn của token 20s đâu =)) mình dể v trong video để ví dụ th
cho em hỏi tại sao anh không lưu cái arr refreshTokens trong mongodb luôn ạ
Cảm ơn anh rất nhiều, rất chi tiết và tận tình luôn
A ơi cho e hỏi khi khi nào cần đưa dữ liệu từ api về redux ạ.
này là phần frontend nha em, gọi api r lưu về redux để xài thui, e có thể check video về redux toolkit của a để biết thêm cách gọi như thế nào
A ơi e tìm hiểu về library passportJs để login gg vs fb thì nó dùng session để tạo phiên đăng nhập, passport nó có serializeUser và desesrializeUser để generate req.user ở mỗi request, vậy thế là khỏi cần jwt luôn ạ
theo mình biết thì jwt cũng là 1 kiểu session nên chỉ cần 1 trong 2 thôi, cơ mà có vẻ jwt vẫn hay được sử dụng hơn, với cả đăng nhập bằng mạng xã hội thì thấy hay dc làm ở frontend với CSR hơn
Bạn có thể giải thích cho mình chỗ generateAccessToken với generateRefreshToken tại sao lại KHÔNG dùng Async được ko bạn
Thanks
do jwt.sign synchronous nha b
em cảm ơn anh rất nhiều ạ
qua hay luon
Sao ko dung nodemon di anh
đoạn 24:17 ấy mình thấy bạn có dùng user._doc mình có consolog thử ra thì thấy user và user._doc đều giống nhau nhưng nếu mình bỏ _doc đi thì khi đăng nhập code nó lại chạy không bình thường là sao vậy bạn? Mình có tìm thử rồi nhưng không thấy chỗ nào nói về chức năng của _doc bạn ạ
mình xài ._doc là để loại bỏ thằng password ra khỏi cái document nên nếu bạn bỏ nó ra thì nó kh hoạt động được, nhưng mà thật ra kh nên xài thg ._doc vì nó là internal storage, bạn có thể xài .exclude(“password”) để loại nó ra, sau này mình cũng sẽ kh xài thg ._doc này nữa :D
đỉnh thật sự
bình thường , t cũng chưa làm đc như vậy
anh ơi cho em hỏi nếu em tạo 2 user
1 user là admin và 1 user bình thường
khi admin login rồi đính refreshToken của admin vào cookies rồi
vậy thằng user lúc này cũng đăng nhập thì cái refreshToken của user sẽ đính vào cookies
vậy thì làm sao có thể renew lại token của thằng admin được ạ ?
không lẽ chỉ được login 1 lần với 1 tài khoản ạ ?
giả sử em có 2 cái smartphone khác nhau và mỗi cái đăng nhập 1 tài khoản thì làm sao để mình có thể renew cái token của tài khoản mình đang sử dụng ạ ?
em chưa hiểu logic chỗ này lắm
lúc e log out thì Cookies sẽ được clear r nên k ảnh hưởng gì cho lần đăng nhập tiếp theo nhé
@@DanielTruongDev dạ em bị nhầm, là mỗi thằng client (web browser hay mobile) thì đều có cookie riêng nên ko thể làm theo kiểu phân biệt như trên được.
em thắc mắc là cách Fb hoạt động rằng 1 tài khoản được login cả trên app cả trên web vậy có phải nó tạo ra 2 accessToken riêng biệt ứng với mỗi thằng client ko ?
nếu đúng như vậy thì có những trường hợp rằng trên 1 web browser chỉ được login 1 tài khoản là sao anh nhỉ ?
a ơi cho e hỏi e là cái refreshToken , sao lúc chạy nó cứ báo lỗi ở dòng code này vậy ạ " const refreshToken = req.cookies.refreshToken; "
có thể bạn quên chưa import cookie-parser ở file index hoặc server
bạn cho mình hỏi mình code bài này của bạn bằng typescipt ấy tới cái đoạn const refreshToken = req.cookies.refreshToken, khi mình run thì nó báo TypeError: Cannot read properties of undefined (reading 'refreshToken') thì đây là lỗi gì được không vậy
chắc do b chưa khai báo type cho thg object đó là bao gồm refreshToken r type là undefined nên nó báo lỗi ấy
em muốn hỏi fix được chưa ạ? e install cookie-parser là được á
anh ơi cho em hỏi với ạ, vậy khi mình đăng nhập xong mình cứ dùng web liên tục, cứ hết hạn token xong lại refresh token mới, nhưng khi mình không dùng trong 1 khoảng thời gian thì logout ra. Anh có thể giải thích cho em tại sao không ạ
cái kh dùng trong 1 khoảng thời gian sẽ bị logout mà e đề cập thì nó sẽ là logic của code th, chứ kh phụ thuộc vào JWT nữa, JWT hết hạn sau 1 khoảng thời gian, nếu e k refresh token thì khi e gọi API sẽ bị fail vì kh có token headers
còn kh e có thể đặt hạn của refresh token tầm 5 phút rồi nếu user kh chuyển trang mặc dù lúc đó access token cũng đã hết hạn mà sau 5 phút user kh chuyển trang để refresh token thì mình cho user out ra đăng nhập lại th vì refresh token cũng đã hết hạn luôn r
vâng cảm ơn anh nhiều ạ
video dài quá em
anh ơi em bị lỗi "cannot read property refreshToken".Mong anh phản hồi ạ
không biết bạn fix được chưa nếu chưa được là do chưa cài package cookie-parser
Mình bị lỗi" TypeError: res.status is not a function" và bị out khỏi chương trình ! là thế nào vậy bạn ? Mình xin hướng khắc phục.
Mình đã đặt return ngay trước res.status nhưng vẫn !.
vì trong try bạn return về 1 hàm và catch bạn return err nên nó lỗi á
Anh Daniel ơi, sau khi coi và thực hành những kiến thức có trong Video, em đang gặp phải 1 vấn đề ở chỗ Logout.
Khi em Login thì create accessToken và create refreshToken sau đó save refreshToken vào 1 array của user trong MongoDB
vậy khi em muốn Logout thì em phải xóa refreshToken trong array đó đi, tức là em phải xác định được thằng user.
VẬY CÓ PHẢI EM PHẢI TRUYỀN PARAMS LÀ ID CỦA USER TRONG ROUTES LOGOUT KHÔNG Ạ ? EM THẤY NÓ CÓ VẺ HƠI BẤT TIỆN.
mong được anh giải đáp ạ
Bạn tạo array tại 1 user thôi thì rất bất tiện. Bạn nên tạo 1 bảng token r đặt tên là Tokens để type: [String] tức là array string như v sẽ tiện hơn vì cơ bản chỗ lưu tokens mục đích là để không trùng nhau thôi. Nên sẽ kh liên quan đến mấy bảng khác
không có link git hả lưu code hả bạn
ở phần mô tả trong video part cuối có á bạn
@@DanielTruongDev video bạn nói rất dễ hiểu, đã sub :D ủng hộ dài dài
em chưa coi phần 3 nhưng coi phần này thấy cái bug to đùng luôn . đó khi khi logout rồi vẫn logout đc tiếp vì token vẫn chưa hêt time :( , còn cái mảng refreshTokens kia khi post url refreshToken nó không xóa refreshToken cũ lúc login sinh ra => Thành ra cả 2 refreshToken đều hoạt động .Thậm chí refreshToken càng nhiều thì càng càng có nhiều refreshToken có thể lấy token
em chưa coi phần 3 lên ko rõ anh đã fix bug này chưa . em cứ cmt đã kẻo xem xong phần 3 lại quên
accessToken vẫn xài được sau khi logout là bth mà e, e lên check của Auth0 thì sau khi e logout e vẫn xài token đó đc bth, bởi v nên accessToken là ngắn hạn đó, còn việc giữ refreshToken hay xoá đi thì mỗi ng 1 ý kiến th, e muốn bảo mật hơn thì cứ việc xoá, nên kh hẵng là bug nhé :D
@@DanielTruongDev vâng anh .
@@DanielTruongDev anh có video nào về socket io hoặc react hook form ko anh
anh ơi anh có thể giải thích giúp em tại sao cần lưu lại refreshToken được không ạ
khi accessToken hết hạn thì server sẽ dựa vào refreshToken để tạo ra một accessToken mới , rồi gửi về cho client. Có accessToken mới thì phía client mới có thể thực hiện request thành công.
Góp ý :Cái phần await new User , await User.find() , anh làm sai nhé ! . Vì mấy hàm này không trả ra Promise cho nên anh gọi await như thế để làm gì ạ ? . Nhưng mà cảm ơn bài giảng của anh nhé hihi
bạn chắc ko, thật sự mình thấy cần await. Bạn gthich rõ hơn ở chỗ này đc ko
@@HuyTruong-hu9sn cái new User thì kh cần await đâu bạn vì User được tạo trong database bằng cái .save mới cần await vì nó return Promise, còn cái .find thì cần await đấy vì nó return Promise nên bạn kia cmt đúng 1 phần thui
Cho e xin file .env với a
jwt.verify(refreshToken, process.env.SECRET_KEY_REFRESH_TOKEN, (err, user) => {
if (err) {
console.log(err);
}
console.log(user);
const newAccessToken = authController.generateAccessToken(user)
const newRefreshToken = authController.generateRefreshToken(user)
ai cho mình hỏi chút là sao user ở đây lại là undefine nhir?
tại sao khi lưu refresh token trên cookíe , khi deploy lên thì req.cookíe.refreshtoken có nhỉ . đã mỡ withCredentials: true . mong được giúp đỡ
process.env.JWT_ACCESS_KEY cái chỗ này mình không biết đặt trong cái .env như nào cả huhu. Ai biết ko chỉ mình với
b vào Discord của kênh hỏi thêm cho rõ nha