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é?
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.
// 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);
}
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);
}