Maison  >  Article  >  développement back-end  >  Comment envoyer un e-mail pour l'authentification des utilisateurs en PHP

Comment envoyer un e-mail pour l'authentification des utilisateurs en PHP

*文
*文original
2017-12-23 13:32:174837parcourir

Parfois, les sites Web doivent utiliser la vérification des e-mails pour empêcher les utilisateurs de s'enregistrer, de vérifier leur identité et d'autres opérations malveillantes. Mais comment utiliser le backend PHP pour envoyer des e-mails de vérification ? Cet article utilise un ensemble d'exemples d'enregistrement pour expliquer comment PHP envoie des e-mails.

L'une des vérifications de sécurité les plus courantes lors de l'enregistrement des utilisateurs est la vérification des e-mails. Selon la pratique générale de l'industrie, la vérification des e-mails est une pratique très importante pour éviter les risques de sécurité potentiels. Discutons maintenant de ces meilleures pratiques et voyons comment créer une vérification des e-mails en PHP.

Commençons par un formulaire d'inscription :

<form method="post" action="http://mydomain.com/registration/">
    <fieldset>
        <label for="fname">First Name:</label>
        <input type="text" name="fname" required />
    </fieldset>
    <fieldset>
        <label for="lname">Last Name:</label>
        <input type="text" name="lname" required />
    </fieldset>
    <fieldset>
        <label for="email">Last name:</label>
        <input type="email" name="email" required />
    </fieldset>
    <fieldset>
        <label for="password">Password:</label>
        <input type="password" name="password" required />
    </fieldset>
    <fieldset>
        <label for="cpassword">Confirm Password:</label>
        <input type="password" name="cpassword" required />
    </fieldset>
    <fieldset>
        <button type="submit">Register</button>
    </fieldset>
</form>


Vient ensuite la structure des tables de la base de données :

CREATE TABLE IF NOT EXISTS `user` (
    `id` INT(10) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    `fname` VARCHAR(255) ,
    `lname` VARCHAR(255) ,
    `email` VARCHAR(50) ,
    `password` VARCHAR(50) ,
    `is_active` INT(1) DEFAULT &#39;0&#39;,
    `verify_token` VARCHAR(255) ,
    `created_at` TIMESTAMP,
    `updated_at` TIMESTAMP,
);


Une fois ce formulaire soumis, nous devons valider la saisie de l'utilisateur et créer un nouvel utilisateur :

// Validation rules
$rules = array(
    &#39;fname&#39; => &#39;required|max:255&#39;,
    &#39;lname&#39; => &#39;required|max:255&#39;,
    &#39;email&#39; => &#39;required&#39;,
    &#39;password&#39; => &#39;required|min:6|max:20&#39;,
    &#39;cpassword&#39; => &#39;same:password&#39;
);
$validator = Validator::make(Input::all(), $rules);
// If input not valid, go back to registration page
if($validator->fails()) {
    return Redirect::to(&#39;registration&#39;)->with(&#39;error&#39;, $validator->messages()->first())->withInput();
}
$user = new User();
$user->fname = Input::get(&#39;fname&#39;);
$user->lname = Input::get(&#39;lname&#39;);
$user->password = Input::get(&#39;password&#39;);
// You will generate the verification code here and save it to the database
// Save user to the database
if(!$user->save()) {
    // If unable to write to database for any reason, show the error
    return Redirect::to(&#39;registration&#39;)->with(&#39;error&#39;, &#39;Unable to write to database at this time. Please try again later.&#39;)->withInput();
}
// User is created and saved to database
// Verification e-mail will be sent here
// Go back to registration page and show the success message
return Redirect::to(&#39;registration&#39;)->with(&#39;success&#39;, &#39;You have successfully created an account. The verification link has been sent to e-mail address you have provided. Please click on that link to activate your account.&#39;);

Après l'inscription, le compte de l'utilisateur reste invalide jusqu'à ce que l'utilisateur envoie un e-mail est vérifiée. Cette fonctionnalité confirme que l'utilisateur est le propriétaire de l'adresse e-mail saisie et aide à prévenir le spam, l'utilisation non autorisée du courrier électronique et la divulgation d'informations.

L'ensemble du processus est très simple : lorsqu'un nouvel utilisateur est créé, un e-mail contenant un lien de vérification sera envoyé à l'adresse e-mail renseignée par l'utilisateur lors du processus d'inscription. Avant que l'utilisateur ne clique sur le lien de vérification de l'e-mail et ne confirme l'adresse e-mail, l'utilisateur ne peut pas se connecter et utiliser l'application du site Web.

Il y a plusieurs choses à noter concernant les liens vérifiés. Le lien vérifié doit contenir un jeton généré aléatoirement, suffisamment long et valable uniquement pendant une certaine période de temps. Ceci est effectué pour empêcher les attaques de réseau. Dans le même temps, la vérification des e-mails doit également inclure l'identifiant unique de l'utilisateur, afin d'éviter les dangers potentiels d'attaque de plusieurs utilisateurs.

Voyons maintenant comment générer un lien de vérification en pratique :

// We will generate a random 32 alphanumeric string
// It is almost impossible to brute-force this key space
$code = str_random(32);
$user->confirmation_code = $code;


Une fois cette vérification créée, stockez-la dans la base de données, envoyée au utilisateur :

Mail::send(&#39;emails.email-confirmation&#39;, array(&#39;code&#39; => $code, &#39;id&#39; => $user->id), function($message)
{
$message->from(&#39;my@domain.com&#39;, &#39;Mydomain.com&#39;)->to($user->email, $user->fname . &#39; &#39; . $user->lname)->subject(&#39;Mydomain.com: E-mail confirmation&#39;);
});


Contenu de la vérification de l'e-mail :

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8" />
    </head>
    <body>
        <p style="margin:0">
            Please confirm your e-mail address by clicking the following link:
            <a href="http://mydomain.com/verify?code=<?php echo $code; ?>&user=<?php echo $id; ?>"></a>
        </p>
    </body>
</html>


Maintenant, vérifions si cela fonctionne :

$user = User::where(&#39;id&#39;, &#39;=&#39;, Input::get(&#39;user&#39;))
            ->where(&#39;is_active&#39;, &#39;=&#39;, 0)
            ->where(&#39;verify_token&#39;, &#39;=&#39;, Input::get(&#39;code&#39;))
            ->where(&#39;created_at&#39;, &#39;>=&#39;, time() - (86400 * 2))
            ->first();
if($user) {
    $user->verify_token = null;
    $user->is_active = 1;
    if(!$user->save()) {
        // If unable to write to database for any reason, show the error
        return Redirect::to(&#39;verify&#39;)->with(&#39;error&#39;, &#39;Unable to connect to database at this time. Please try again later.&#39;);
    }
    // Show the success message
    return Redirect::to(&#39;verify&#39;)->with(&#39;success&#39;, &#39;You account is now active. Thank you.&#39;);
}
// Code not valid, show error message
return Redirect::to(&#39;verify&#39;)->with(&#39;error&#39;, &#39;Verification code not valid.&#39;);


Conclusion :

Le code présenté ci-dessus n'est qu'un exemple de tutoriel et n'a pas été suffisamment testé. Veuillez le tester avant de l'utiliser dans votre application Web. Le code ci-dessus est réalisé dans le framework Laravel, mais vous pouvez facilement le migrer vers d'autres frameworks PHP. Dans le même temps, le lien de vérification est valable 48 heures et expire ensuite. L'introduction d'une file d'attente de travail peut gérer les liens de vérification expirés en temps opportun.

Recommandations associées :

php code de vérification complet code php générer le code de vérification php code de vérification SMS code de vérification php code

Exemple de code de l'interface SMS php (mise en route)

Le contenu SMS de la passerelle SMS php ne peut pas avoir d'espaces, les SMS tutoriel passerelle SMS content_PHP

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn