web-dev-qa-db-fra.com

Comment vérifier un e-mail sans demander à l'utilisateur de se connecter à Laravel

Je développe une application Laravel. Mon application utilise Laravel fonction d'authentification intégrée. Dans l'authentification Laravel quand un utilisateur s'inscrit, un e-mail de vérification est envoyé. Lorsqu'un utilisateur vérifie l'e-mail, cliquez sur le lien à l'intérieur de l'e-mail, l'utilisateur doit se reconnecter pour confirmer l'e-mail s'il n'est pas déjà connecté.

VerificationController

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

J'ai essayé de commenter cette ligne.

$this->middleware('auth');

Mais cela ne fonctionne pas et, à la place, génère une erreur. Comment puis-je activer Laravel pour pouvoir vérifier les e-mails même si l'utilisateur n'est pas connecté?

9
Wai Yan Hein

Tout d'abord, supprimez la ligne $this->middleware('auth');, comme vous l'avez fait.

Ensuite, copiez la méthode verify du trait VerifiesEmails dans votre VerificationController et modifiez-la un peu. La méthode devrait ressembler à ceci:

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

    if (!hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
        throw new AuthorizationException;
    }

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

    return redirect($this->redirectPath())->with('verified', true);
}

Cela remplace la méthode dans le trait VerifiesUsers et supprime la vérification d'autorisation.

Sécurité (corrigez-moi si je me trompe!)

Il est toujours sécurisé, car la demande est signée et vérifiée. Quelqu'un pourrait vérifier l'adresse e-mail d'un autre utilisateur s'il accède en quelque sorte à l'e-mail de vérification, mais dans 99% des cas, ce n'est guère un risque.

7
Wouter Florijn
// For Laravel 6 and Above 
use Illuminate\Auth\Events\Verified; 
use Illuminate\Http\Request; 
use App\User;

// comment auth middleware
//$this->middleware('auth');

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

    if (!hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
        throw new AuthorizationException;
    }

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

    return redirect($this->redirectPath())->with('verified', true);
}
0
Abid Shah

si vous souhaitez activer un compte utilisateur sans connexion, vous pouvez le faire en 2 étapes

1- Supprimer ou commenter le middleware Auth dans VerificationController

Exemple ci-dessous:

public function __construct()
{
    //$this->middleware('auth');
    $this->middleware('signed')->only('verify');
    $this->middleware('throttle:6,1')->only('verify', 'resend');
}

2- depuis vérifier l'itinéraire en passant le {id}, vous pouvez simplement modifier la fonction de vérification pour trouver l'utilisateur par la demande d'identifiant d'itinéraire comme le code ci-dessous:

chemin du fichier: *:\yourproject\vendor\laravel\framework\src\Illuminate\Foundation\Auth\VerifiesEmails.php

$user = User::findOrfail($request->route('id'));

Exemple complet

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

    if (! hash_equals((string) $request->route('id'), (string) $user->getKey())) {
        throw new AuthorizationException;
    }

    if (! hash_equals((string) $request->route('hash'), sha1($user->getEmailForVerification()))) {
        throw new AuthorizationException;
    }

    if ($user->hasVerifiedEmail()) {
        return redirect($this->redirectPath())->with('verified', true);
    }

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

    return redirect($this->redirectPath())->with('registered', true);
}
0
Surf Junky