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 )

แชร์
ฝัง
  • เผยแพร่เมื่อ 13 ต.ค. 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

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

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

  • @ken2ker495
    @ken2ker495 3 หลายเดือนก่อน

    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 ạ

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

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

  • @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 10 หลายเดือนก่อน

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

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

  • @nhatleminh9176
    @nhatleminh9176 2 ปีที่แล้ว +1

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

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

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

  • @thanhhuynguyen7551
    @thanhhuynguyen7551 2 หลายเดือนก่อน

    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!

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

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

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

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

  • @lenhac9040
    @lenhac9040 2 ปีที่แล้ว +1

    Hay quá , xem mà nghiện

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

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

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

  • @hiennham8872
    @hiennham8872 ปีที่แล้ว

    refresh và access token mình ghim cả 2 ở cookie đc ko 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

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

  • @thanh8699
    @thanh8699 2 ปีที่แล้ว

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

  • @lucnguyeninh1057
    @lucnguyeninh1057 ปีที่แล้ว

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

  • @dayladanhnemay9841
    @dayladanhnemay9841 ปีที่แล้ว

    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  ปีที่แล้ว

      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

  • @khuongviettai
    @khuongviettai ปีที่แล้ว

    lỗi code 11000 khi đăng ký username thư 2. thì fix như nào vậy. cám ơ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

  • @truongminhphuc4337
    @truongminhphuc4337 ปีที่แล้ว

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

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

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

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

  • @devculi3908
    @devculi3908 2 ปีที่แล้ว

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

  • @oanuchai2752
    @oanuchai2752 2 หลายเดือนก่อน

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

  •  2 ปีที่แล้ว

    Cảm ơn bạn đã hướng dẫn tận tì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

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

  • @bachkhoait4.052
    @bachkhoait4.052 2 ปีที่แล้ว

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

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

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

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

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

  • @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 5 หลายเดือนก่อน

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

  • @quangvutran46
    @quangvutran46 8 หลายเดือนก่อน

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

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

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

  • @PhongNguyen-ey8wh
    @PhongNguyen-ey8wh 2 ปีที่แล้ว

    Sao ko dung nodemon di anh

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

  • @05.tuanatnguyen49
    @05.tuanatnguyen49 6 หลายเดือนก่อน

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

  • @n8.trinhconguc417
    @n8.trinhconguc417 ปีที่แล้ว

    qua hay luon

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

  • @ShaloMArtist
    @ShaloMArtist 2 ปีที่แล้ว

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

  • @toandokhanh1209
    @toandokhanh1209 ปีที่แล้ว

    đỉnh thật sự

    • @tutosolve
      @tutosolve ปีที่แล้ว

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

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

  • @mfnhhfc
    @mfnhhfc 5 หลายเดือนก่อน

    video dài quá em

  • @huutinnguyen3075
    @huutinnguyen3075 2 ปีที่แล้ว

    Cho e xin file .env với a

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

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

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