alya_alsiyabi's avatar

Token to Verify Email

I am working in email verification I sent an email, the link in email is defined by token value . now when I want to verify mail by the use of token it is not working because token stored in database is different from token in the link although everything is the same .

the controller of sending mail and storing token in user table:

          protected function create(array $data){
                            $con=
                            ($data['con_id']);
                        
                    if($con==4){
                        $remember_token=Str::random(64);
                            $user = User::create([
                                'name' => $data['name'],
                                'email' => $data['email'],
                                'con_id' =>1,
                                'password' => Hash::make($data['password']),
                                'remember_token' =>$remember_token,
                            ]);
                    Mail::send('emails.email', ['remember_token'=>$remember_token], function($message) use($data){
                    
                                $message->to($data['email']);
                                $message->subject('Email Verification Mail'); 
                            
                            });       
                        }
                            elseif($con==9){
                                $remember_token = Str::random(64);
                                $user = User::create([
                                'name' => $data['name'],
                                'email' => $data['email'],
                                'con_id' =>2,
                                'password' => Hash::make($data['password']),
                                'remember_token' => $remember_token
                                ]);
                            Mail::send('emails.email', ['remember_token'=> $remember_token], function($message) use($data){
                                    $message->to($data['email']);
                                
                                    $message->subject('Email Verification Mail');     });  
                            }
                    else{
                        $remember_token = Str::random(64);

                        $user = User::create([
                            'name' => $data['name'],
                            'email' => $data['email'],
                            'con_id' => $data['con_id'],
                            'password' => Hash::make($data['password']),
                            'remember_token' => $remember_token

                        ]);

                        Mail::send('emails.email', ['remember_token' => $remember_token], function($message) use($data){
                            
                            $message->to($data['email']);
                            $message->subject('Email Verification Mail'); 
                        
                    });  
                
                    }
        
        
                if($user->con_id==2){
                $user->syncRoles([3]);
        
        }
        elseif($user->con_id==1)
                $user->syncRoles([4]);
                
                return $user;    
        
        

    

route in email :

  Route::get('account/verify/{remember_token}', [ConsultController::class, 'verifyAccount'])->name('verify'); 

ConsultController =>verifyAccount funcation

public function verifyAccount($remember_token)
{ 
  //  dd($remember_token);

    $verifyUser = User::where('remember_token', $remember_token)->first();

    $message = 'Sorry your email cannot be identified' ;
//   dd($verifyUser);
    if(!is_null($verifyUser) ){
        $user = $verifyUser->user;
        //   dd($user );
          if($verifyUser->email_verified_at==null)         {
            $verifyUser->email_verified_at = now();
            // $verifyUser->user->is_email_verified = 1;
            // dd($unput);

      $verifyUser->save();

            $message = "Thank you for activating your email, please start using our portal services.";
        } else {
            $message = "Your e-mail is already verified.";
        }
    }

  return view('auth.login')->with('success', $message);
}
0 likes
9 replies
lat4732's avatar

What do you mean by

it is not working

What is not working? What error are you receiving?

alya_alsiyabi's avatar

@Laralex The email is not verifying, verifyUser value =null because $remember_token is not there in the database

lat4732's avatar

@alya_alsiyabi What a good explanation. When you create the user in the database with

$remember_token = Str::random(64);
$user = User::create([
      'name' => $data['name'],
      'email' => $data['email'],
      'con_id' => 1,
     'password' => Hash::make($data['password']),
     'remember_token' => $remember_token,
]);

is remember_token saved in the database?

alya_alsiyabi's avatar

@Laralex yes sir it is saved in database under remember_token col but when I use this

        Mail::send('emails.email', ['remember_token'=>$remember_token], function($message) use($data){
                
                                        $message->to($data['email']);
                                        $message->subject('Email Verification Mail'); 

its value changing to random values, although this code is not saving code or?

lat4732's avatar

@alya_alsiyabi You are using $remember_token = Str::random(64); inside every condition of your if. Move it above the conditions so you can make sure it is always the same.

$remember_token = Str::random(64);
if(....) {
       // .....
} elseif(....) {
       // .....
} elseif(....) {
       // .....
} else {
       // .....
}
alya_alsiyabi's avatar

@Laralex I did still sir > the same logic error also I used just 2 instead of 64 > it is 2 in email and dd($remember_token); but in database it is 64

alya_alsiyabi's avatar

@frankielee

sir do you mean from email

account/verify/{remember_token}

the remmber _token is the one that is saved first not the one in the database >and this is the main problem sir

frankielee's avatar

@alya_alsiyabi

don't use the remember_token. The value will be changed everytime the user logged out or login

You can check the codes from Laravel

    /**
     * Get the verification URL for the given notifiable.
     *
     * @param  mixed  $notifiable
     * @return string
     */
    protected function verificationUrl($notifiable)
    {
        if (static::$createUrlCallback) {
            return call_user_func(static::$createUrlCallback, $notifiable);
        }

        return URL::temporarySignedRoute(
            'verification.verify',
            Carbon::now()->addMinutes(Config::get('auth.verification.expire', 60)),
            [
                'id' => $notifiable->getKey(),
                'hash' => sha1($notifiable->getEmailForVerification()),
            ]
        );
    }

Please or to participate in this conversation.