Krishiv111 / liverpoolkm3

This is my personal blog for APCSA where I document my grows and glows as a student with all my learnings in java.
MIT License
0 stars 1 forks source link

JWT ISSUE #7

Open Krishiv111 opened 9 months ago

Krishiv111 commented 9 months ago

Krishiv Mahendru

Link To Blog: https://krishiv111.github.io/liverpoolkm3//2023/12/19/JWTStudent_IPYNB_2_.html

Poster: Client Request From Site-2

This is the Human Controller used on my groups thymeleaf lesson with added JWT

Link to java code: https://krishiv111.github.io/liverpoolkm3//2023/12/19/JWTStudent_IPYNB_2_.html

POSTMAN UNAUTHORIZED ERROR

Screen Shot 2024-01-08 at 11 26 08 PM

Here is a basic class I did individually to show Individual knowledge of JWT with a soccer player class

SoccerPlayer.Java Class

` package com.nighthawk.spring_portfolio.mvc.person;

// Import statements...

@Entity @Convert(attributeName ="person", converter = JsonType.class) @Data @AllArgsConstructor @NoArgsConstructor public class SoccerPlayer { // Renamed class to SoccerPlayer instead of person

@Id @GeneratedValue(strategy = GenerationType.AUTO) private Long id;

@NotEmpty
@Size(min=5)
@Column(unique=true)
@Email
private String email;

@NotEmpty
private String password;

@NonNull
@Size(min = 2, max = 30, message = "Name (2 to 30 chars)")
private String name;

@DateTimeFormat(pattern = "yyyy-MM-dd")
private Date dob;

@ManyToMany(fetch = EAGER)
private Collection<PersonRole> roles = new ArrayList<>();

@JdbcTypeCode(SqlTypes.JSON)
@Column(columnDefinition = "jsonb")
private Map<String, Map<String, Object>> stats = new HashMap<>();

public SoccerPlayer(String email, String password, String name, Date dob) {
    this.email = email;
    this.password = password;
    this.name = name;
    this.dob = dob;
}

// Method to calculate age based on date of birth
public int getAge() {
    if (this.dob != null) {
        LocalDate birthDay = this.dob.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
        return Period.between(birthDay, LocalDate.now()).getYears();
    }
    return -1; // If date of birth is not set, return -1 to indicate invalid age
}

// Method to initialize and return an array of predefined SoccerPlayer instances
public static SoccerPlayer[] init() {
    SoccerPlayer messi = new SoccerPlayer();
    messi.setName("Lionel Messi");
    messi.setEmail("lionel.messi@example.com");
    messi.setPassword("Messi123!");
    try {
        Date d = new SimpleDateFormat("MM-dd-yyyy").parse("06-24-1987");
        messi.setDob(d);
    } catch (Exception e) {
        // Handle parsing exception if needed
    }

    // Initialization for Cristiano Ronaldo
    // Initialization for Neymar Jr.

    SoccerPlayer[] players = {messi, ronaldo, neymar}; // Array containing initialized SoccerPlayer instances
    return players; // Return the array of SoccerPlayer instances
}

// Method to display SoccerPlayer details
public static void main(String[] args) {
    SoccerPlayer[] players = init(); // Obtain initialized SoccerPlayer instances

    for (SoccerPlayer player : players) { // Iterate through each SoccerPlayer instance
        System.out.println(player); // Print the details of each SoccerPlayer
    }
}

} `

Controller Soccer Player With JWT features

package com.nighthawk.spring_portfolio.mvc.soccerplayer;

// Import statements...

@RestController @RequestMapping("/api/soccerplayer") public class SoccerPlayerApiController {

@Autowired
private SoccerPlayerJpaRepository repository;

@Autowired
private SoccerPlayerDetailsService soccerPlayerDetailsService;

@Autowired
private JwtTokenUtil jwtTokenUtil;

@Autowired
private JwtUserDetailsService userDetailsService;

@Autowired
private AuthenticationManager authenticationManager;

@PostMapping("/authenticate")
public ResponseEntity<?> createAuthenticationToken(@RequestBody JwtRequest authenticationRequest) throws Exception {
    authenticate(authenticationRequest.getUsername(), authenticationRequest.getPassword());
    final UserDetails userDetails = userDetailsService.loadUserByUsername(authenticationRequest.getUsername());
    final String token = jwtTokenUtil.generateToken(userDetails);
    return ResponseEntity.ok(new JwtResponse(token));
}

@GetMapping("/")
public ResponseEntity<List<SoccerPlayer>> getSoccerPlayers(@RequestHeader("Authorization") String token) {
    if (!jwtTokenUtil.validateToken(token)) {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
    return new ResponseEntity<>(repository.findAllByOrderByNameAsc(), HttpStatus.OK);
}

@GetMapping("/{id}")
public ResponseEntity<SoccerPlayer> getSoccerPlayer(@PathVariable long id, @RequestHeader("Authorization") String token) {
    if (!jwtTokenUtil.validateToken(token)) {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
    Optional<SoccerPlayer> optional = repository.findById(id);
    if (optional.isPresent()) {
        SoccerPlayer soccerPlayer = optional.get();
        return new ResponseEntity<>(soccerPlayer, HttpStatus.OK);
    }
    return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}

@DeleteMapping("/delete/{id}")
public ResponseEntity<SoccerPlayer> deleteSoccerPlayer(@PathVariable long id, @RequestHeader("Authorization") String token) {
    if (!jwtTokenUtil.validateToken(token)) {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
    Optional<SoccerPlayer> optional = repository.findById(id);
    if (optional.isPresent()) {
        SoccerPlayer soccerPlayer = optional.get();
        repository.deleteById(id);
        return new ResponseEntity<>(soccerPlayer, HttpStatus.OK);
    }
    return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}

@PostMapping("/post")
public ResponseEntity<Object> postSoccerPlayer(@RequestBody SoccerPlayer soccerPlayer, @RequestHeader("Authorization") String token) {
    if (!jwtTokenUtil.validateToken(token)) {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
    soccerPlayerDetailsService.save(soccerPlayer);
    return new ResponseEntity<>(soccerPlayer.getName() + " is created successfully", HttpStatus.CREATED);
}

@PostMapping(value = "/search", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<Object> soccerPlayerSearch(@RequestBody final Map<String, String> map, @RequestHeader("Authorization") String token) {
    if (!jwtTokenUtil.validateToken(token)) {
        return new ResponseEntity<>(HttpStatus.UNAUTHORIZED);
    }
    String term = map.get("term");
    List<SoccerPlayer> list = repository.findByNameContainingIgnoreCaseOrClubContainingIgnoreCase(term, term);
    return new ResponseEntity<>(list, HttpStatus.OK);
}

private void authenticate(String username, String password) throws Exception {
    try {
        authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(username, password));
    } catch (DisabledException e) {
        throw new Exception("USER_DISABLED", e);
    } catch (BadCredentialsException e) {
        throw new Exception("INVALID_CREDENTIALS", e);
    }
}

}