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

Laravel API注册Must Verify Email功能验证异常求助

问题排查与解决方案

看起来你遇到的问题是Laravel默认的verified中间件不兼容API的Passport认证——默认的verified中间件是为web会话设计的,它依赖Session来获取当前用户,而API使用的是无状态的Passport Token认证,导致中间件无法正确识别已验证邮箱的用户。

下面是具体的解决步骤:

1. 创建API专属的邮箱验证中间件

首先生成一个自定义中间件,专门处理API场景下的邮箱验证检查:

php artisan make:middleware EnsureApiEmailIsVerified

打开生成的app/Http/Middleware/EnsureApiEmailIsVerified.php,替换handle方法的内容:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Contracts\Auth\MustVerifyEmail;

class EnsureApiEmailIsVerified
{
    public function handle($request, Closure $next)
    {
        // 检查当前请求是否有已认证的用户,且用户实现了MustVerifyEmail接口
        if (! $request->user() ||
            ($request->user() instanceof MustVerifyEmail &&
            ! $request->user()->hasVerifiedEmail())) {
            return response()->json([
                'message' => 'Your email address is not verified.'
            ], 403);
        }

        return $next($request);
    }
}

2. 注册自定义中间件

打开app/Http/Kernel.php,在$routeMiddleware数组中添加自定义中间件的别名:

protected $routeMiddleware = [
    // ... 其他中间件
    'api.verified' => \App\Http\Middleware\EnsureApiEmailIsVerified::class,
];

3. 在API路由中使用自定义中间件

把原来路由中的middleware('verified')替换成我们刚注册的api.verified:

// 示例:受保护的API路由
Route::get('/user/profile', [UserController::class, 'showProfile'])
    ->middleware('auth:api', 'api.verified');

额外检查点

  1. 确保你的API路由使用的是auth:api中间件(Passport的认证中间件),这样$request->user()才能正确获取到Token对应的用户。
  2. 确认用户的email_verified_at字段确实已经被更新为非null值(你已经提到这部分正常,这一步可以快速核对)。

这个方案的核心是绕过了默认中间件对Session的依赖,直接通过$request->user()获取Token认证的用户,然后检查邮箱验证状态,完全适配API的无状态场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:59:42