Comment fonctionne l’url signed

Publié le 18 avril 2022 par Mathieu De Gracia
Couverture de l'article 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 Controller
2{
3 public function unsubscribe(User $user, Request $request)
4 {
5 $request->hasValidSignature(); // bool
6 }
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 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.

Mathieu De Gracia avatar
Mathieu De Gracia
Des fois, mon chat code à ma place 🐱

A lire

Autres articles de la même catégorie