Forráskód Böngészése

add refresh endpoint

Daniel Bohry 1 hete
szülő
commit
e19fff7e54

+ 16 - 3
src/main/java/com/danielbohry/authservice/api/AuthController.java

@@ -5,8 +5,6 @@ import com.danielbohry.authservice.api.dto.AuthenticationResponse;
 import com.danielbohry.authservice.domain.ApplicationUser;
 import com.danielbohry.authservice.service.auth.AuthService;
 import lombok.AllArgsConstructor;
-import lombok.extern.slf4j.Slf4j;
-import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.core.GrantedAuthority;
 import org.springframework.security.core.context.SecurityContext;
@@ -14,6 +12,7 @@ import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.bind.annotation.*;
 
 import static org.springframework.http.HttpStatus.CREATED;
+import static org.springframework.http.HttpStatus.FORBIDDEN;
 
 @RestController
 @AllArgsConstructor
@@ -45,7 +44,21 @@ public class AuthController {
             }
         }
 
-        return ResponseEntity.status(HttpStatus.FORBIDDEN).build();
+        return ResponseEntity.status(FORBIDDEN).build();
+    }
+
+    @PostMapping("refresh")
+    public ResponseEntity<Object> refresh() {
+        SecurityContext context = SecurityContextHolder.getContext();
+        Object principal = context.getAuthentication().getPrincipal();
+        if (principal instanceof ApplicationUser user) {
+            AuthenticationResponse response = service.refresh(user);
+            return response != null
+                    ? ResponseEntity.ok(response)
+                    : ResponseEntity.status(FORBIDDEN).build();
+        }
+
+        return ResponseEntity.status(FORBIDDEN).build();
     }
 
     @PostMapping("forgot-password")

+ 14 - 0
src/main/java/com/danielbohry/authservice/service/auth/AuthService.java

@@ -11,6 +11,8 @@ import org.springframework.beans.factory.annotation.Value;
 import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.authority.SimpleGrantedAuthority;
+import org.springframework.security.core.context.SecurityContext;
+import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.security.core.userdetails.User;
 import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.security.core.userdetails.UserDetailsService;
@@ -67,6 +69,18 @@ public class AuthService implements UserDetailsService {
         return buildResponse(user, authentication);
     }
 
+    public AuthenticationResponse refresh(ApplicationUser applicationUser) {
+        if (!applicationUser.isActive()) {
+            return null;
+        }
+
+        ApplicationUser user = service.findByUsername(applicationUser.getUsername());
+        Authentication authentication = jwtService.generateToken(user);
+        user.setLastLoginAt(now());
+        service.update(user.getId(), user);
+        return buildResponse(user, authentication);
+    }
+
     public AuthenticationResponse changePassword(String userId, String currentPassword, String newPassword) {
         ApplicationUser user = service.changePassword(userId, currentPassword, newPassword, passwordEncoder);
         Authentication authentication = jwtService.generateToken(user);