You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Qwik-auth插件实现Qwik自定义登录页面

自定义Qwik Auth登录页面实现方案

1. 配置AuthJS指定自定义登录页路径

在项目的auth.ts(或对应Auth配置文件)中,修改AuthJS配置,添加pages字段指定自定义登录页的路由,系统会自动跳过默认的简陋表单,跳转到你的自定义页面:

export const { onRequest, useAuthSession, useAuthSignin, useAuthSignout } = createQwikAuth({
  providers: [
    Credentials({
      credentials: {
        email: { label: "邮箱", type: "email" },
        password: { label: "密码", type: "password" }
      },
      async authorize(credentials) {
        // 这里编写用户校验逻辑,比如查询数据库验证账号密码
        const user = await validateUser(credentials.email, credentials.password);
        return user ?? null;
      }
    })
  ],
  // 指定自定义登录页的路由路径
  pages: {
    signin: '/login'
  }
});

2. 创建自定义登录组件

在src/routes/login/index.tsx(对应上面配置的/login路由)中编写自定义登录表单,用Qwik的方式处理表单提交:

import { component$, useStore } from '@builder.io/qwik';
import { useNavigate } from '@builder.io/qwik-city';

export default component$(() => {
  const navigate = useNavigate();
  const formData = useStore({ email: '', password: '' });
  const error = useStore({ message: '' });

  const handleSubmit$ = async (e: Event) => {
    e.preventDefault();
    error.message = '';

    try {
      // 向AuthJS的credentials登录端点发送POST请求
      const response = await fetch('/api/auth/signin/credentials', {
        method: 'POST',
        headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
        body: new URLSearchParams({
          email: formData.email,
          password: formData.password,
          // 必须携带该参数,指定登录成功后的跳转目标
          callbackUrl: '/'
        })
      });

      if (response.ok) {
        // 登录成功,跳转到目标页面
        navigate(await response.text());
      } else {
        // 处理登录失败场景
        const data = await response.json();
        error.message = data.error || '登录失败,请检查账号密码';
      }
    } catch (err) {
      error.message = '网络错误,请稍后重试';
    }
  };

  return (
    <div class="login-container">
      <h1>自定义登录页</h1>
      {error.message && <p class="error-text">{error.message}</p>}
      <form onSubmit$={handleSubmit$}>
        <div class="form-group">
          <label>邮箱</label>
          <input
            type="email"
            bind:value={formData.email}
            required
            class="form-input"
          />
        </div>
        <div class="form-group">
          <label>密码</label>
          <input
            type="password"
            bind:value={formData.password}
            required
            class="form-input"
          />
        </div>
        <button type="submit" class="submit-btn">登录</button>
      </form>
    </div>
  );
});

3. 其他身份提供商的适配

如果使用Google、GitHub等第三方登录,自定义登录页可通过useAuthSignin钩子生成对应提供商的登录链接:

const signin = useAuthSignin();
// 生成Google登录跳转链接
const googleSignInUrl = await signin('google', { callbackUrl: '/' });

内容的提问来源于stack exchange,提问作者PiWizard3852

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 01:07:13