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
PHPStan valide nos règles de conception
Comment s’assurer du respect de nos règles de conception ? Avec PHPStan bien sûr !
William Suppo
Comment fonctionne Laravel Sanctum ?
Arrêtez de débugger vos SPA à l'aveugle et maîtrisez enfin les rouages de ce système d'authentification.
Laravel Jutsu
La méthode createOrFirst
Voyons ensemble à quelles problématiques répond la nouvelle méthode createOrFirst !
Mathieu De Gracia