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');
额外检查点
- 确保你的API路由使用的是
auth:api中间件(Passport的认证中间件),这样$request->user()才能正确获取到Token对应的用户。 - 确认用户的
email_verified_at字段确实已经被更新为非null值(你已经提到这部分正常,这一步可以快速核对)。
这个方案的核心是绕过了默认中间件对Session的依赖,直接通过$request->user()获取Token认证的用户,然后检查邮箱验证状态,完全适配API的无状态场景。
内容的提问来源于stack exchange,提问作者Leona
相关产品推荐
相关产品推荐

