Xác thực hai lớp Two-Factor Authentication with Nodejs

 

     Theo Viện Tiêu chuẩn và Kỹ thuật Quốc gia Mỹ (NIST), hình thức nhận mã xác thực một lần qua tin nhắn SMS (SMS TOP) không đủ an toàn.
    Theo NIST, không cần truy cập vào thẻ SIM hay điện thoại của bạn, tin tặc cũng có thể hack để chuyển hướng tin nhắn của bạn sang điện thoại của chúng và chiếm đoạt những thông tin quan trọng. Các thủ thuật này tinh vi đến mức bạn sẽ không biết được tin nhắn mình đã bị đánh cắp.
NIST cũng cảnh báo những số điện thoại đăng ký trên các ứng dụng kiểu Facebook Messenger, Viber có khả năng bị hack và làm lộ mã xác thực trên SMS. Đây là những ứng dụng sử dụng VoIP, công nghệ truyền giọng nói qua Internet.
    Trước những rủi ro bảo mật, NIST khuyến cáo người dùng nên chuyển sang những ứng dụng tạo mã xác thực một lần, như Google Authenticator, Microsoft Authenticator,... Tin tặc không thể chuyển hướng mã xác thực tạo trên các ứng dụng này.
    Trong trường hợp một số trang web chỉ cho phép bạn xác thực 2 yếu tố bằng tin nhắn SMS, bạn vẫn nên sử dụng chúng. Mặc dù cách thức này không an toàn 100%, nhưng vẫn tốt hơn việc bạn chỉ đăng nhập bằng mật khẩu cơ bản.
    Xác thực 2FA dần đã khá quen với mọi người. Nó là phương pháp xác thực người dùng dựa trên hai yếu tố, một là mật khẩu ( điều bạn biết ), hai là một thứ mà người dùng sở hữu ( điều bạn có ) như tin nhắn SMS, dấu vân tay, gửi mã token tới email. Bài viết này sẽ sử dụng yếu tố xác thực thứ hai là TOTP ( Time based One time Password ). Để biết chi tiết về cơ chế TOTP như thế nào thì các bạn có thể tìm hiểu thêm trên google.
    Hôm nay mình sẽ cùng các bạn triển khai xác thực hai lớp - 2FA với nodejs sử dụng google authenticator.
Workflow của user enable 2FA ( user dùng được chức năng này phải nhập đúng mật khẩu hoặc một cách xác thực nào đó ) 1. Tải app google authenticator 2. Login ứng dụng và enable 2FA 3. Scan QR code hoặc nhập secret key. 4. Nhập mã code gg authenticator sinh ra => enable 2FA Workflow server
- Khi user enable 2FA, secret key sẽ được sinh ra ngẫu nhiên và gán riêng cho mỗi user. ( secret key lưu vào db ).
- QR or mã thủ công sẽ được generate từ secret key và các  thông tin liên quan gửi về user. - User scan và gửi mã code về, server sẽ check. Bắt tay vào code thôi. Mình sẽ không code từ đầu, mà sẽ dùng base có sẵn từ những bài viết trước, nếu các bạn chưa đọc thì có thể vào xem ở đây. https://www.hoangkhanh.tech/2020/08/authentication-use-passport-and-jwt-in.html (Phần 1)
https://www.hoangkhanh.tech2020/08/authentication-use-passport-and-jwt-in_11.html (Phần 2) Mình sử dụng thêm các module: - speakeasy : dùng để tạo mã code ( các bạn có thể dùng một thư viện khác, nhưng quan trọng là phải hỗ trợ thằng Google Authenticator nhé ) - qrcode: để sinh ra mã qr cho user scan. file routes/auth.js ( mình sẽ định nghĩa 2 api, một api để enable 2FA, một api để verify )


file controllers/auth.js



Khi đã enable 2FA mà login thì sẽ như thế này


Mình sẽ test nhé: Login và lấy token của user.



Enable 2FA



Đoạn mã qrcode mình để vào thẻ img nhé. Đoạn secret key có trả về cùng, user co thể viết lại ra giấy, tránh trường hợp bị mất điện thoại thì sẽ không login được nữa, vì thằng gg authenticator ko lưu secret key.


Scan qrcode và nó sẽ sinh mã code 6 số theo thời gian.


Nhập mã đúng trong thời điểm đó thì mới login được, còn không sẽ không login được đâu nhé!

Docs về thằng speakeasy trên npm mình đọc đau hết cả đầu, vì vậy khi đọc sau docs trên npm bạn có thể tham khảo bài viết sau để đỡ đau đầu hơn nhé. here. Thằng speakeasy mình cũng có thể dùng nó để làm mã otp được, có thời gian thì các bạn tìm hiểu về nó nhé.

Link Github: https://github.com/KhanhKitin/authentication-passport-nodejs.git Vậy là mình đã cùng các bạn triển khai xác thực 2 lớp với nodejs rồi, cảm ơn các bạn rất nhiều khi đã đọc tới tận đây.


Autodeploy from gitlab to aws ec2 instances

Chào mọi người, lại là mình đây, HQ Khánh. Cuối tuần nên mình lên tiktok dạo chơi lúc mà cứ quẹt cái nào là cái đó lại "Gió lung lay, bàn tay nâng cánh hoa tình....". Khá cáu 😑. Cảm thấy hơi lãng phí tiền mạng, mình liền xóa app rồi mò lên đây viết blog, và rồi bài viết này ra đời.
Authentication use Passport and Jwt in Nodejs ( Phần 2 )

 


Hi! Lại là mình đây, hôm nay mình tiếp tục cùng các bạn tìm hiểu về xác thực trong nodejs nhé!

Link phần 1, các bạn có thể vào xem qua để hiểu rõ hơn trước khi đọc phần 2 nhé: 

Như ở phần trước mình đã cùng các bạn tạo một user rồi. Giờ sẽ là kịch bản khi user login. ( sử dụng passport, jwt)

Kịch bản:

1. Đầu tiên người dùng sẽ submit form đăng nhập, một request POST được tạo ra với route api/sigin. Nó sẽ chạy cái middleware passport.authenticate.

2. Mình sẽ thiết lập kịch bản local cho thằng passport.authenticate nên nó sẽ gọi đến cái kịch bản đã cài đặt.

3. Kịch bản mà ta cài đặt, nó sẽ lấy email, password mà user submit lên để xử lý. Nó sẽ kiểm tra xem user đó có tồn tại hay không. Nếu không tồn tại nó sẽ gọi đến callback done(null, false) ( bạn có thể thêm thông báo bằng cách thêm info, done(null, false, info) ). Còn nếu đăng nhập thành công thì trả ra callback done(null, user).

4. Sau khi qua kịch bản local passport thì thằng passport.authenticate nếu có user sẽ tiến hành sinh token cho user và trả về cho người dùng.

Ok. kịch bản là như vậy, xắn tay lên code thôi.

Thiết lập kịch bản local passport.


Hàm xử lý 


Khá dễ hiểu đúng không các bạn.
Mình dùng postman test luôn nhé.


Sau khi đăng nhập thành công, mình sẽ trả về thông tin user và token của user đó.

Code mình để trên đây, các bạn kéo về chạy sẽ hiểu tổng quát hơn nhé.


Passport còn thể dễ dàng làm với những kịch bản như đăng nhập bằng Facebook, Twitter, Google,... 

Cảm ơn mọi người đã đọc bài viết của mình nhé, mọi người cùng góp ý, trao đổi để cùng tiến bộ nhé. 

Tài liệu tham khảo:




Duy trì server luôn sống với PM2 !



     Nếu mình tắt server thì có call được api không nhỉ? 

     Ngày xưa mình từng nghĩ như vậy, bạn có nghĩ giống mình, haha..... Code server rồi chạy trên localhost, vậy làm sao để mình ko mở máy tính hoặc đi ngủ mà server vẫn sống được ta! Hôm nay mình sẽ cùng các bạn tìm hiểu và giải quyết bài toán này nhé!
Deno.js | Cài đặt và viết chương trình đầu tiên với deno




Hi. Mình là HQK. Trời nóng quá, nên mình lên đây viết blog chém gió với ae cho mát. Trước khi vào vấn đề chính như tiêu đề, mình xin phép giới thiệu qua về thằng deno.

Deno là một chương trình để chạy mã JavaScript và TypeScript bên ngoài trình duyệt.

- Deno được tạo bới Ryan Dahl. Cũng chính là người phát triển Nodejs.
- Deno được bảo mật theo mặc định. Nếu không được phép, nó không thể truy cập các tập tin, mạng hoặc môi trường.
- Deno có TypeScript tích hợp mà không cần cấu hình bên ngoài.
- Các gói bên ngoài được kéo vào thông qua các url.
Và một điều thú vị nữa là Deno là đảo chữ của Node.

Nghe đã thấy thằng này phê rồi anh em nhỉ. Bắt tay vào trinh phục nó thôi.
À quên, link github của Deno đây nhé: https://github.com/denoland/deno
Thời điểm mình đang viết bài nó hơn 49k star nhé, hơi bị oách luôn.
Để cài đặt deno các bạn thực hiện theo hình bên dưới: 



Mình dùng window, nếu hiện thị như sau là thành công rồi nhé: 



Cài đặt khá là ok. Cùng bắt tay, bắt chân viết chương trình hello world xem hịn không nào? Mình được một anh kể bảo mỗi khi code một ngôn ngữ mới, người ta đều code hello world đầu tiên, để may mắn, không bao giờ phải fix bug. Haha, không biết có đúng không, mà ngôn ngữ nào mình cũng code hello world đầu tiên mà vẫn fix bug ầm ầm :)).


Ghê chưa nào? Quá xuất sắc.
Thử build server xem sao.


Các bạn code như mình rồi chạy. Deno run server.js. Ra ngay một cái error đỏ lòm. Haha không sao, deno bảo mật quá đi mà, bạn phải cho phép nó truy cập mạng.
Bắt đầu run lại: Deno run --allow-net server.js. Wow, hịn đó.


Các bạn có thể tham khảo 1 list các quyền mà chương trình cần:


Giờ mình thử dùng module bên thứ 3 xem sao. 




Để chạy các bạn chạy: deno run --allow-net server.jsx. Rồi sẽ được kết quả như này nhé.


Ma thuật chưa, chơi được cả file jsx, quá ngầu.

Mình chỉ test sơ sơ qua và giới thiệu với các bạn về thằng deno.js. Cảm ơn các bạn đã đọc bài viết của mình. Thân ái chào quyết thắng.