Skip to content

Task 2-1: Audit Logging cho Auth Events

Phase: 2 - Observability Priority: Medium Module: authentication Depends on: Không có Reference: docs/BountyHunter-Backend/details/feature-authentication/SPEC.md

Background

Chưa có structured audit log cho các sự kiện auth quan trọng (login, ban, logout). Rất khó điều tra khi có incident bảo mật.

Tasks

DI / Import note: LOGGER phải được khai báo là static field ở đầu mỗi class sử dụng nó. Nếu chưa có, thêm vào AuthServiceAuthController:

private static final org.slf4j.Logger LOGGER = org.slf4j.LoggerFactory.getLogger(AuthService.class);
Import: org.slf4j.Logger, org.slf4j.LoggerFactory. Các biến như loginType, ipAddress, isFirstLogin, userId, firebaseToken, deviceType phải có sẵn trong scope của method tương ứng — xác nhận trước khi thêm log line.

  • [ ] Thêm structured log khi user login thành công (userId, loginType, ipAddress, isFirstLogin)
  • [ ] Log khi user bị chặn vì NO_ACTIVE status
  • [ ] Log khi user logout (userId, firebaseToken)
  • [ ] Log khi concurrent login detected (thiết bị mới)

Format log chuẩn:

// Login success
LOGGER.info("[AUTH_EVENT] action=LOGIN_SUCCESS userId={} loginType={} ip={} isFirstLogin={}",
    user.getId(), loginType, ipAddress, isFirstLogin);

// Banned
LOGGER.warn("[AUTH_EVENT] action=LOGIN_BANNED userId={} loginType={}",
    user.getId(), loginType);

// Logout
LOGGER.info("[AUTH_EVENT] action=LOGOUT userId={} firebaseToken={}",
    userId, firebaseToken);

// New device
LOGGER.info("[AUTH_EVENT] action=NEW_DEVICE userId={} deviceType={}",
    user.getId(), deviceType);

Verification / Acceptance Criteria

  • [ ] Compile check: AuthService.javaAuthController.java compile thành công — LOGGER được khai báo trong mỗi class, import org.slf4j.Loggerorg.slf4j.LoggerFactory tồn tại.
  • [ ] Login success log: Thực hiện sign-in thành công → log line [AUTH_EVENT] action=LOGIN_SUCCESS xuất hiện trong console/log file với đủ các field userId, loginType, ip, isFirstLogin.
  • [ ] Banned log: sign-in với user có status=NO_ACTIVE → log line [AUTH_EVENT] action=LOGIN_BANNED xuất hiện ở level WARN.
  • [ ] Logout log: DELETE /api/auth/logout/{firebaseToken} → log line [AUTH_EVENT] action=LOGOUT xuất hiện với userIdfirebaseToken.
  • [ ] New device log: Login từ thiết bị mới → log line [AUTH_EVENT] action=NEW_DEVICE xuất hiện với userIddeviceType.
  • [ ] No sensitive data: Log không chứa password, JWT token, hay auth code.

Files to Modify

  • authentication/controllers/auth/AuthService.java — trong signIn(), setLoginCodeResponse(), getLoginCodeResponse()
  • authentication/controllers/auth/AuthController.java — trong logoutFromDevice()