0

NodeJS Ngày 3 - Tạo OAuth Authentication Middleware

Mục tiêu tạo middleware

  • Đọc token từ Authorization: Bearer <idToken>
    
  • Xác minh với Firebase Admin SDK\
    
  • Gắn thông tin người dùng vào req.user
    
  • Nếu không hợp lệ → trả về 401 Unauthorized
    

1. Tạo file middlewares/auth.middleware.js

const admin = require('../firebase/firebase.config');

const authMiddleware = async (req, res, next) => {
  const authHeader = req.headers.authorization;

  if (!authHeader || !authHeader.startsWith('Bearer ')) {
    return res.status(401).json({ error: 'Authorization token missing or malformed' });
  }

  const idToken = authHeader.split('Bearer ')[1];

  try {
    const decodedToken = await admin.auth().verifyIdToken(idToken);

    // Gắn thông tin user vào req để sử dụng sau
    req.user = {
      uid: decodedToken.uid,
      email: decodedToken.email,
      name: decodedToken.name,
      picture: decodedToken.picture,
      role: decodedToken.role || 'user', // nếu bạn muốn xử lý vai trò người dùng
    };

    next(); // chuyển tiếp sang controller
  } catch (err) {
    return res.status(401).json({ error: 'Invalid or expired token', details: err.message });
  }
};

module.exports = authMiddleware;

2. Cách sử dụng trong route

const express = require('express');
const router = express.Router();
const cartController = require('../controllers/cart.controller');
const authMiddleware = require('../middlewares/auth.middleware');

// Yêu cầu phải đăng nhập mới được xem giỏ hàng
router.get('/my-cart', authMiddleware, cartController.getCartForCurrentUser);

Trong controller

exports.getCartForCurrentUser = async (req, res) => {
  const userId = req.user.uid;

  const cart = await Cart.findOne({
    where: { userId },
    include: [Book],
  });

  if (!cart) {
    return res.status(404).json({ message: 'Cart not found' });
  }

  res.json(cart);
};

Bài viết ở giai đoạn sơ khai, lưu lại quá trình mình học tập cho bài tập lớn. Mọi sai sót sẽ được cập nhật trong thời gian sớm nhất.

Nhiên.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí