Thêm Nhãn "Đăng Nhập Cuối" vào Trang Đăng Nhập Website
Khi người dùng muốn đăng nhập vào website của bạn, họ có thể gặp khó khăn do nhiều phương thức xác thực khác nhau. Việc thêm một nhãn "Đăng Nhập Cuối" - như thường thấy trên các website như lovable.dev, có thể giải quyết vấn đề trải nghiệm người dùng (UX) này.
Tại Sao Cần Thêm Nhãn "Đăng Nhập Cuối"?
Khi cung cấp nhiều phương thức xác thực, người dùng thường phải đối mặt với một thách thức phổ biến: "Tôi đã đăng ký bằng phương thức nào - Google hay email?" Đây không chỉ là một vấn đề sở thích của người dùng, mà còn là một vấn đề hợp lý về trải nghiệm người dùng.
Một chút khó khăn này có thể dẫn đến các lần đăng nhập không thành công, việc đặt lại mật khẩu nhiều lần và người dùng từ bỏ phần mềm của bạn hoàn toàn.
Việc thêm một nhãn hỗ trợ đơn giản như "Đăng Nhập Cuối" hoặc "Đăng Nhập Cuối Cùng" có thể giải quyết vấn đề này một cách triệt để. Trong bài viết này, tôi sẽ hướng dẫn bạn cách thực hiện điều đó. Mặc dù tôi sẽ sử dụng Next.js để minh họa, nhưng cùng một logic có thể áp dụng cho bất kỳ framework frontend nào.
Nội Dung Chúng Ta Sẽ Thực Hiện
- Lưu phương thức xác thực ưa thích của người dùng vào LocalStorage.
- Tạo một component nhãn "Đăng Nhập Cuối".
- Thêm component vào trang đăng nhập.
Lưu ý: Tôi giả định rằng bạn đã quen thuộc với phát triển frontend và đã có một dự án được thiết lập, vì vậy tôi sẽ không đề cập đến các khái niệm cơ bản như cách khởi động một dự án React.js hay xử lý trạng thái. Tôi sẽ tập trung vào cách đơn giản để thêm nhãn "Đăng Nhập Cuối", và bạn có thể hoàn thành phần logic còn lại.
Bước 1: Thiết Lập Component Đăng Nhập
Đầu tiên, hãy tạo một component đăng nhập cơ bản với nhiều tùy chọn xác thực. Các trường email và mật khẩu không được hiển thị ban đầu - thay vào đó, một nút sẽ đóng vai trò là placeholder. Khi nút được nhấn, nó sẽ ẩn các phương thức khác và hiển thị biểu mẫu email/mật khẩu.
Tốt nhất là tạo các nút tái sử dụng cho mỗi quy trình xác thực, ví dụ: . Component nhãn sẽ được định vị tuyệt đối cho mỗi phương thức để cải thiện UX.
javascript
'use client';
import { useState, useEffect } from 'react';
export const LAST_USED_KEY = '_app_last_login_method';
export default function LoginPage() {
const [lastUsedMethod, setLastUsedMethod] = useState(null);
const [showEmailFields, setShowEmailFields] = useState(false);
// Tải phương thức đã sử dụng trên mount của component
useEffect(() => {
if (typeof window !== 'undefined') {
const stored = localStorage.getItem(LAST_USED_KEY);
setLastUsedMethod(stored);
}
}, []);
// Khi nút email được nhấn, hiển thị các trường biểu mẫu và ẩn các phương thức xác thực khác
const handleEmailLogin = () => {
setShowEmailFields(true);
};
if (showEmailFields) {
return (
// Component trường email (thực hiện biểu mẫu của bạn ở đây)
<div className="max-w-md mx-auto p-6 bg-white rounded-lg shadow-md">
<h2 className="text-2xl font-bold mb-6 text-center">Đăng Nhập Bằng Email</h2>
{/* Thêm các trường biểu mẫu email/mật khẩu, nút gửi, v.v. */}
</div>
);
}
return (
<div className="max-w-md mx-auto p-6 bg-white rounded-lg shadow-md">
<h2 className="text-2xl font-bold mb-6 text-center">Đăng Nhập</h2>
{/* Đăng Nhập Bằng Email/Mật Khẩu */}
<div className="relative mb-4">
<button
className="w-full p-3 border border-gray-300 rounded-lg hover:bg-gray-50"
onClick={handleEmailLogin}
>
Tiếp Tục Bằng Email
</button>
{lastUsedMethod === 'EMAIL' && <LastUsedBadge />}
</div>
<div className="text-center text-gray-400 text-sm mb-4">HOẶC</div>
{/* Google OAuth */}
<div className="relative">
<button
className="w-full p-3 border border-gray-300 rounded-lg hover:bg-gray-50 flex items-center justify-center"
onClick={() => handleGoogleLogin()} // Định nghĩa handleGoogleLogin bên dưới
>
<GoogleIcon className="w-5 h-5 mr-2" /> {/* Giả định GoogleIcon đã được nhập */}
Tiếp Tục Bằng Google
</button>
{lastUsedMethod === 'GOOGLE' && <LastUsedBadge />}
</div>
</div>
);
}
Bước 2: Tạo Component Nhãn "Đăng Nhập Cuối"
Nhãn cung cấp phản hồi trực quan về phương thức mà người dùng đã sử dụng gần nhất:
javascript
const LastUsedBadge = () => {
return (
<div className="absolute -top-2 -right-2 z-10">
<span className="inline-flex items-center px-2 py-1 text-xs font-medium bg-blue-100 text-blue-800 rounded-full border border-blue-200">
Đã sử dụng cuối
</span>
</div>
);
};
Thiết kế là tùy thuộc vào bạn. Bạn có thể sử dụng component Nhãn từ các thư viện như Shadcn UI nếu muốn.
Bước 3: Theo Dõi Các Phương Thức Xác Thực
Thực hiện logic để lưu và truy xuất phương thức ưa thích của người dùng. Sử dụng một hàm tiện ích để lưu nó:
javascript
// Hàm tiện ích để lưu phương thức đăng nhập
const saveLoginMethod = (method) => {
if (typeof window !== 'undefined') {
localStorage.setItem(LAST_USED_KEY, method);
}
};
// Xử lý xác thực Email/Mật khẩu (thêm vào logic gửi biểu mẫu)
const handleEmailSubmit = async (formData) => {
try {
// Logic xác thực của bạn ở đây
const response = await signInWithEmail(formData);
if (response.success) {
// Lưu phương thức sau khi đăng nhập thành công
saveLoginMethod('EMAIL');
// Chuyển hướng đến dashboard
router.push('/dashboard');
}
} catch (error) {
console.error('Đăng nhập bằng email không thành công:', error);
}
};
// Xử lý đăng nhập Google
const handleGoogleLogin = async () => {
try {
// Bắt đầu quy trình OAuth
const response = await signInWithGoogle();
if (response.success) {
// Lưu phương thức khi thành công
saveLoginMethod('GOOGLE');
// OAuth sẽ tự động xử lý chuyển hướng
}
} catch (error) {
console.error('Đăng nhập Google không thành công:', error);
}
};
Nếu ứng dụng của bạn có mức độ bảo mật cao, hãy xem xét việc lưu trữ điều này trong cookie httpOnly thông qua các hành động máy chủ hoặc các route API thay vì LocalStorage. Tôi không biết về các vấn đề bảo mật lớn khi lưu trữ chỉ loại phương thức, nhưng luôn đánh giá dựa trên nhu cầu của bạn.
Bước 4: Xử Lý Quy Trình Chuyển Hướng OAuth
OAuth liên quan đến các chuyển hướng, điều này có thể làm phức tạp việc theo dõi. Dưới đây là cách xử lý điều này.
Đối với OAuth phía client:
javascript
// Đối với các nhà cung cấp cho phép hoàn tất phía client
const handleGoogleLogin = async () => {
// Lưu sở thích trước khi bắt đầu OAuth
saveLoginMethod('GOOGLE');
// Bắt đầu quy trình OAuth
window.location.href = '/auth/google';
};
Đối với callback phía server với thông báo cho client (trong Next.js):
javascript
// Trong handler callback OAuth (/api/auth/callback/google.js)
export default async function handler(req, res) {
try {
// Xử lý logic callback OAuth
const { user, session } = await processOAuthCallback(req);
if (user) {
// Chuyển hướng với tham số phương thức đăng nhập
res.redirect('/dashboard?login_method=GOOGLE');
}
} catch (error) {
res.redirect('/login?error=oauth_failed');
}
}
Sau đó, xử lý tham số trên client:
javascript
// Hook để xử lý phương thức đăng nhập từ tham số URL
const useLoginMethodTracker = () => {
const router = useRouter();
useEffect(() => {
const urlParams = new URLSearchParams(window.location.search);
const loginMethod = urlParams.get('login_method');
if (loginMethod) {
saveLoginMethod(loginMethod);
// Dọn dẹp URL
const url = new URL(window.location);
url.searchParams.delete('login_method');
window.history.replaceState({}, '', url);
}
}, []);
};
// Sử dụng trong dashboard hoặc các trang bảo vệ
export default function Dashboard() {
useLoginMethodTracker();
return <div>Chào mừng bạn đến với dashboard của bạn!</div>;
};
Thực Hành Tốt Nhất và Lưu Ý khi Thêm Nhãn "Đăng Nhập Cuối"
Bảo Mật
- Chỉ lưu trữ phương thức xác thực, không lưu trữ dữ liệu nhạy cảm.
- Sử dụng sessionStorage cho các ứng dụng nhạy cảm hơn.
- Thực hiện bảo vệ CSRF cho tất cả các phương thức.
Quyền Riêng Tư
- Thông báo rõ ràng cho người dùng về dữ liệu lưu trữ cục bộ.
- Cho phép người dùng xóa sở thích này.
Khả Năng Tiếp Cận
- Đảm bảo các nhãn không gây cản trở cho các thiết bị đọc màn hình.
- Cung cấp ARIA labels.
- Kiểm tra với điều hướng bàn phím.
Kết Luận
Việc thêm nhãn "Đăng Nhập Cuối" vào trang đăng nhập của bạn là một cải tiến nhỏ nhưng mang lại lợi ích lớn cho trải nghiệm người dùng. Bằng cách giảm ma sát và cung cấp các tín hiệu trực quan, bạn tạo ra một trải nghiệm dễ hiểu hơn, giúp tăng cường sự tham gia và giữ chân người dùng.
Việc thực hiện cũng rất đơn giản, chỉ cần thay đổi một vài dòng mã để có được tác động tối đa. Khi xác thực tiếp tục phát triển, những chi tiết tinh tế này sẽ trở nên thiết yếu.
Bạn có câu hỏi nào không?