You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
36 lines
1002 B
36 lines
1002 B
import { loginUser } from "#server/service/auth";
|
|
import { z } from "zod";
|
|
|
|
const loginSchema = z.object({
|
|
username: z.string().min(1),
|
|
password: z.string().min(1),
|
|
captchaToken: z.string().min(1),
|
|
captchaCode: z.string().min(1),
|
|
});
|
|
|
|
export default defineWrappedResponseHandler({ auth: 'public' }, async (event) => {
|
|
const body = await readBody(event);
|
|
const parsed = loginSchema.safeParse(body);
|
|
|
|
if (!parsed.success) {
|
|
return R.error("参数校验失败", parsed.error.issues);
|
|
}
|
|
|
|
const { username, password, captchaToken, captchaCode } = parsed.data;
|
|
const result = await loginUser(username, password, captchaToken, captchaCode);
|
|
|
|
if (!result.success) {
|
|
return R.error(result.message!, null);
|
|
}
|
|
|
|
// Set token as httpOnly cookie
|
|
setCookie(event, "token", result.token!, {
|
|
httpOnly: true,
|
|
secure: process.env.NODE_ENV === "production",
|
|
sameSite: "lax",
|
|
maxAge: 60 * 60 * 24 * 7,
|
|
path: "/",
|
|
});
|
|
|
|
return R.success({ user: result.user });
|
|
});
|
|
|