Bonjour,
Pour un support de cours j'ai voulu montrer que la gestion de la sécurité via un token était très sûre et pour en donner la preuve, j'ai proposé de vérifier que l'on ne pouvait pas modifier un jeton.
Sauf que si j'ai pu modifier un jeton entre deux appels ! Comment cela est-il possible ?
D'abord un exemple :
Le token après un login :
Résultat de la requête employee/employee avec ce token :
Code JSON : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 { "id": 4, "email": "jean.bon@monserveur.fr", "password": "", "username": "jean.bon", "token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqZWFuLmJvbiIsImlhdCI6MTY0MzM4MDE1NSwiZXhwIjoxNjQzNDY2NTU1fQ.JUSTGCfWS9MrbBzkyEboaxHyZcBVwzC_TAH8LRx76wJmKZ9drF1cz51EWfKs9rd4GfxqwpE33-_5e0soylfA6w", "roles": [ "USER" ] }
[{"id":1,"name":"KING","job":{"id":1,"jobname":"President"},"managerId":null,"hiredate":"1981-11-17","salary":5000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},{"id":2,"name":"JONES","job":{"id":2,"jobname":"Manager"},"managerId":1,"hiredate":"1981-04-02","salary":3000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},...
Token modifié : le dernier caractère (w) replacé par un x :
"token": "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJqZWFuLmJvbiIsImlhdCI6MTY0MzM4MDE1NSwiZXhwIjoxNjQzNDY2NTU1fQ.JUSTGCfWS9MrbBzkyEboaxHyZcBVwzC_TAH8LRx76wJmKZ9drF1cz51EWfKs9rd4GfxqwpE33-_5e0soylfA6x",
Résultat de la requête employee/employee :
[{"id":1,"name":"KING","job":{"id":1,"jobname":"President"},"managerId":null,"hiredate":"1981-11-17","salary":5000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},{"id":2,"name":"JONES","job":{"id":2,"jobname":"Manager"},"managerId":1,"hiredate":"1981-04-02","salary":3000.00,"department":{"id":1,"dname":"Accounting","location":"NEW YORK"}},...
A noter que si je remplace le w par un caractère avant le w, par exemple un a ou b, cela ne fonctionne pas !
Maintenant le contexte technique :
La clé : key= AzertyuiopQsdfgjklmWxcvbn1234567890!=
Expiration : expiration= 86400000
Générateur de jeton :
Validateur de jeton :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public String generateToken(Authentication authentication) { UserDetailsImpl userDetailsImpl = (UserDetailsImpl) authentication.getPrincipal(); JwtBuilder jwtBuilder = Jwts.builder(); jwtBuilder.setSubject((userDetailsImpl.getUsername())); jwtBuilder.setIssuedAt(new Date()); jwtBuilder.setExpiration(new Date((new Date()).getTime() + expiration)); jwtBuilder.signWith(SignatureAlgorithm.HS512, key); String token = jwtBuilder.compact(); return token; }
Extraction du username :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 public boolean validateToken(String token) { Boolean ret = false; try { JwtParser jwtParser = Jwts.parser(); jwtParser.setSigningKey(key); jwtParser.parseClaimsJws(token); ret= true; } catch (Exception e) { ret = false; } return ret; }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public String getUserNameFromToken(String token) { JwtParser jwtParser = Jwts.parser(); jwtParser.setSigningKey(key); Jws<Claims> jws = jwtParser.parseClaimsJws(token); Claims claims = jws.getBody(); String userName = claims.getSubject(); return userName; }
Partager