Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen angezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
de:modul:ffit:3-jahr:java:learningunits:lu06:b [2025/09/23 00:18] apeterde:modul:ffit:3-jahr:java:learningunits:lu06:b [2025/09/23 10:02] (aktuell) apeter
Zeile 45: Zeile 45:
 ==== Authentication ==== ==== Authentication ====
  
-**Anforderung 7**: Ein Benutzer mit einem gültigen JWT soll sein Passwort und via ''/auth/login'' ändern können können.+**Anforderung 7**: Ein Benutzer mit einem gültigen JWT soll sein Passwort und via ''/auth/change-password'' ändern können können.
  
-Implementieren Sie eine POST-API, welche als JSON-Body die E-Mailadresse ("email") und das Klartextpasswort ("password") akzeptiert.+Implementieren Sie eine PUT-API, welche als JSON-Body das alte Passwort ("oldPassword") und das neue Passwort ("newPassword") akzeptiert
 +Bei der Authorization wird ein zuvor generiertes JWT mitgegeben. Der "Content-Type"-Header ist gleich wie bei der POST-API.
  
 +{{:de:modul:ffit:3-jahr:java:learningunits:lu06:postman_put_auth.png?800|}}
 +
 +Die Implementation könnte grob so aussehen:
 +<code java>
 +String authHeader = ctx.header("Authorization");
 +...
 +String token = authHeader.substring("Bearer ".length());
 +...
 +
 +Claims claims = Jwts.parser()
 +    .verifyWith(JWT_KEY) // This includes the verification
 +    .build()
 +    .parseSignedClaims(token)
 +    .getPayload();
 +Integer userId = claims.get("userId", Integer.class);
 +
 +...
 +
 +var json = ctx.bodyValidator(Map.class)
 +    .check(m -> m.containsKey("oldPassword"), "oldPassword is required")
 +    .check(m -> m.containsKey("newPassword"), "newPassword is required")
 +    .get();
 +
 +String oldPassword = (String) json.get("oldPassword");
 +String newPassword = (String) json.get("newPassword");
 +
 +... // TODO: find user by id
 +
 +byte[] storedSalt = Base64.getDecoder().decode(user.getPasswordSalt());
 +byte[] storedHash = Base64.getDecoder().decode(user.getPasswordHash());
 +...
 +if (PasswordHandler.verifyPassword(oldPassword, storedHash, storedSalt)) {
 +    byte[] newHash = PasswordHandler.hashPassword(newPassword, storedSalt);
 +    user.setPasswordHash(Base64.getEncoder().encodeToString(newHash));
 +
 +    userPersistor.save(user);
 +    ctx.json(Map.of("message", "Password changed successfully"));
 +}
 +...
 +</code>
 +
 +Testen Sie die Implementation manuell mit Postman.
  • de/modul/ffit/3-jahr/java/learningunits/lu06/b.1758579529.txt.gz
  • Zuletzt geändert: 2025/09/23 00:18
  • von apeter