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

时间:2018-03-24 22:21:08

标签: php laravel authentication

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

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

2 个答案:

答案 0 :(得分:2)

我建议您在确认链接中包含电子邮件,即。确认应为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建议确保此方法不会触及任何身份验证中间件,因为用户尚未登录。

答案 1 :(得分:0)

你只需要两件事:

  1. 请勿在{{1​​}}操作代码中检查身份验证。
  2. 在包含emailConfirmation操作的控制器中,使用emailConfirmation进行constructoremailConfirmation之外的身份验证,如下所示:
  3. public function __construct() {       
            $this->middleware(['auth'])->except('emailConfirmation');
      }