Laravel 8邮箱验证点击链接报错Call to a member function getKey() on null
故障原因
报错核心原因是邮箱验证路由错误绑定了guest中间件。guest中间件仅允许未登录的游客访问路由,游客状态下请求上下文里没有绑定登录用户信息,$this->user()直接返回null,调用getKey()自然会触发null值调用成员方法的错误。
Laravel原生邮箱验证的授权逻辑,是从当前登录会话中取出用户,和路由传入的id、hash参数做一致性校验,绑定guest中间件完全不符合该功能的运行要求。
修复方案
- 修正路由中间件配置
打开路由配置文件,将验证路由的guest中间件替换为官方默认的中间件组合,修改后的代码如下:
Route::get('/verify-email/{id}/{hash}', [VerifyEmailController::class, '__invoke']) ->middleware(['auth', 'signed', 'throttle:6,1']) ->name('verification.verify');
三个中间件的作用分别是:
auth:强制要求访问路由的用户处于已登录状态,保证$this->user()可以返回有效的用户实例signed:校验验证链接的签名合法性,防止链接参数被恶意篡改throttle:6,1:接口限流,单IP1分钟内最多允许请求6次,避免恶意刷接口
注意:不要直接修改
vendor目录下的框架原生EmailVerificationRequest.php文件,否则后续执行Composer依赖更新时自定义代码会被直接覆盖。
- 特殊场景适配(可选)
如果你需要支持用户未登录时点击邮件链接也能完成验证,不要使用guest中间件,需要自行重写验证请求类的authorize方法:先通过路由参数中的id查询对应用户实例,再做id和hash的比对,验证完成后手动登录对应用户再做跳转。该场景需要额外处理异常跳转、签名校验失效的提示逻辑,无特殊需求直接使用默认配置即可。
内容的提问来源于stack exchange,提问作者Colin
相关产品推荐
相关产品推荐

