如何在不要求用户登录Laravel的情况下验证电子邮件

Wai*_*ein 6 laravel laravel-controller laravel-authentication

我正在开发Laravel应用程序。我的应用程序使用Laravel内置的身份验证功能。当用户注册时,在Laravel身份验证中,将发送验证电子邮件。当用户验证电子邮件时,请单击电子邮件中的链接,如果用户尚未登录,则该用户必须再次登录以确认电子邮件。

验证控制器

class VerificationController extends Controller
{
    use VerifiesEmails, RedirectsUsersBasedOnRoles;

    /**
     * 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');
    }

    public function redirectPath()
    {
        return $this->getRedirectTo(Auth::guard()->user());
    }
}
Run Code Online (Sandbox Code Playgroud)

我尝试在此行发表评论。

$this->middleware('auth');
Run Code Online (Sandbox Code Playgroud)

但这不起作用,而是抛出一个错误。即使用户未登录,如何使Laravel能够验证电子邮件?

Wou*_*ijn 7

首先,$this->middleware('auth');像您一样删除该行。

接下来,将verify方法从VerifiesEmails特征复制到您的特征VerificationController并进行一些更改。该方法应如下所示:

public function verify(Request $request)
{
    $user = User::find($request->route('id'));

    if ($user->markEmailAsVerified())
        event(new Verified($user));

    return redirect($this->redirectPath())->with('verified', true);
}
Run Code Online (Sandbox Code Playgroud)

这将覆盖特征中的方法VerifiesUsers并删除授权检查。

安全性(如果我输入错误,请纠正我!)

由于请求已签名并验证,因此它仍然是安全的。如果某人可以某种方式访问​​验证电子邮件,则可以验证另一个用户的电子邮件地址,但是在99%的情况下,这根本没有风险。


Mar*_*tin 6

这是针对该问题的更面向未来的解决方案:

\n\n
class VerificationController extends Controller\n{\n\n    // \xe2\x80\xa6\n\n    use VerifiesEmails {\n        verify as originalVerify;\n    }\n\n    /**\n     * Create a new controller instance.\n     *\n     * @return void\n     */\n    public function __construct()\n    {\n        $this->middleware(\'auth\'); // DON\'T REMOVE THIS\n        $this->middleware(\'signed\')->only(\'verify\');\n        $this->middleware(\'throttle:6,1\')->only(\'verify\', \'resend\');\n    }\n\n    /**\n     * Mark the authenticated user\'s email address as verified.\n     *\n     * @param Request $request\n     * @return Response\n     *\n     * @throws AuthorizationException\n     */\n    public function verify(Request $request)\n    {\n        $request->setUserResolver(function () use ($request) {\n            return User::findOrFail($request->route(\'id\'));\n        });\n        return $this->originalVerify($request);\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,当未经身份验证的用户单击电子邮件确认链接时,将会发生以下情况:

\n\n
    \n
  1. 用户将被重定向到登录视图1
  2. \n
  3. 用户输入凭据;登录成功2
  4. \n
  5. 用户将被重定向回电子邮件确认 URL
  6. \n
  7. 电子邮件将被标记为已确认
  8. \n
\n\n
\n\n

1此时电子邮件不会被标记为已确认。

\n\n

2用户可能多次输入错误的凭据。一旦他输入正确的凭据,他就会被重定向到预期的电子邮件确认 URL。

\n