Cách đăng nhập với mật khẩu thô khi mật khẩu trong cơ sở dữ liệu được lưu dưới dạng hash trong Node.js
Hướng dẫn cách xác thực người dùng đăng nhập bằng cách so sánh mật khẩu thô với mật khẩu đã được hash trong cơ sở dữ liệu. Sử dụng `bcrypt` trong Node.js để kiểm tra sự khớp giữa mật khẩu thô và mật khẩu đã hash.
Bài viết này sẽ hướng dẫn cách xác thực người dùng trong Node.js khi mật khẩu của họ được lưu trữ dưới dạng hash trong cơ sở dữ liệu. Chúng ta sẽ sử dụng bcrypt
để so sánh mật khẩu người dùng nhập với mật khẩu đã được mã hóa.
Mã JavaScript:
// Import các thư viện cần thiết
const bcrypt = require('bcrypt');
const express = require('express');
const bodyParser = require('body-parser');
// Khởi tạo ứng dụng express
const app = express();
app.use(bodyParser.json());
// Giả sử đây là mật khẩu hash lưu trong cơ sở dữ liệu
const storedHashedPassword = '$2b$10$eW5OoANrF5OYsXBXFBDyYeZG96V8uAblEUHhPzBwdKa5wqlXpoGva'; // Hash của mật khẩu 'mypassword'
// Hàm đăng nhập
app.post('/login', async (req, res) => {
const { password } = req.body; // Nhận mật khẩu thô từ yêu cầu POST
try {
// So sánh mật khẩu thô với mật khẩu hash
const match = await bcrypt.compare(password, storedHashedPassword);
if (match) {
// Nếu mật khẩu khớp
res.send('Đăng nhập thành công!');
} else {
// Nếu mật khẩu không khớp
res.status(400).send('Mật khẩu không chính xác.');
}
} catch (error) {
res.status(500).send('Đã xảy ra lỗi.');
}
});
// Lắng nghe cổng 3000
app.listen(3000, () => {
console.log('Server is running on port 3000');
});
Giải thích chi tiết từng dòng code:
-
const bcrypt = require('bcrypt');
: Import thư việnbcrypt
để hash và so sánh mật khẩu. -
const express = require('express');
: Import thư việnexpress
để tạo server HTTP. -
app.use(bodyParser.json());
: Sử dụng body-parser để xử lý dữ liệu từ POST request dưới dạng JSON. -
const storedHashedPassword = '...'
: Giả sử đây là mật khẩu hash lưu trong cơ sở dữ liệu. -
app.post('/login', ...)
: Định nghĩa endpoint/login
để xử lý đăng nhập. -
const match = await bcrypt.compare(password, storedHashedPassword);
: So sánh mật khẩu thô với mật khẩu hash. -
if (match)
: Nếu mật khẩu khớp, trả về thông báo thành công. -
else
: Nếu không khớp, trả về lỗi đăng nhập. -
app.listen(3000, ...)
: Chạy ứng dụng trên cổng 3000.
Yêu cầu hệ thống:
- Node.js phiên bản 12 trở lên.
- Thư viện
bcrypt
: Dùng để hash và so sánh mật khẩu. - Thư viện
express
: Dùng để tạo server HTTP. - Thư viện
body-parser
: Dùng để xử lý dữ liệu từ POST request.
Cách cài đặt các thư viện:
npm install bcrypt express body-parser
Lời khuyên:
- Nên sử dụng
bcrypt
với số rounds lớn (tối thiểu 10) để tăng cường bảo mật cho quá trình mã hóa mật khẩu. - Không bao giờ lưu trữ mật khẩu thô của người dùng trong cơ sở dữ liệu.