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
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
Utiliser une API pour nourrir une base de manière cohérente
Implémentation d’une alternative à l’utilisation de Faker pour disposer de données cohérentes.
William Suppo
Le pattern Pipeline
Laravel dispose d'un puissant service de Pipeline méconnu de la plupart des développeurs, explorons ensemble les possibilités que propose ce pattern !
Mathieu De Gracia