본문 바로가기

Spring

항해 99 6주차 - 2일

 오늘도 즐거운 프로젝트~ 날이다. 나름대로 즐겁게 코드를 치는 나날을 보내니 뭔가뭔가다. 

 

 오늘 작성한 것은 토큰을 통해서 비밀번호 분실시, 새로 설정 가능한 api를 제작하였다. 

public String createTemporaryAuthorization (String userId, String email) {

    Date now = new Date();
    Date expriDate = new Date(now.getTime() + 5 * 60 * 1000);
    return BEARER_PREFIX +
            Jwts.builder()
                    .setSubject(userId) // 유저 아이디
                    .claim("email", email) // 유저 이메일
                    .setIssuedAt(now).setExpiration(expriDate) // 발행 시간 + 유지시간
                    .signWith(key,signatureAlgorithm)
                    .compact();
}

 이와 같은 방식으로 임시토큰을 발급하여 5분 동안 유지 가능하게 만들었다. 다음으로 이를 다시 헤더에서 넣어서 확인한다. 

public String getJwtFromHeader(HttpServletRequest request, String token) {
    String bearerToken = request.getHeader(token);
    if (StringUtils.hasText(bearerToken) && bearerToken.startsWith(BEARER_PREFIX)) {
        return bearerToken.substring(7);
    }
    return null;
}

 위와 같은 방식으로 발행된 토큰을 헤더에 넣어서 토큰에 넣은 필요한 데이터를 뽑아낸다 

public FindRequestDto readToken(String token) {

    Jws<Claims> jws = Jwts.parserBuilder()
            .setSigningKey(key)
            .build().parseClaimsJws(token);
    Claims claims = jws.getBody();

    String userId = claims.getSubject();
    System.out.println("아이디 : " + userId);
    String email = claims.get("email").toString();
    System.out.println("이메일 : " + email);
    FindRequestDto findRequestDto = new FindRequestDto(userId , email);
    return findRequestDto;
}

 즉, 이메일과 아이디를 통해 다시 user 를 찾아 그 유저의 패스워드를 변경하여 레포지토리에 저장하는 코드를 작성하였다. 

//패스워드 변경 api
public ResponseEntity<MessageResponseDto> changePassword(HttpServletRequest request, ChangPasswordRequestDto changPasswordRequestDto) {
    String token = jwtUtil.getJwtFromHeader(request, "temporary_Authorization").substring(7);

    //토큰에서 값 찾아오기
    String userId = jwtUtil.readToken(token).getUserId();
    String email = jwtUtil.readToken(token).getEmail();

    // 유저 찾아오기
    User user = PasswordFind(userId,email);
    // 인코딩
    String password = passwordEncoder.encode(changPasswordRequestDto.getPassword());
    // 변경, 저장
    user.change(password);
    userRepository.save(user);

    MessageResponseDto messageResponseDto = new MessageResponseDto("비밀번호를 변경했습니다. ", HttpStatus.OK.value());
    return ResponseEntity.status(HttpStatus.OK).body(messageResponseDto);
}

사실상 글만 가득한 블로근데 이런게 들어가니까 이상하다. 

'Spring' 카테고리의 다른 글

항해 99 실전 프로젝트 - CRUD  (0) 2023.10.09
항해 99 6주차 - 마무리  (0) 2023.09.25
항해 99 6주차 - 1일  (0) 2023.09.19
항해 99 5주 - 마무리  (0) 2023.09.17
항해 99 5주차 - 6일  (0) 2023.09.16