package org.datasurvey.web.rest; import com.fasterxml.jackson.annotation.JsonProperty; import javax.validation.Valid; import org.datasurvey.security.jwt.JWTFilter; import org.datasurvey.security.jwt.TokenProvider; import org.datasurvey.web.rest.vm.LoginVM; import org.springframework.http.HttpHeaders; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.web.bind.annotation.*; /** * Controller to authenticate users. */ @RestController @RequestMapping("/api") public class UserJWTController { private final TokenProvider tokenProvider; private final AuthenticationManagerBuilder authenticationManagerBuilder; public UserJWTController(TokenProvider tokenProvider, AuthenticationManagerBuilder authenticationManagerBuilder) { this.tokenProvider = tokenProvider; this.authenticationManagerBuilder = authenticationManagerBuilder; } @PostMapping("/authenticate") public ResponseEntity authorize(@Valid @RequestBody LoginVM loginVM) { UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken( loginVM.getUsername(), loginVM.getPassword() ); Authentication authentication = authenticationManagerBuilder.getObject().authenticate(authenticationToken); SecurityContextHolder.getContext().setAuthentication(authentication); String jwt = tokenProvider.createToken(authentication, loginVM.isRememberMe()); HttpHeaders httpHeaders = new HttpHeaders(); httpHeaders.add(JWTFilter.AUTHORIZATION_HEADER, "Bearer " + jwt); return new ResponseEntity<>(new JWTToken(jwt), httpHeaders, HttpStatus.OK); } /** * Object to return as body in JWT Authentication. */ static class JWTToken { private String idToken; JWTToken(String idToken) { this.idToken = idToken; } @JsonProperty("id_token") String getIdToken() { return idToken; } void setIdToken(String idToken) { this.idToken = idToken; } } }