<divclass="col-main cell cell--auto"><!-- start custom main top snippet --><divid="results-container"class="search-result js-search-result"></div><!-- end custom main top snippet -->
<li><ahref="http://php.net/manual/en/book.curl.php">cURL</a> en utilisant le <codeclass="language-plaintext highlighter-rouge">QRServerProvider</code> (par défaut), <codeclass="language-plaintext highlighter-rouge">ImageChartsQRCodeProvider</code> ou <codeclass="language-plaintext highlighter-rouge">QRicketProvider</code> mais vous pouvez aussi fournir votre propre fournisseur de QR-code.</li>
<li><ahref="http://php.net/manual/en/function.random-bytes.php">random_bytes()</a>, <ahref="http://php.net/manual/en/book.mcrypt.php">MCrypt</a>, <ahref="http://php.net/manual/en/book.openssl.php">OpenSSL</a> ou <ahref="http://php.net/manual/en/book.hash.php">Hash</a> selon le RNG intégré que vous utilisez (TwoFactorAuth essaiera d’autodétecter et d’utiliser le meilleur disponible) ; cependant : n’hésitez pas à fournir votre propre (CS)RNG.</li>
</ul>
<p>En option, vous pouvez avoir besoin de :</p>
<ul>
<li><ahref="https://github.com/endroid/qr-code">endroid/qr-code</a> si vous utilisez <codeclass="language-plaintext highlighter-rouge">EndroidQrCodeProvider</code> ou <codeclass="language-plaintext highlighter-rouge">EndroidQrCodeWithLogoProvider</code>.</li>
<li><ahref="https://github.com/Bacon/BaconQrCode">bacon/bacon-qr-code</a> si vous utilisez <codeclass="language-plaintext highlighter-rouge">BaconQrCodeProvider</code>.</li>
<td>L’algorithme utilisé (un parmi <codeclass="language-plaintext highlighter-rouge">sha1</code>, <codeclass="language-plaintext highlighter-rouge">sha256</code>, <codeclass="language-plaintext highlighter-rouge">sha512</code>, <codeclass="language-plaintext highlighter-rouge">md5</code>)</td>
<td>Fournisseur de l’heure (plus sur ce sujet plus tard)</td>
</tr>
</tbody>
</table>
<p>Ces arguments sont tous ‘<codeclass="language-plaintext highlighter-rouge">write once</code>’ ; la classe utilisera ces valeurs, pour toute sa durée de vie, lors de la génération / du calcul des codes. Le nombre de chiffres, la période et l’algorithme sont tous définis en fonction des valeurs utilisées (et supportées) par l’application Authenticator de Google. Vous pouvez spécifier 8 chiffres, une période de 45 secondes et l’algorithme sha256, mais l’application d’authentification (qu’il s’agisse de l’application de Google, d’Authy ou d’une autre application) peut ou non prendre en charge ces valeurs. Votre expérience peut varier ; soyez prudent si vous ne contrôlez pas l’application utilisée par votre public.</p>
<h4id="étape-1--créer-une-clé-partagée-secrète">Étape 1 : Créer une clé partagée secrète</h4>
<p>Lorsqu’un utilisateur souhaite configurer l’authentification à deux facteurs (ou, plus correctement, l’authentification à plusieurs facteurs), vous devez créer un secret. Ce sera votre <strong>secret partagé</strong>. Ce secret devra être saisi par l’utilisateur dans son application. Cela peut être fait manuellement, auquel cas vous affichez simplement le secret et demandez à l’utilisateur de le saisir dans l’application :</p>
<p>La méthode <codeclass="language-plaintext highlighter-rouge">createSecret()</code> accepte deux arguments : <codeclass="language-plaintext highlighter-rouge">$bits</code> (par défaut : <codeclass="language-plaintext highlighter-rouge">80</code>) et <codeclass="language-plaintext highlighter-rouge">$requirecryptosecure</code> (par défaut : <codeclass="language-plaintext highlighter-rouge">true</code>). Le premier est le nombre de bits générés pour le secret partagé. Assurez-vous que cet argument est un multiple de 8 et, encore une fois, gardez à l’esprit que toutes les combinaisons ne sont pas forcément supportées par toutes les applications. L’authentificateur de Google semble satisfait avec 80 et 160, la valeur par défaut est 80 car c’est ce que la plupart des sites (que je connais) utilisent actuellement ; cependant une valeur de 160 ou plus est recommandée (voir <ahref="https://tools.ietf.org/html/rfc4226#section-4">RFC 4226 - Algorithm Requirements</a>). Ce dernier est utilisé pour s’assurer que le secret est cryptographiquement sécurisé ; si vous ne vous souciez pas beaucoup des secrets cryptographiquement sécurisés, vous pouvez spécifier <codeclass="language-plaintext highlighter-rouge">false</code> et utiliser un fournisseur de RNG <strong>non</strong>-cryptographiquement sécurisé.</p>
<divclass="language-php highlighter-rouge"><divclass="highlight"><preclass="highlight"><code>// Afficher le secret partagé
<spanclass="nt"><p></span>Veuillez entrer le code suivant dans votre application : '<spanclass="cp"><?php</span><spanclass="k">echo</span><spanclass="nv">$secret</span><spanclass="p">;</span><spanclass="cp">?></span>'<spanclass="nt"></p></span>
</code></pre></div></div>
<p>Une autre façon, plus conviviale, de faire entrer le secret partagé dans l’application consiste à générer un <ahref="http://en.wikipedia.org/wiki/QR_code">QR-code</a> qui peut être scanné par l’application.<br/>
Pour générer ces codes QR, vous pouvez utiliser l’une des classes intégrées <codeclass="language-plaintext highlighter-rouge">QRProvider</code> :</p>
<li><codeclass="language-plaintext highlighter-rouge">EndroidQrCodeProvider</code> (nécessite l’installation de <codeclass="language-plaintext highlighter-rouge">endroid/qr-code</code>)</li>
<li><codeclass="language-plaintext highlighter-rouge">EndroidQrCodeWithLogoProvider</code> (identique, mais supportant les images intégrées)</li>
<li><codeclass="language-plaintext highlighter-rouge">BaconQrCodeProvider</code> (nécessite l’installation de <codeclass="language-plaintext highlighter-rouge">bacon/bacon-qr-code</code>)</li>
</ol>
<p>…ou implémentez votre propre fournisseur. Pour implémenter votre propre fournisseur, tout ce que vous avez à faire est d’implémenter l’interface <codeclass="language-plaintext highlighter-rouge">IQRCodeProvider</code>.</p>
<p>Vous pouvez utiliser les fournisseurs intégrés mentionnés précédemment pour servir d’exemple ou lire le chapitre suivant de ce fichier. Les classes intégrées utilisent toutes une troisième partie (par exemple externe) (Image-charts, QRServer et QRicket) pour le travail difficile de génération de QR-codes (note : chacun de ces services pourrait à un moment donné ne pas être disponible ou imposer des limitations au nombre de codes générés par jour, heure, etc.)<br/>
Cependant, vous pouvez facilement utiliser un projet comme <ahref="http://phpqrcode.sourceforge.net/">PHP QR Code</a> (ou l’un des <ahref="https://packagist.org/search/?q=qr">nombreux autres</a>) pour générer vos QR-codes sans dépendre de sources externes. Plus tard, nous allons <ahref="#qr-code-providers">démontrer</a> comment faire cela.</p>
<p>Les fournisseurs intégrés ont tous des “ réglages “ spécifiques que vous pouvez “ appliquer “. Certains prennent en charge différentes couleurs, d’autres vous permettent de spécifier le format d’image souhaité, etc. Ce qu’ils ont tous en commun, c’est qu’ils renvoient un code QR sous la forme d’un blob binaire qui, à son tour, sera transformé en <ahref="http://en.wikipedia.org/wiki/Data_URI_scheme">URI de données</a> par la classe <codeclass="language-plaintext highlighter-rouge">TwoFactorAuth</code>. Cela vous permet d’afficher facilement l’image sans nécessiter d’allers-retours supplémentaires entre le navigateur et le serveur et vice-versa.</p>
<divclass="language-php highlighter-rouge"><divclass="highlight"><preclass="highlight"><code>// Afficher le code QR à l'utilisateur
<spanclass="nt"><p></span>Scannez l'image suivante avec votre application :<spanclass="nt"></p></span>
<p>Lors de la sortie d’un QR-code, vous pouvez choisir un <codeclass="language-plaintext highlighter-rouge">$label</code> pour l’utilisateur (qui, lors de la saisie manuelle d’un secret partagé, devra être choisi par l’utilisateur). Ce label peut être une chaîne vide ou <codeclass="language-plaintext highlighter-rouge">null</code>. On peut aussi spécifier une <codeclass="language-plaintext highlighter-rouge">$taille</code> (en pixels, largeur == hauteur) pour laquelle nous utilisons une valeur par défaut de <codeclass="language-plaintext highlighter-rouge">200</code>.</p>
<h4id="étape-2--vérification-du-secret-partagé">Étape 2 : Vérification du secret partagé</h4>
<p>Lorsque le secret partagé est ajouté à l’application, l’application sera prête à commencer à générer des codes qui “expirent” chaque “<codeclass="language-plaintext highlighter-rouge">$period</code>” nombre de secondes. Pour s’assurer que le secret a été saisi ou scanné correctement, vous devez le vérifier en demandant à l’utilisateur de saisir un code généré. Pour vérifier si le code généré est valide, appelez la méthode <codeclass="language-plaintext highlighter-rouge">verifyCode()</code> :</p>
<divclass="language-php highlighter-rouge"><divclass="highlight"><preclass="highlight"><code><spanclass="c1">// Vérifier le code</span>
<p>Si vous effectuez des validations supplémentaires avec vos valeurs <codeclass="language-plaintext highlighter-rouge">$_POST</code>, assurez-vous que le code est toujours soumis en tant que chaîne de caractères - même si c’est un code numérique, le convertir en entier n’est pas fiable. De plus, vous pouvez avoir besoin de stocker <codeclass="language-plaintext highlighter-rouge">$secret</code> dans une <codeclass="language-plaintext highlighter-rouge">$_SESSION</code> ou un autre stockage persistant entre les requêtes. <codeclass="language-plaintext highlighter-rouge">verifyCode()</code> retournera soit <codeclass="language-plaintext highlighter-rouge">true</code> (le code est valide) soit <codeclass="language-plaintext highlighter-rouge">false</code> (le code n’est pas valide ; aucun point pour vous !).</p>
<p>La fonction <codeclass="language-plaintext highlighter-rouge">verifyCode()</code> accepte, en plus de <codeclass="language-plaintext highlighter-rouge">$secret</code> et <codeclass="language-plaintext highlighter-rouge">$code</code>, <u>trois arguments</u> supplémentaires.</p>
<ol>
<li><u>Le premier</u> étant <codeclass="language-plaintext highlighter-rouge">$discrepancy</code>. Comme les codes TOTP sont basés sur le temps(“tranches”), il est très important que le serveur (mais aussi le client) ait une date/heure correcte. Mais comme les deux peuvent différer un peu, nous accordons généralement une certaine marge de manœuvre. Parce que les codes générés sont valides pour une période spécifique (vous vous souvenez de l’argument <codeclass="language-plaintext highlighter-rouge">$period</code> dans le constructeur de <codeclass="language-plaintext highlighter-rouge">TwoFactorAuth</code> ?) nous vérifions généralement la période directement avant et la période directement après l’heure actuelle lors de la validation des codes. Ainsi, lorsque l’heure courante est <codeclass="language-plaintext highlighter-rouge">14:34:21</code>, ce qui donne une ‘tranche de temps courante’ de <codeclass="language-plaintext highlighter-rouge">14:34:00</code> à <codeclass="language-plaintext highlighter-rouge">14:34:30</code>, nous calculons/vérifions également les codes pour <codeclass="language-plaintext highlighter-rouge">14:33:30</code> à <codeclass="language-plaintext highlighter-rouge">14:34:00</code> et pour <codeclass="language-plaintext highlighter-rouge">14:34:30</code> à <codeclass="language-plaintext highlighter-rouge">14:35:00</code>. Cela nous donne une ‘fenêtre’ de <codeclass="language-plaintext highlighter-rouge">14:33:30</code> à <codeclass="language-plaintext highlighter-rouge">14:35:00</code>. L’argument <codeclass="language-plaintext highlighter-rouge">$discrepancy</code> spécifie le nombre de périodes (ou : tranches de temps) que nous vérifions dans les deux directions de l’heure actuelle. La valeur par défaut de <codeclass="language-plaintext highlighter-rouge">$discrepancy</code> est de <codeclass="language-plaintext highlighter-rouge">1</code>, ce qui donne (max.) 3 vérifications de périodes : -1, courant et +1 période. Un <codeclass="language-plaintext highlighter-rouge">$discrepancy</code> de <codeclass="language-plaintext highlighter-rouge">4</code> donne une fenêtre plus large (ou : une plus grande différence de temps entre le client et le serveur) de -4, -3, -2, -1, current, +1, +2, +3 et +4 périodes.</li>
<li><u>Le second</u>, <codeclass="language-plaintext highlighter-rouge">$time</code>, vous permet de vérifier un code pour un moment précis dans le temps. Cet argument n’a pas de réelle utilité pratique mais peut être pratique pour unittesting etc. La valeur par défaut, <codeclass="language-plaintext highlighter-rouge">null</code>, signifie : utiliser le temps actuel.</li>
<li><u>Le troisième</u>, <codeclass="language-plaintext highlighter-rouge">$timeslice</code>, est un argument de sortie ; la valeur retournée dans <codeclass="language-plaintext highlighter-rouge">$timeslice</code> est la valeur du timeslice qui correspond au code (s’il existe). Cette valeur sera 0 si le code ne correspond pas et non nulle si le code correspond. Cette valeur peut être stockée avec l’utilisateur et peut être utilisée pour empêcher les attaques par rejeu. Tout ce que vous avez à faire est de vous assurer, lors d’une connexion réussie, que <codeclass="language-plaintext highlighter-rouge">$timeslice</code> est plus grand que le timeslice précédemment stocké.</li>
</ol>
<h3id="étape-3--stocker-secret-avec-lutilisateur-et-cest-fini-">Étape 3 : Stocker <codeclass="language-plaintext highlighter-rouge">$secret</code> avec l’utilisateur et c’est fini !</h3>
<p>Ok, donc maintenant le code a été vérifié et trouvé correct. Maintenant nous pouvons stocker le <codeclass="language-plaintext highlighter-rouge">$secret</code> avec notre utilisateur dans notre base de données (ou ailleurs) et à chaque fois que l’utilisateur commence une nouvelle session nous lui demandons un code généré par l’application d’authentification de son choix. Tout ce que nous avons à faire est d’appeler <codeclass="language-plaintext highlighter-rouge">verifyCode()</code> à nouveau avec le secret partagé et le code entré et nous savons si l’utilisateur est légitime ou non.</p>
<p>Aussi simple que 1-2-3.</p>
<p>Tout ce dont nous avons besoin, c’est de 3 méthodes et d’un constructeur :</p>
<h3id="fournisseurs-de-codes-qr">Fournisseurs de codes QR</h3>
<p>Comme mentionné précédemment, cette bibliothèque est fournie avec cinq fournisseurs de codes QR “intégrés”. Ce chapitre abordera un peu le sujet mais la plupart d’entre eux devraient être auto-explicatifs. La classe <codeclass="language-plaintext highlighter-rouge">TwoFactorAuth</code> accepte un argument <codeclass="language-plaintext highlighter-rouge">$qrcodeprovider</code> qui vous permet de spécifier un fournisseur de QR-code intégré ou personnalisé. Les cinq fournisseurs intégrés font une simple requête HTTP pour récupérer une image en utilisant cURL et implémentent l’interface <ahref="lib/Providers/Qr/IQRCodeProvider.php"><codeclass="language-plaintext highlighter-rouge">IQRCodeProvider</code></a> qui est tout ce que vous devez implémenter pour écrire votre propre fournisseur de code QR.</p>
<p>Le fournisseur par défaut est le <ahref="lib/Providers/Qr/QRServerProvider.php"><codeclass="language-plaintext highlighter-rouge">QRServerProvider</code></a> qui utilise l’API <ahref="http://goqr.me/api/doc/create-qr-code/">goqr.me</a> pour rendre les codes QR. Ensuite, nous avons le <ahref="lib/Providers/Qr/ImageChartsQRCodeProvider.php"><codeclass="language-plaintext highlighter-rouge">ImageChartsQRCodeProvider</code></a> qui utilise le <ahref="https://image-charts.com">remplacement de Google Image Charts par image-charts.com</a> pour afficher les codes QR et le <ahref="lib/Providers/Qr/QRicketProvider.php"><codeclass="language-plaintext highlighter-rouge">QRicketProvider</code></a> qui utilise l’<ahref="http://qrickit.com/qrickit_apps/qrickit_api.php">API QRickit</a>. Ces trois fournisseurs héritent tous d’une classe de base commune (abstraite) appelée <ahref="lib/Providers/Qr/BaseHTTPQRCodeProvider.php"><codeclass="language-plaintext highlighter-rouge">BaseHTTPQRCodeProvider</code></a> car ils partagent tous les trois la même fonctionnalité : récupérer une image d’un tiers via HTTP. Enfin, nous avons <ahref="lib/Providers/Qr/EndroidQrCodeProvider.php"><codeclass="language-plaintext highlighter-rouge">EndroidQrCodeProvider</code></a>, <ahref="lib/Providers/Qr/EndroidQrCodeWithLogoProvider. php"><codeclass="language-plaintext highlighter-rouge">EndroidQrCodeWithLogoProvider</code></a> et <ahref="lib/Providers/Qr/BaconQrCodeProvider.php"><codeclass="language-plaintext highlighter-rouge">BaconQrCodeProvider</code></a> qui nécessitent l’installation d’une dépendance optionnelle pour être utilisées (voir la section Exigences ci-dessus), mais qui génèrent les codes QR localement. Les cinq classes ont des constructeurs qui vous permettent de modifier certains paramètres et la plupart des arguments, sinon tous, devraient parler d’eux-mêmes. Si vous n’êtes pas sûr des valeurs prises en charge, cliquez sur les liens dans ce paragraphe pour obtenir de la documentation sur les API utilisées par ces classes.</p>
<p>Si vous n’aimez pas une des classes intégrées parce que vous ne voulez pas dépendre de ressources externes par exemple ou parce que vous êtes paranoïaque à l’idée d’envoyer le secret TOTP à ces tiers (ce qui leur est inutile puisqu’ils manquent <em>au moins un</em> autre facteur dans le [processus MFA] (http://en.wikipedia.org/wiki/Multi-factor_authentication)), n’hésitez pas à implémenter votre propre classe. L’interface <codeclass="language-plaintext highlighter-rouge">IQRCodeProvider</code> ne pourrait pas être plus simple. Tout ce que vous avez à faire est d’implémenter 2 méthodes :</p>
<p>La méthode <codeclass="language-plaintext highlighter-rouge">getMimeType()</code> doit retourner le <ahref="http://en.wikipedia.org/wiki/Internet_media_type">MIME type</a> de l’image qui est retournée par notre implémentation de <codeclass="language-plaintext highlighter-rouge">getQRCodeImage()</code>. Dans cet exemple, il s’agit simplement de <codeclass="language-plaintext highlighter-rouge">image/png</code>. Deux arguments sont passés à la méthode <codeclass="language-plaintext highlighter-rouge">getQRCodeImage()</code> : <codeclass="language-plaintext highlighter-rouge">$qrtext</code> et <codeclass="language-plaintext highlighter-rouge">$size</code>. Ce dernier, <codeclass="language-plaintext highlighter-rouge">$size</code>, est simplement la largeur/hauteur en pixels de l’image souhaitée par l’appelant. Le premier, <codeclass="language-plaintext highlighter-rouge">$qrtext</code>, est le texte qui doit être encodé dans le code QR. Un exemple d’un tel texte serait :</p>
<p>Il suffit de renvoyer le QR-code sous forme de données d’image binaires et le tour est joué. Toutes les parties du <codeclass="language-plaintext highlighter-rouge">$qrtext</code> ont été échappées pour vous (mais notez : vous <em>pourrez</em> avoir besoin d’échapper le <codeclass="language-plaintext highlighter-rouge">$qrtext</code> entier une fois de plus quand vous passerez les données à un autre serveur comme argument GET).</p>
<p>Voyons si nous pouvons utiliser <ahref="http://phpqrcode.sourceforge.net/">PHP QR Code</a> pour implémenter notre propre fournisseur d’accès, personnalisé, sans tiers autorisé. Nous commençons par télécharger le <ahref="https://github.com/t0k4rt/phpqrcode/blob/master/phpqrcode.php">fichier (unique) requis</a> et le placer dans le répertoire où se trouve <codeclass="language-plaintext highlighter-rouge">TwoFactorAuth.php</code>. Maintenant, implémentons le fournisseur : créez un autre fichier nommé <codeclass="language-plaintext highlighter-rouge">myprovider.php</code> dans le répertoire <codeclass="language-plaintext highlighter-rouge">Providers\Qr</code> et collez-y ce contenu :</p>
<spanclass="nc">QRCode</span><spanclass="o">::</span><spanclass="nf">png</span><spanclass="p">(</span><spanclass="nv">$qrtext</span><spanclass="p">,</span><spanclass="kc">null</span><spanclass="p">,</span><spanclass="no">QR_ECLEVEL_L</span><spanclass="p">,</span><spanclass="mi">3</span><spanclass="p">,</span><spanclass="mi">4</span><spanclass="p">);</span><spanclass="c1">// We ignore $size and set it to 3</span>
<spanclass="c1">// since phpqrcode doesn't support</span>
<p>C’est fini. Nous avons terminé ! Nous avons implémenté notre propre fournisseur (avec l’aide de PHP QR Code). Plus de dépendances externes, plus de latences inutiles. Maintenant, nous allons <em>utiliser</em> notre fournisseur :</p>
<p>Voilà. On ne pouvait pas faire plus simple.</p>
<h3id="fournisseurs-de-rng">Fournisseurs de RNG</h3>
<p>Cette bibliothèque est également fournie avec trois fournisseurs RNG “intégrés” (<ahref="https://en.wikipedia.org/wiki/Random_number_generation">Random Number Generator</a>). Le fournisseur RNG génère un certain nombre d’octets aléatoires et renvoie ces octets sous forme de chaîne. Ces valeurs sont ensuite utilisées pour créer le secret. Par défaut (aucun fournisseur RNG spécifié), TwoFactorAuth essaiera de déterminer le meilleur fournisseur RNG disponible à utiliser. Par défaut, il essaiera d’utiliser le <ahref="lib/Providers/Rng/CSRNGProvider.php"><codeclass="language-plaintext highlighter-rouge">CSRNGProvider</code></a> pour PHP7+ ou le <ahref="lib/Providers/Rng/MCryptRNGProvider. php"><codeclass="language-plaintext highlighter-rouge">MCryptRNGProvider</code></a> ; si ce dernier n’est pas disponible/pris en charge pour une raison quelconque, il essaiera d’utiliser le <ahref="lib/Providers/Rng/OpenSSLRNGProvider.php"><codeclass="language-plaintext highlighter-rouge">OpenSSLRNGProvider</code></a> et si celui-ci n’est pas non plus disponible/pris en charge, il essaiera d’utiliser le dernier fournisseur de RNG : <ahref="lib/Providers/Rng/HashRNGProvider.php"><codeclass="language-plaintext highlighter-rouge">HashRNGProvider</code></a>. Chacun de ces fournisseurs utilise sa propre méthode pour générer une séquence aléatoire d’octets. Les trois premiers (<codeclass="language-plaintext highlighter-rouge">CSRNGProvider</code>, <codeclass="language-plaintext highlighter-rouge">OpenSSLRNGProvider</code> et <codeclass="language-plaintext highlighter-rouge">MCryptRNGProvider</code>) renvoient une séquence <ahref="https://en.wikipedia.org/wiki/Cryptographically_secure_pseudorandom_number_generator">cryptographiquement sûre</a> d’octets aléatoires tandis que le <codeclass="language-plaintext highlighter-rouge">HashRNGProvider</code> renvoie une séquence <strong>non-cryptographiquement sûre</strong>.</p>
<p>Vous pouvez facilement implémenter votre propre <codeclass="language-plaintext highlighter-rouge">RNGProvider</code> en implémentant simplement l’interface <codeclass="language-plaintext highlighter-rouge">IRNGProvider</code>. Chacun des fournisseurs de RNG “intégrés” possède des arguments de construction qui vous permettent de modifier certains des paramètres à utiliser lors de la création des octets aléatoires, comme la source à utiliser (<codeclass="language-plaintext highlighter-rouge">MCryptRNGProvider</code>) ou l’algorithme de hachage (<codeclass="language-plaintext highlighter-rouge">HashRNGProvider</code>). Je vous encourage à jeter un coup d’oeil à certains des fournisseurs de RNG intégrés](lib/Providers/Rng) pour plus de détails et à l’interface <ahref="lib/Providers/Rng/IRNGProvider.php"><codeclass="language-plaintext highlighter-rouge">IRNGProvider</code></a>.</p>
<h3id="fournisseurs-de-temps">Fournisseurs de temps</h3>
<p>Un autre ensemble de fournisseurs dans cette bibliothèque sont les fournisseurs de temps ; cette bibliothèque fournit trois fournisseurs ‘intégrés’.</p>
<ol>
<li>Le fournisseur de temps par défaut est le <ahref="lib/Providers/Time/LocalMachineTimeProvider.php"><codeclass="language-plaintext highlighter-rouge">LocalMachineTimeProvider</code></a> ; ce fournisseur retourne simplement la sortie de <codeclass="language-plaintext highlighter-rouge">Time()</code> et est <em>hautement recommandé</em> comme fournisseur par défaut.</li>
<li>Le <ahref="lib/Providers/Time/HttpTimeProvider.php"><codeclass="language-plaintext highlighter-rouge">HttpTimeProvider</code></a> exécute une requête <codeclass="language-plaintext highlighter-rouge">HEAD</code> contre un serveur web donné (par défaut : google.com) et essaie d’extraire l’en-tête <codeclass="language-plaintext highlighter-rouge">Date:</code>-HTTP et retourne sa date. D’autres url/domaines peuvent être utilisés en spécifiant l’url dans le constructeur.</li>
<li>Le dernier fournisseur de temps est le <ahref="lib/Providers/Time/NTPTimeProvider.php"><codeclass="language-plaintext highlighter-rouge">NTPTimeProvider</code></a> qui fait une requête NTP à un serveur NTP spécifié.</li>
<p>Pour ce qui est de la raison pour laquelle ces fournisseurs de temps sont implémentés, ils permettent à la bibliothèque TwoFactorAuth de s’assurer que l’heure de l’hôte est correcte (ou plutôt : avec une marge). Vous pouvez utiliser la méthode <codeclass="language-plaintext highlighter-rouge">ensureCorrectTime()</code> pour vous assurer que l’heure de l’hôte est correcte. Par défaut, cette méthode va comparer l’heure de l’hôte (retournée par l’appel de <codeclass="language-plaintext highlighter-rouge">time()</code> sur le <codeclass="language-plaintext highlighter-rouge">LocalMachineTimeProvider</code>) avec les <codeclass="language-plaintext highlighter-rouge">NTPTimeProvider</code> et <codeclass="language-plaintext highlighter-rouge">HttpTimeProvider</code> par défaut. Vous pouvez passer un tableau de <codeclass="language-plaintext highlighter-rouge">ITimeProvider</code>s pour changer cela et spécifier la <codeclass="language-plaintext highlighter-rouge">l'indulgence</code> (deuxième argument) autorisée (par défaut : 5 secondes). La méthode sera lancée si le fournisseur de temps de TwoFactorAuth (qui peut être n’importe quel <codeclass="language-plaintext highlighter-rouge">ITimeProvider</code>, voir constructeur) diffère de plus de la quantité donnée de secondes de n’importe lequel des <codeclass="language-plaintext highlighter-rouge">ITimeProviders</code> donnés. Nous vous conseillons d’appeler cette méthode avec parcimonie lorsque vous vous appuyez sur des tiers (ce que font le <codeclass="language-plaintext highlighter-rouge">HttpTimeProvider</code> et le <codeclass="language-plaintext highlighter-rouge">NTPTimeProvider</code>) ou, si vous avez besoin de vous assurer que l’heure est correcte sur une base (très) régulière, d’implémenter un <codeclass="language-plaintext highlighter-rouge">ITimeProvider</code> qui soit plus efficace que les <codeclass="language-plaintext highlighter-rouge">intégrés' (comme utiliser un signal GPS). La méthode </code>ensureCorrectTime()` est surtout utilisée pour s’assurer que le serveur est configuré correctement.</p>
<p>Sous licence MIT. Voir <ahref="https://raw.githubusercontent.com/RobThree/TwoFactorAuth/master/LICENSE">LICENSE</a> pour plus de détails.</p>
<p>Logo / icône](http://www.iconmay.com/Simple/Travel_and_Tourism_Part_2/luggage_lock_safety_baggage_keys_cylinder_lock_hotel_travel_tourism_luggage_lock_icon_465) sous CC0 1.0 Universal (CC0 1.0) Dédicace du domaine public (<ahref="http://riii.nl/tm7ap">Page archivée</a>)</p>
<divclass="article__section-navigator clearfix"><divclass="previous"><span>PRÉCÉDENT</span><ahref="/2021/03/08/PC1-ArchLinux-XFCE-ASUS_H110M_A-nvme_1To.html">PC1 Ordinateur Bureau ArchLinux xfce - NVME 1To</a></div><divclass="next"><span>SUIVANT</span><ahref="/2021/03/24/A20-Olinuxino-Domoticz-logiciel-de-gestion-et-de-controle-domotique.html">A20-Olinuxino - Domoticz logiciel de gestion et de contrôle domotique</a></div></div></div>
</div>
<script>(function(){
var SOURCES = window.TEXT_VARIABLES.sources;
window.Lazyload.js(SOURCES.jquery, function() {
$(function() {
var $this ,$scroll;
var $articleContent = $('.js-article-content');
var hasSidebar = $('.js-page-root').hasClass('layout--page--sidebar');
var scroll = hasSidebar ? '.js-page-main' : 'html, body';