Laravel 8.7 认证邮件必须登录,如何绕过这个限制?

1. 运行环境

1). 当前使用的 Laravel 版本?

8.7

2). 当前使用的 php/php-fpm 版本?

PHP 版本:7.3

php-fpm 版本:

3). 当前系统

CentOS 7

4). 业务环境

开发环境

5). 相关软件版本

Nginx

2. 问题描述?

Route::get('/email/verify/{id}/{hash}', function (EmailVerificationRequest $request) {
    $request->fulfill();

    return redirect('/home');
})->middleware(['auth', 'signed'])->name('verification.verify');

利用了官方的邮件认证链接,中间件要求必须登录以后才能实现邮箱的认证,如何才能绕过这个中间件登录的要求。如果直接去掉 ‘auth’ 这个认证链接会报错。

3. 您期望得到的结果?

实现点击激活链接,直接激活邮件,而不是需要登录以后才能激活邮件地址。登录场景和查看邮箱的场景不在一个浏览器里面。当然不希望重新方法啥的,如何简单高效的实现呢?

4. 您实际得到的结果?

附言 1  ·  2年前

没有修改验证码的url 把验证url规则重写了一下

去掉了
if (! hash_equals((string) $this->route('id'),
(string) $this->user()->getKey())) {
return false;
}

《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
最佳答案
  1. 修改包含签名的验证 URL

app/Providers/AppServiceProvider.php (或者其他你想用的 provider

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

public function boot()
{
    VerifyEmail::createUrlUsing(function ($notifiable) {
        // 这里返回你自己想要生成的 URL
        // 自带生成的 URL 就是需要用户信息去验证
        // 详见 VerifyEmail 的 verificationUrl 方法
        return $url;
    });

    // 自定义邮件可使用这个,具体参考文档(只改 URL 可以不写这个)
    VerifyEmail::toMailUsing(function ($notifiable, $url) {
        return (new MailMessage)
            ->subject('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
  1. 修改验证方法

自定义 EmailVerificationRequest 继承自带的这个类

<?php

namespace App\Request;

use Illuminate\Foundation\Auth\EmailVerificationRequest as FormRequest;

class EmailVerificationRequest extends FormRequest
{
    /**
     * @inheritdoc 
     */
    public function authorize()
    {
        // 这里写你自己的验证方式,返回布尔值,参考父类
        return true;
        // or
        return false;
    }
}
2年前 评论
讨论数量: 10

去掉 auth 后看看它具体是哪里用到的了于登录的数据,然后改一下。

2年前 评论
lxy9500 (楼主) 2年前
Su (作者) 2年前
lxy9500 (楼主) 2年前
自由与温暖是遥不可及的梦想

路由 放在外面就好了

放在授权中间件的外面

2年前 评论
  1. 修改包含签名的验证 URL

app/Providers/AppServiceProvider.php (或者其他你想用的 provider

use Illuminate\Auth\Notifications\VerifyEmail;
use Illuminate\Notifications\Messages\MailMessage;

public function boot()
{
    VerifyEmail::createUrlUsing(function ($notifiable) {
        // 这里返回你自己想要生成的 URL
        // 自带生成的 URL 就是需要用户信息去验证
        // 详见 VerifyEmail 的 verificationUrl 方法
        return $url;
    });

    // 自定义邮件可使用这个,具体参考文档(只改 URL 可以不写这个)
    VerifyEmail::toMailUsing(function ($notifiable, $url) {
        return (new MailMessage)
            ->subject('Verify Email Address')
            ->line('Click the button below to verify your email address.')
            ->action('Verify Email Address', $url);
    });
  1. 修改验证方法

自定义 EmailVerificationRequest 继承自带的这个类

<?php

namespace App\Request;

use Illuminate\Foundation\Auth\EmailVerificationRequest as FormRequest;

class EmailVerificationRequest extends FormRequest
{
    /**
     * @inheritdoc 
     */
    public function authorize()
    {
        // 这里写你自己的验证方式,返回布尔值,参考父类
        return true;
        // or
        return false;
    }
}
2年前 评论
GDDD

没用过,但是正常来说,应该是在登陆状态下验证邮箱的吧,除非你这两个参数能验证用户。

2年前 评论

你确定要这样改?拿 id 把你用户全验证了。。

2年前 评论
lxy9500 (楼主) 2年前
lddtime (作者) 2年前

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!