dptxa-proxy / src /pages /api /auth /login.js
TXAVLOG
Deploy DPTXA to Hugging Face Spaces
4bea261
Raw
History Blame Contribute Delete
2.27 kB
import crypto from 'node:crypto';
import { txasupabase } from '../../../lib/txasupabase.js';
export const POST = async ({ request, cookies }) => {
try {
const body = await request.json();
const { identity, password } = body;
// Kiểm tra dữ liệu rỗng đầu vào
if (!identity || !password) {
return new Response(
JSON.stringify({ error: 'Vui lòng điền đầy đủ tài khoản và mật khẩu nha!' }),
{ status: 400, headers: { 'Content-Type': 'application/json' } }
);
}
// Mã hóa mật khẩu đầu vào bằng SHA-256 để so sánh
const hashedPassword = crypto.createHash('sha256').update(password).digest('hex');
// Tìm kiếm tài khoản trùng khớp (Username hoặc Email)
const { data: user, error } = await txasupabase.supabase
.from('users')
.select('*')
.or(`username.eq.${identity},email.eq.${identity}`)
.eq('password', hashedPassword)
.maybeSingle();
if (error || !user) {
return new Response(
JSON.stringify({ error: 'Tài khoản hoặc mật khẩu không chính xác rồi bạn ơi!' }),
{ status: 401, headers: { 'Content-Type': 'application/json' } }
);
}
// Khởi tạo thông tin Session đơn giản (Mã hóa Base64)
const userData = { id: user.id, username: user.username, email: user.email, role: user.role, avatar_url: user.avatar_url };
const token = Buffer.from(JSON.stringify(userData)).toString('base64');
// Thiết lập HTTP-Only Cookie đảm bảo an toàn bảo mật
cookies.set('auth_token', token, {
path: '/',
httpOnly: true,
secure: process.env.NODE_ENV === 'production',
sameSite: 'lax',
maxAge: 60 * 60 * 24 * 7 // Hiệu lực trong 1 tuần
});
return new Response(
JSON.stringify({ message: 'Đăng nhập thành công!', user: userData }),
{ status: 200, headers: { 'Content-Type': 'application/json' } }
);
} catch (error) {
console.error('[Auth Login Error]:', error);
return new Response(
JSON.stringify({ error: 'Gặp sự cố lỗi hệ thống khi đăng nhập!' }),
{ status: 500, headers: { 'Content-Type': 'application/json' } }
);
}
};