feat(web): add OAuth callback pages and auth flow for Google/Zalo

- Add /auth/callback/google and /auth/callback/zalo pages that extract
  tokens from query params and persist them via the auth store
- Add handleOAuthCallback method to Zustand auth store
- Update middleware to allow /auth/callback/* as public routes
- Show OAuth error messages on login page when redirected back

Co-Authored-By: Paperclip <noreply@paperclip.ing>
This commit is contained in:
Ho Ngoc Hai
2026-04-08 02:21:48 +07:00
parent dafed32e11
commit bfdd2f7cfa
5 changed files with 142 additions and 2 deletions

View File

@@ -2,7 +2,7 @@
import { useState } from 'react';
import Link from 'next/link';
import { useRouter } from 'next/navigation';
import { useRouter, useSearchParams } from 'next/navigation';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { Loader2 } from 'lucide-react';
@@ -17,9 +17,18 @@ import { useAuthStore } from '@/lib/auth-store';
export default function LoginPage() {
const router = useRouter();
const searchParams = useSearchParams();
const { login, isLoading, error, clearError } = useAuthStore();
const [showPassword, setShowPassword] = useState(false);
const oauthError = searchParams.get('error');
const oauthErrorMessage =
oauthError === 'oauth_failed'
? 'Đăng nhập bằng mạng xã hội thất bại. Vui lòng thử lại.'
: oauthError
? decodeURIComponent(oauthError)
: null;
const {
register,
handleSubmit,
@@ -45,6 +54,11 @@ export default function LoginPage() {
</CardHeader>
<CardContent>
<form onSubmit={handleSubmit(onSubmit)} className="space-y-4">
{oauthErrorMessage && (
<div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive" role="alert">
{oauthErrorMessage}
</div>
)}
{error && (
<div className="rounded-md bg-destructive/10 p-3 text-sm text-destructive" role="alert">
{error}