meta { name: 04 Refresh type: http seq: 4 } post { url: {{baseUrl}}/api/v1/auth/refresh body: none auth: none } script:post-response { if (res.getStatus() === 200) { const session = res.getBody().data; bru.setEnvVar("token", session.accessToken); } } tests { test("200 OK", function () { expect(res.getStatus()).to.equal(200); }); test("nouveau accessToken émis", function () { expect(res.getBody().data).to.have.property("accessToken"); expect(res.getBody().data).to.have.property("expiresAt"); }); } docs { POST /api/v1/auth/refresh Échange le cookie httpOnly `rubis_refresh` (posé automatiquement par Signup ou Login) contre une nouvelle AuthSession : - nouveau access token JSON (TTL 30 min) - nouveau refresh cookie (rotation : l'ancien est révoqué) Bruno gère la cookie jar automatiquement → pas besoin d'envoyer le cookie manuellement, il est posé par signup/login et présent ici. Sécurité — rotation : - Si on présente un cookie déjà révoqué (signal de vol), TOUS les refresh tokens actifs du user sont invalidés (panic mode). - Le hash SHA-256 est stocké en DB, jamais le plain. - Cookie scope : `path=/api/v1/auth` → pas envoyé sur les autres routes. Erreurs : - 401 no_session : pas de cookie envoyé - 401 session_expired : cookie inconnu / expiré / révoqué Côté SPA : appelé automatiquement au boot pour rehydrater la session sans demander un re-login. Et au moment où une requête API renvoie 401, le SPA tente un silent refresh puis retry. }