Comment fonctionne l’url signed
Ce tutoriel se base sur une version 9.2 de Laravel
L’URL signed est une façon simple et rapide de protéger vos routes avec un jeton d’accès, cette fonctionnalité est disponible depuis la version 5.6 de Laravel.
1use Illuminate\Support\Facades\URL;2 3echo URL::signedRoute('unsubscribe', ['user' => 100]);4 5// https://localhost/unsubscribe/100?signature=197e0340efd920d06ccf146aa22c938337623ae1aa05267b75a632c366eb7c9a
Il devient ensuite nécessaire de vérifier le validité de cette signature depuis votre controller ou votre request avec la méthode hasValidSignature.
1class UserController extends Controller2{3 public function unsubscribe(User $user, Request $request)4 {5 $request->hasValidSignature(); // bool6 }7}
En coulisse cette signature fonctionne sans la moindre database, cookie, ou même cache... alors comment ? C’est ce que nous allons essayer de déterminer dans cet article !
Into the vendor
La méthode signedRoute de la facade URL se situe dans la class Illuminate\Routing\UrlGenerator de votre vendor.
Cette méthode possède 3 préoccupations :
- Vérifier que l'URL cible ne contient pas de paramètre interdit.
- Ajouter une expiration à l'URL si besoin.
- Générer l'URL signed.
Vérifier les paramètres
En effet, il est impossible de signer une URL contenant les paramètres signature ou bien expires, cette vérification s'effectue dans la méthode ensureSignedRouteParametersAreNotReserved.
Une InvalidArgumentException sera throw si vous essayez les exemples suivants :
1URL::signedRoute('unsubscribe', ['signature' => 'my-signature']);2URL::signedRoute('unsubscribe', ['expires' => 'today']);
Ces deux paramètres sont réservés par le framework pour le bon fonctionnement des URL Signed.
Ajouter l'expiration
Il est possible d'ajouter une date d'expiration à votre URL signed.
1URL::temporarySignedRoute(2 'unsubscribe', now()->addMinutes(30), ['user' => 100]3);
Un paramètre expires contenant une date limite sera ajoutée arbitrairement à votre URL, ce qui explique l'interdiction vue un peu plus haut.
Générer l'url signed
Il est désormais temps de signer l'url !
La signature consiste en un hash_hmac en sha256 de l'URL et de ses paramètres.
La key utilisé lors du hash en tant que salt n'est d'autre que le APP_KEY de votre application.
1// $name = 'unsubscribe';2// $parameters = ['user' => 100];3// $key = env('APP_KEY');4$signature = hash_hmac('sha256', $this->route($name, $parameters), $key)
Cela signifie que le hash ainsi obtenu est à la fois unique et constitué de l'intégralité de votre URL !
Il devient alors impossible de falsifier la signature, car le APP_KEY est secret, ainsi que de modifier les paramètres de l'URL ... car cela modifierait la valeur du hash !
La signature d'une URL permet donc de protéger l'accès à une route ainsi que de s'assurer que personne n'a modifié l'URL liée à cette signature.
A lire
Autres articles de la même catégorie
Le driver email failover
Protégez-vous des indisponibilités de votre serveur e-mails grace à un driver failover !
Antoine Benevaut
Automatisez l'insertion d'utilisateurs avec les Seeders
Explorons à nouveau l'utilisation des Seeders ! Pour bien maîtriser les fondamentaux, nous allons automatiser l'ajout de nouveaux utilisateurs dans trois contextes d'exemple.
Antoine Benevaut
Découverte FilamentPHP : Installation & première page
Premier article de cette série de tutoriels, découvrons les bases de FilamentPHP en créant un listing des utilisateurs !
Mathieu De Gracia