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

Laravel Jetstream(Inertia栈)登录时Google reCAPTCHA v3验证失败求助

Laravel Jetstream(Inertia栈)登录时Google reCAPTCHA v3验证失败求助

环境信息

  • Jetstream Version 4.0
  • Jetstream Stack: Inertia
  • Laravel Version 10.10
  • PHP Version 8.1

问题描述

我正在给Jetstream的登录功能集成Google reCAPTCHA v3,但一直卡在验证失败的问题上。排查后发现,Inertia搭配Jetstream的登录流程会发送两次请求,导致Google拒绝了验证请求。

我在Fortify的authenticateUsing闭包里做了reCAPTCHA验证逻辑,日志里明明显示Google返回了success: true的响应,但代码还是会抛出“ReCAPTCHA verification failed. Please try again.”的验证异常。我尝试在前端的Inertia请求里加上preserveScroll: true和preserveState: true,但问题依旧没有解决。

后端Fortify配置代码

Fortify::authenticateUsing(function (Request $request) {
    $recaptchaResponse = Http::asForm()->post('https://www.google.com/recaptcha/api/siteverify', [
        'secret' => env('RECAPTCHA_SECRET_KEY'),
        'response' => $request->input('recaptcha_token'),
    ])->json();

    // 调试日志
    Log::info('Recaptcha Response:', $recaptchaResponse);

    if (!(isset($recaptchaResponse['success']) && $recaptchaResponse['success'] == true)) {
        throw ValidationException::withMessages([
            'email' => ['ReCAPTCHA verification failed. Please try again.'],
        ]);
    }
});

前端Vue/Inertia代码

登录提交函数

const submit = () => {
    grecaptcha.ready(() => {
        grecaptcha.execute('GOOGLE_RECAPTCHA_TOKEN', { action: 'login' }).then((token) => {
            form.recaptcha_token = token
            form
                .transform((data) => ({
                    ...data,
                    remember: form.remember ? 'on' : '',
                }))
                .post(route('login'), {
                    preserveScroll: true,
                    preserveState: true,
                    onFinish: () => form.reset('password'),
                })
        })
    })
}

登录表单组件

<form @submit.prevent="submit">
    <div class="mb-3">
        <InputLabel for="email" value="Email or Mobile" />
        <TextInput id="email" v-model="form.email" type="text" class="form-control" autofocus placeholder="Please enter email or mobile" required :class="{ 'is-invalid': form.errors.email }" />
        <InputError :message="form.errors.email" />
    </div>

    <div class="mb-3">
        <div class="float-end">
            <Link v-if="canResetPassword" :href="route('password.request')" class="text-muted">Forgot password?</Link>
        </div>
        <InputLabel for="password" value="Password" />
        <div class="position-relative auth-pass-inputgroup mb-3">
            <input :type="togglePassword ? 'text' : 'password'" class="form-control pe-5" placeholder="Enter password" id="password-input" v-model="form.password" autocomplete="password" required :class="{ 'is-invalid': form.errors.password }" />
            <BButton variant="link" class="position-absolute end-0 top-0 text-decoration-none text-muted" type="button" id="password-addon" @click="togglePassword = !togglePassword">
                <i class="ri-eye-fill align-middle"></i>
            </BButton>
            <InputError :message="form.errors.password" />
        </div>
    </div>

    <div class="form-check">
        <Checkbox v-model:checked="form.remember" name="remember" class="form-check-input" id="auth-remember-check" />
        <label class="form-check-label" for="auth-remember-check">Remember me</label>
    </div>

    <div class="mt-4">
        <BButton variant="success" class="w-100" type="submit" :disabled="form.processing">Sign In</BButton>
        <InputError :message="form.errors.recaptcha_token" />
    </div>
</form>

有没有大佬遇到过类似的问题?麻烦帮忙看看哪里出问题了,万分感谢!

内容来源于stack exchange

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.08 03:08:44