Laravel 5.8:电子邮件验证链接导致403错误

时间:2019-08-30 15:05:27

标签: php laravel

我通常使用的是最新版本的Laravel,并尝试通过电子邮件验证实施身份验证。但是,我在用户注册后收到的电子邮件中的链接导致403错误页面。链接似乎正确。

我正在与Homestead和Vagrant一​​起在'localhost'工作。 注册用户正在工作,在功能结束时得到了创建的用户,并且数据库已填充完毕。

我不得不编辑RegisterController创建方法,因为没有发送邮件。

首先,当单击链接时,我只有空白页。经过一番阅读后,我了解到该用户需要先经过身份验证才能被验证,并且注册用户后我的RegisterController尚未对他进行身份验证。 创建用户后,我添加了一些代码来对用户进行身份验证。 现在,当单击链接时,出现403错误页面。

注意:我的表不是默认表,其中包含email_verified_at字段。

这是我在RegisterController内的create方法:

protected function create(Request $request)
    {
        //Create user in database
        $user = User::create([
            'Username' => $request['pc2f448466c4bad46f466f025e6cf88f9'],
            'email' => $request['p07d5d4eb055cc69dbba790bb9d39a3dc'],
            'Password' => md5($request['pb80ee032d334d60f5bc555af500fcf87']),
            'SecretQuestion' => $request['secret_question'],
            'SecretAnswer' => $request['secret_answer'],
            'Nickname' => $request['p9c969905e63e2824c45b8712e6d29585']
        ]);

        $user->sendEmailVerificationNotification();


        Auth::login($user);
    }

这是我的VerificationController:

<?php

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
use Illuminate\Foundation\Auth\VerifiesEmails;

class VerificationController extends Controller
{
    /*
    |--------------------------------------------------------------------------
    | Email Verification Controller
    |--------------------------------------------------------------------------
    |
    | This controller is responsible for handling email verification for any
    | user that recently registered with the application. Emails may also
    | be re-sent if the user didn't receive the original email message.
    |
    */

    use VerifiesEmails;

    /**
     * Where to redirect users after verification.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('signed')->only('verify');
        $this->middleware('throttle:6,1')->only('verify', 'resend');
    }

    protected function redirectTo()
    {
        return route('home');
    }
}

我尝试在TrustProxies中间件中设置protected $proxies = '*';

.env文件中的我的应用程序常量:

APP_NAME=Furya
APP_ENV=local
APP_KEY=base64:xxxxxxxxxxxxxxxxxxxx
APP_DEBUG=true
APP_URL=http://localhost

在我的网络路由文件中,我的第一个路由是:

Auth::routes(['verify' => true]);

Route::get('/', function () {
    return view('main/home');
})->name('home');

使用php artisan route:list时,我看到了Auth::routes(['verify' => true]);路由正确的中间件。

在我的用户表(MySQL)中,字段email_verified_at具有日期时间类型。

在应用程序配置中,我的应用程序URL设置如下:

'url' => env('APP_URL', 'http://sunshine.local'),

'asset_url' => env('ASSET_URL', null),

我实际收到的链接如下:http://sunshine.local/email/verify/177?expires=1567179404&signature=0a81e1370934c95282975c9fb7cfa379fd1945814e45894ffec5728e04ad4f7a

我不知道发生了什么,可惜直到现在互联网上都找不到解决方案。

谢谢您的帮助。

4 个答案:

答案 0 :(得分:0)

web.php文件中发出HTTP Web请求时,只能通过命名路由'/'访问应用程序根URL route('home'),该路由将返回自定义视图。

因此,像这样在redirectTo()中包含一个VerificationController.php方法

namespace App\Http\Controllers\Auth;

use App\Http\Controllers\Controller;
// other imports

class VerificationController extends Controller
{
    use VerifiesEmails;

    /**
     * Where to redirect users after verification.
     *
     * @var string
     */
    protected $redirectTo = '/';

    /**
     * Create a new controller instance.
     *
     * @return void
     */
    public function __construct()
    {
        $this->middleware('auth');
        $this->middleware('signed')->only('verify');
        $this->middleware('throttle:6,1')->only('verify', 'resend');
    }

    protected function redirectTo()
    {
        return route('home');
    }
}

现在,您应该在验证电子邮件后将您重定向到有效路由。

答案 1 :(得分:0)

Auth::routes(['verify' => true]);`

我注意到您的路线上有一个回声。在验证路线半冒号之后。尝试删除它,看看会发生什么

答案 2 :(得分:0)

这是由于有关users表中字段名称的问题。

参见我的其他帖子以获取答案:Laravel 5.8 : Remember me token not being saved in database

答案 3 :(得分:0)

有同样的问题; 在您的.env中签入您的

APP_URL=http://...

是正确的并且匹配。