]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-13372 JWT refresh now really occurs every 5 minutes
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Mon, 22 Jun 2020 16:17:47 +0000 (18:17 +0200)
committersonartech <sonartech@sonarsource.com>
Fri, 26 Jun 2020 20:04:58 +0000 (20:04 +0000)
server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/JwtHttpHandler.java
server/sonar-webserver-auth/src/main/java/org/sonar/server/authentication/JwtSerializer.java
server/sonar-webserver-auth/src/test/java/org/sonar/server/authentication/JwtSerializerTest.java

index 699c771d9017158a2dcb3d2c7c9f914bb726c5ba..8c000e1a65c5b67dfdcd27161fd7e5b9bd938001 100644 (file)
@@ -44,6 +44,7 @@ import static org.apache.commons.lang.time.DateUtils.addSeconds;
 import static org.sonar.process.ProcessProperties.Property.WEB_SESSION_TIMEOUT_IN_MIN;
 import static org.sonar.server.authentication.Cookies.findCookie;
 import static org.sonar.server.authentication.Cookies.newCookieBuilder;
+import static org.sonar.server.authentication.JwtSerializer.LAST_REFRESH_TIME_PARAM;
 
 @ServerSide
 public class JwtHttpHandler {
@@ -51,7 +52,6 @@ public class JwtHttpHandler {
   private static final int MAX_SESSION_TIMEOUT_IN_MINUTES = 3 * 30 * 24 * 60;
 
   private static final String JWT_COOKIE = "JWT-SESSION";
-  private static final String LAST_REFRESH_TIME_PARAM = "lastRefreshTime";
 
   private static final String CSRF_JWT_PARAM = "xsrfToken";
 
index 3aba19945980c7b3cd69d463a92a4a5b7842cf6c..8450f17315169a8d1e71bf0663fee75802349ff6 100644 (file)
@@ -22,7 +22,6 @@ package org.sonar.server.authentication;
 import com.google.common.annotations.VisibleForTesting;
 import io.jsonwebtoken.Claims;
 import io.jsonwebtoken.ExpiredJwtException;
-import io.jsonwebtoken.JwtBuilder;
 import io.jsonwebtoken.Jwts;
 import io.jsonwebtoken.SignatureAlgorithm;
 import io.jsonwebtoken.security.SignatureException;
@@ -54,6 +53,8 @@ public class JwtSerializer implements Startable {
 
   private static final SignatureAlgorithm SIGNATURE_ALGORITHM = SignatureAlgorithm.HS256;
 
+  static final String LAST_REFRESH_TIME_PARAM = "lastRefreshTime";
+
   private final Configuration config;
   private final System2 system2;
 
@@ -79,16 +80,15 @@ public class JwtSerializer implements Startable {
 
   String encode(JwtSession jwtSession) {
     checkIsStarted();
-    JwtBuilder jwtBuilder = Jwts.builder()
+    return Jwts.builder()
+      .addClaims(jwtSession.getProperties())
+      .claim(LAST_REFRESH_TIME_PARAM, system2.now())
       .setId(jwtSession.getSessionTokenUuid())
       .setSubject(jwtSession.getUserLogin())
       .setIssuedAt(new Date(system2.now()))
       .setExpiration(new Date(jwtSession.getExpirationTime()))
-      .signWith(secretKey, SIGNATURE_ALGORITHM);
-    for (Map.Entry<String, Object> entry : jwtSession.getProperties().entrySet()) {
-      jwtBuilder.claim(entry.getKey(), entry.getValue());
-    }
-    return jwtBuilder.compact();
+      .signWith(secretKey, SIGNATURE_ALGORITHM)
+      .compact();
   }
 
   Optional<Claims> decode(String token) {
@@ -118,13 +118,12 @@ public class JwtSerializer implements Startable {
 
   String refresh(Claims token, long expirationTime) {
     checkIsStarted();
-    JwtBuilder jwtBuilder = Jwts.builder();
-    for (Map.Entry<String, Object> entry : token.entrySet()) {
-      jwtBuilder.claim(entry.getKey(), entry.getValue());
-    }
-    jwtBuilder.setExpiration(new Date(expirationTime))
-      .signWith(secretKey, SIGNATURE_ALGORITHM);
-    return jwtBuilder.compact();
+    return Jwts.builder()
+      .setClaims(token)
+      .claim(LAST_REFRESH_TIME_PARAM, system2.now())
+      .setExpiration(new Date(expirationTime))
+      .signWith(secretKey, SIGNATURE_ALGORITHM)
+      .compact();
   }
 
   private static SecretKey generateSecretKey() {
index e94b9fb8ddcf8502c15cbb91a79bc16c49c71796..e4938aa95619ec236b40a7ad2ce57bc7c930532a 100644 (file)
@@ -252,12 +252,14 @@ public class JwtSerializerTest {
     Date createdAt = DateUtils.parseDate("2016-01-01");
     // Expired in 10 minutes
     Date expiredAt = addMinutes(new Date(), 10);
+    Date lastRefreshDate = addMinutes(new Date(), -4);
     Claims token = new DefaultClaims()
       .setId("id")
       .setSubject("subject")
       .setIssuer("sonarqube")
       .setIssuedAt(createdAt)
       .setExpiration(expiredAt);
+    token.put("lastRefreshTime", lastRefreshDate.getTime());
     token.put("key", "value");
 
     // Refresh the token with a higher expiration time
@@ -268,6 +270,7 @@ public class JwtSerializerTest {
     assertThat(result.getSubject()).isEqualTo("subject");
     assertThat(result.getIssuer()).isEqualTo("sonarqube");
     assertThat(result.getIssuedAt()).isEqualTo(createdAt);
+    assertThat(((long) result.get("lastRefreshTime"))).isGreaterThanOrEqualTo(now.getTime());
     assertThat(result.get("key")).isEqualTo("value");
     // Expiration date has been changed
     assertThat(result.getExpiration()).isNotEqualTo(expiredAt)