Hiện nay, OAuth là một tính năng hết sức cơ bản cho những ứng dụng web. Vì vậy việc tìm hiểu các bước tích hợp OAuth vào tính năng đăng ký-đăng nhập là cần thiết cho một ứng dụng web. Ở bài viết này, mình sẽ liệt kê các bước thiết lập đơn giản cho một dự án nhỏ viết bằng ExpressJS.
Tóm tắt quy trình đăng ký-đăng nhập bằng OAuth:
- Firebase xử lý đăng nhập phía frontend (React/Flutter/Web).
- Firebase trả về ID Token JWT sau khi đăng nhập thành công.
- Client gửi ID Token này lên backend Node.js.
- Backend xác minh token với Firebase Admin SDK.
- Nếu hợp lệ → tạo user / xác thực → tiếp tục xử lý logic.
1. Cài đặt Firebase
npm install firebase-admin
2. Cấu trúc dự án
project/
├── firebase/
│ └── firebase.config.js
├── controllers/
│ └── auth.controller.js
├── routes/
│ └── auth.routes.js
├── app.js
└── .env
3. Tạo tài khoản Firebase
- Vào Firebase Console → Dự án của bạn
- Vào Project settings > Service Accounts
- Nhấn Generate new private key
- Lưu file .json → đặt tên firebase-service-account.json
- Thêm vào .gitignore để tránh đẩy lên GitHub
4. Viết code cho file firebase.config.js
const admin = require('firebase-admin');
const serviceAccount = require('../firebase-service-account.json'); admin.initializeApp({ credential: admin.credential.cert(serviceAccount),
}); module.exports = admin;
5. Viết code cho file auth.controller.js
const admin = require('../firebase/firebase.config'); exports.verifyFirebaseToken = async (req, res) => { const idToken = req.headers.authorization?.split('Bearer ')[1]; if (!idToken) { return res.status(401).json({ error: 'No token provided' }); } try { const decodedToken = await admin.auth().verifyIdToken(idToken); const uid = decodedToken.uid; const email = decodedToken.email; // Optional: tạo user trong database nếu chưa có return res.status(200).json({ message: 'Token verified', uid, email, }); } catch (err) { return res.status(401).json({ error: 'Invalid token', details: err.message }); }
};
6. Viết code cho file auth.routes.js
const express = require('express');
const router = express.Router();
const authController = require('../controllers/auth.controller'); router.post('/verify-token', authController.verifyFirebaseToken); module.exports = router;
7. Tích hợp vào app.js
const express = require('express');
const bodyParser = require('body-parser'); const app = express();
app.use(bodyParser.json()); const authRoutes = require('./routes/auth.routes');
app.use('/api/auth', authRoutes); app.listen(3000, () => { console.log('Server running on http://localhost:3000');
});
Do kinh nghiệm chưa đủ sâu, nên bài viết chỉ mang tính chất tham khảo. Mọi góp ý từ những đàn anh, mình xin được hoan hỉ tiếp thu dưới phần comment ạ.
Nhiên.