Laravel,无需登录即可确认邮件

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Laravel,无需登录即可确认邮件相关的知识,希望对你有一定的参考价值。

我们有以下问题:我们成功注册后发送给所有用户邮件确认邮件。但是当他们试图点击它时,他们需要登录。我们希望用户不需要登录。我们的守则需要做哪种调整?

public function emailConfirmation()
{

    $token = request('token');
    if(Auth::check())
    {
        $checkToken = User::where('email','=',Auth::user()->email)
                      ->where('confirm_token','=',$token)->first();
        if($checkToken)
        {
            $updatestatus = User::where('email','=',Auth::user()->email)->update(['is_mail_confirmation' => '1']);
            $status = true;
            $messages = trans('profile.thankyou_message_confirm_mail');
        }    
        else
        {
            $status = false;
            $messages = trans('profile.token_not_match');
        }


    }
    else
    {
        $status = false;
        $messages = trans('profile.without_login_message_confirm_mail');
    }
    return view('main.confirm',compact('status','messages'));
}
答案

我建议你在确认链接中包含电子邮件,即。确认应该是example.com/confirm?token=PR1234&email=abc@gmail.com

但如果你token总是独一无二的,那就没有必要了,所以你可以忽略电子邮件检查。

 $token = request('token');
 $email = request('email');

//if(Auth::check())
//{
    $checkToken = User::where('email','=', $email)
                  ->where('confirm_token','=',$token)->first();
    if($checkToken)
    {
        $updatestatus = User::where('email','=', $email)->update(['is_mail_confirmation' => '1']);
        $status = true;
        $messages = trans('profile.thankyou_message_confirm_mail');
    }    
    else
    {
        $status = false;
        $messages = trans('profile.token_not_match');
    }


//}
//else
//{
    //$status = false;
    //$messages = trans('profile.without_login_message_confirm_mail');
//}

如果您碰巧支持不常见的符号,请注意! #$%* + - 在您的系统中,在将电子邮件添加到确认链接之前,请不要忘记urlencode()。

另外,@ Tarek建议确保此方法不会触及任何auth中间件,因为用户未登录。

另一答案

你只需要两件事:

  1. 请勿在emailConfirmation操作代码中检查身份验证。
  2. 在包含emailConfirmation动作的控制器中创建一个constructor,除了emailConfirmation之外,您将通过身份验证,如下所示:

.

public function __construct() {       
        $this->middleware(['auth'])->except('emailConfirmation');
  }

以上是关于Laravel,无需登录即可确认邮件的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 8:我如何在注册后验证用户的电子邮件地址而无需提供登录信息?

Laravel 验证登录表单验证在密码确认中失败?

如何将确认邮件发送到Laravel中的新电子邮件地址?

Laravel Inertia (Vue) - 无需重定向即可进行身份验证

Firebase无需登录即可创建用户[重复]

我如何使用 jwt 为多个项目 laravel angular 使用 1 个登录