JWT - Hướng dẫn code chức năng đăng ký, đăng nhập, xác thực, phân quyền ( Phần 2/3 )

Поделиться
HTML-код
  • Опубликовано: 6 ноя 2024

Комментарии • 96

  • @DanielTruongDev
    @DanielTruongDev  2 года назад +13

    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

  • @ken2ker495
    @ken2ker495 4 месяца назад

    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 ạ

  • @dailycheeseofficial
    @dailycheeseofficial 2 года назад +1

    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

  • @LeucBinhPH
    @LeucBinhPH Год назад

    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!

  • @unclefivefootball
    @unclefivefootball 2 года назад +1

    Sắp tới hi vọng e sẽ làm 1 video hướng dẫn full MERN Project, thanks e

  • @vansinhle8129
    @vansinhle8129 Год назад

    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 ạ

  • @lenhac9040
    @lenhac9040 2 года назад +1

    Hay quá , xem mà nghiện

  • @lethitruc6794
    @lethitruc6794 Год назад

    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

  • @nhatleminh9176
    @nhatleminh9176 2 года назад +1

    24:18 anh ơi cho em hỏi vì sao phải có ._doc vậy anh

  • @DenDenCover
    @DenDenCover 2 года назад

    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 ạ

  • @sonchay8106
    @sonchay8106 2 года назад

    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

  • @hiennham8872
    @hiennham8872 Год назад

    refresh và access token mình ghim cả 2 ở cookie đc ko a?

  • @congtranchien9206
    @congtranchien9206 Год назад

    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 ?

  • @jusstaname
    @jusstaname 2 года назад

    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 ạ

    • @DanielTruongDev
      @DanielTruongDev  2 года назад +1

      đủ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

  • @DenDenCover
    @DenDenCover 2 года назад

    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

  • @thanhhuynguyen7551
    @thanhhuynguyen7551 3 месяца назад

    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!

  • @khuongviettai
    @khuongviettai 2 года назад

    lỗi code 11000 khi đăng ký username thư 2. thì fix như nào vậy. cám ơn

  • @truongminhphuc4337
    @truongminhphuc4337 2 года назад

    anh dùng theme vscode gì vậy ạ

  • @NguyeninhHuyPH
    @NguyeninhHuyPH Год назад

    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

  • @lucnguyeninh1057
    @lucnguyeninh1057 Год назад

    bạn cho mình hỏi phút 18:01 user._id, sao lại là user.id nhỉ

  • @quannguyenviet643
    @quannguyenviet643 Год назад

    đi làm thì nó có thực sự giống vậy không bạn?

    • @DanielTruongDev
      @DanielTruongDev  Год назад

      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

    • @quannguyenviet643
      @quannguyenviet643 Год назад

      Thanks bạn nhiều

  • @huyogia3069
    @huyogia3069 2 года назад +2

    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

    • @thanhduongblue
      @thanhduongblue 11 месяцев назад

      Ko có bảng lưu. Chỉ tạo mỗi table user

  • @quangvutran46
    @quangvutran46 9 месяцев назад

    sao e không thấy phần 3 vậy a

  • @maiphuchoang7170
    @maiphuchoang7170 Год назад

    Đ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

    • @lact1323
      @lact1323 Год назад

      user._doc trả về object đã được truy xuất từ hàm find bạn dùng ở trên ấy

  • @bachkhoait4.052
    @bachkhoait4.052 2 года назад

    Mình đã hoàn thành 2 /3 cảm ơn bạn nhìu

  •  2 года назад

    Cảm ơn bạn đã hướng dẫn tận tình

  • @ThangNguyenVan-ov1el
    @ThangNguyenVan-ov1el Год назад

    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ỉ.

  • @hautran7559
    @hautran7559 2 года назад +1

    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

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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?

  • @cookieman.19
    @cookieman.19 Год назад

    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

  • @ShaloMArtist
    @ShaloMArtist 2 года назад

    chỗ verify TokenAdmin , user.id của mình trả về undefined là do đâu nhỉ

  • @oanuchai2752
    @oanuchai2752 3 месяца назад

    Hay nha, chi tiết đầy đủ nha

  • @lamvanbao4774
    @lamvanbao4774 2 года назад

    a ơi cho em hỏi khi nào mình nên dùng redux saga và dự án vậy a

    • @DanielTruongDev
      @DanielTruongDev  2 года назад +2

      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

  • @dayladanhnemay9841
    @dayladanhnemay9841 2 года назад

    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 ạ

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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

  • @thanh8699
    @thanh8699 2 года назад

    cho em hỏi tại sao anh không lưu cái arr refreshTokens trong mongodb luôn ạ

  • @devculi3908
    @devculi3908 2 года назад

    Cảm ơn anh rất nhiều, rất chi tiết và tận tình luôn

  • @nguyentuantruong4815
    @nguyentuantruong4815 2 года назад

    A ơi cho e hỏi khi khi nào cần đưa dữ liệu từ api về redux ạ.

    • @DanielTruongDev
      @DanielTruongDev  2 года назад +1

      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

  • @hahuuo3
    @hahuuo3 Год назад +1

    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 ạ

    • @duykhanhnguyen9274
      @duykhanhnguyen9274 Год назад

      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

  • @none4614
    @none4614 2 года назад

    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

  • @05.tuanatnguyen49
    @05.tuanatnguyen49 7 месяцев назад

    em cảm ơn anh rất nhiều ạ

  • @n8.trinhconguc417
    @n8.trinhconguc417 Год назад

    qua hay luon

  • @PhongNguyen-ey8wh
    @PhongNguyen-ey8wh 2 года назад

    Sao ko dung nodemon di anh

  • @navuong7953
    @navuong7953 2 года назад

    đ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 ạ

    • @DanielTruongDev
      @DanielTruongDev  2 года назад +1

      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

  • @toandokhanh1209
    @toandokhanh1209 Год назад

    đỉnh thật sự

    • @tutosolve
      @tutosolve Год назад

      bình thường , t cũng chưa làm đc như vậy

  • @bentran219
    @bentran219 2 года назад

    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
      @DanielTruongDev  2 года назад

      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é

    • @bentran219
      @bentran219 2 года назад

      @@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ỉ ?

  • @nhiex23
    @nhiex23 Год назад

    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; "

    • @quangthanhle881
      @quangthanhle881 Год назад

      có thể bạn quên chưa import cookie-parser ở file index hoặc server

  • @vukhang510
    @vukhang510 2 года назад

    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

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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

    • @hungnguyenquang7516
      @hungnguyenquang7516 2 года назад

      em muốn hỏi fix được chưa ạ? e install cookie-parser là được á

  • @sonle23-j2d
    @sonle23-j2d 2 года назад

    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 ạ

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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

    • @sonle23-j2d
      @sonle23-j2d 2 года назад

      vâng cảm ơn anh nhiều ạ

  • @mfnhhfc
    @mfnhhfc 6 месяцев назад

    video dài quá em

  • @khangtranquoc3899
    @khangtranquoc3899 2 года назад

    anh ơi em bị lỗi "cannot read property refreshToken".Mong anh phản hồi ạ

    • @duythinho806
      @duythinho806 2 года назад

      không biết bạn fix được chưa nếu chưa được là do chưa cài package cookie-parser

  • @tieucuongmedia970
    @tieucuongmedia970 2 года назад

    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 !.

    • @minhduydao1312
      @minhduydao1312 6 месяцев назад

      vì trong try bạn return về 1 hàm và catch bạn return err nên nó lỗi á

  • @CoffeeTran18
    @CoffeeTran18 2 года назад

    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 ạ

    • @syres0201
      @syres0201 2 года назад +1

      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

  • @baodoan5420
    @baodoan5420 2 года назад

    không có link git hả lưu code hả bạn

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      ở phần mô tả trong video part cuối có á bạn

    • @baodoan5420
      @baodoan5420 2 года назад

      @@DanielTruongDev video bạn nói rất dễ hiểu, đã sub :D ủng hộ dài dài

  • @jockerthe8189
    @jockerthe8189 2 года назад

    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

    • @jockerthe8189
      @jockerthe8189 2 года назад

      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

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      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

    • @jockerthe8189
      @jockerthe8189 2 года назад

      @@DanielTruongDev vâng anh .

    • @jockerthe8189
      @jockerthe8189 2 года назад

      @@DanielTruongDev anh có video nào về socket io hoặc react hook form ko anh

  • @vanphinguyen6028
    @vanphinguyen6028 2 года назад +1

    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 ạ

    • @binhlethanh4121
      @binhlethanh4121 2 года назад +2

      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.

  • @DavidJames535
    @DavidJames535 2 года назад

    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
      @HuyTruong-hu9sn 2 года назад +1

      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

    • @DanielTruongDev
      @DanielTruongDev  2 года назад

      @@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

  • @huutinnguyen3075
    @huutinnguyen3075 2 года назад

    Cho e xin file .env với a

  • @s-movie6840
    @s-movie6840 Год назад

    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?

  • @devlamdep
    @devlamdep 2 года назад

    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 đỡ

  • @kitygaming3668
    @kitygaming3668 Год назад

    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

    • @DanielTruongDev
      @DanielTruongDev  Год назад

      b vào Discord của kênh hỏi thêm cho rõ nha