Khi phát triển ứng dụng đa nền tảng (Web với Next.js và Mobile với React Native) trong một monorepo, việc duy trì một luồng xác thực duy nhất giúp giảm thiểu mã trùng lặp và đảm bảo bảo mật nhất quán. Dưới đây là các bước thực tế đã áp dụng thành công trong nhiều dự án thực tế. 1. Tách gói auth-core - Tạo một package nội bộ (ví dụ: @myorg/auth-core) chứa logic cấp/refresh token, lưu trữ an toàn (HttpOnly cookie cho Web, SecureStore/Keychain cho Mobile) và các hook dùng chung như useAuth, useLogin, useLogout. - Package này không phụ thuộc vào UI framework, chỉ dùng fetch/axios và các API nền tảng trừu tượng qua interface StorageAdapter. 2. Triển khai StorageAdapter cho từng nền tảng - Web: implement bằng document.cookie (HttpOnly, SameSite=Lax) hoặc next/headers trong Server Components. - Mobile: implement bằng react-native-keychain hoặc expo-secure-store. - Đăng ký adapter khi bootstrap ứng dụng (ví dụ: trong _app.tsx cho Next.js và trong App.tsx cho React Native). 3. Single Sign‑On (SSO) với backend tập trung - Backend cung cấp endpoint /auth/token (access + refresh) và /auth/me. - auth-core tự động refresh khi access token hết hạn, sử dụng interceptors của axios/fetch. - Cấu hình CORS và cookie domain để chia sẻ session giữa sub‑domain web và deep‑link mobile. 4. Bảo vệ route và navigation - Web: dùng Higher‑Order Component withAuth(Component) hoặc middleware Next.js (matcher /"/dashboard/:path*"). - Mobile: wrap navigator bằng <AuthGate> đọc context từ auth-core, điều hướng sang màn hình Login khi chưa có token. 5. Kiểm thử và CI/CD - Viết unit test cho auth-core với ms mock adapter. - Integration test: Cypress cho Web, Detox cho Mobile, cùng chạy trên GitHub Actions matrix. - Mỗi PR bắt buộc pass cả hai suite trước khi merge. Lợi ích: - Mã xác thực chỉ viết một lần, dễ dàng cập nhật chính sách bảo mật (ví dụ: thêm MFA, thay đổi thuật toán JWT). - Giảm rủi ro lệch pha giữa Web và Mobile. - Dễ dàng mở rộng sang nền tảng mới (Desktop Electron, TV) chỉ cần thêm StorageAdapter. Mẹo nhỏ: Luôn version gói auth-core theo SemVer và publish vào registry nội bộ; các app chỉ cần bump version khi có breaking change.