728x90
DTO
LoginRequset 만들기
@AllArgsConstructor
@NoArgsConstructor
@Getter
public class UserLoginRequest {
private String userName;
private String password;
}
로그인 하기 위해 userName과 password를 받아올 예정이므로 두 변수만 생성합니다.
LoginResponse 만들기
@AllArgsConstructor
@NoArgsConstructor
@Getter @Builder
public class UserLoginResponse {
private String jwt;
}
로그인 한 결과로 jwt를 반환 받을 계획입니다.
Controller
...
public class UserController {
...
@PostMapping("/login")
public Response<UserLoginResponse> login(@RequestBody UserLoginRequest dto){
UserLoginResponse loginUser = userService.login(dto);
return Response.success(loginUser);
}
}
받아온 정보를 UserLoginRequest를 통해 받은 후 처리된 정보(JWT)를 UserLoginResponse에 담아 반환합니다.
Service
...
public class UserService {
...
@Value("${jwt.secret}")
private String secretKey;
private long expireTimeMs = 1000 * 60 * 60;
...
public UserLoginResponse login(UserLoginRequest dto) {
// 유저가 있는지 확인
User user = userRepository.findByUserName(dto.getUserName())
.orElseThrow(
() -> new SNSAppException(ErrorCode.USERNAME_NOT_FOUND, String.format("%s는 회원이 아닙니다.", dto.getUserName()))
);
// 비밀번호가 일치하는지 확인
if (!encoder.matches(dto.getPassword(), user.getPassword())) {
throw new SNSAppException(ErrorCode.INVALID_PASSWORD, String.format("userName 또는 password가 일치하지 않습니다."));
}
// 토큰 리턴
return UserLoginResponse.builder()
.jwt(JwtUtil.createJwt(dto.getUserName(), secretKey, expireTimeMs))
.build();
}
}
로그인을 시도했을 때 검증해야하는 조건들이 있습니다.
- 로그인을 하기 위해 입력한 정보에 맞는 유저가 존재하는가?
- 존재하지 않는다면 예외처리한다.
- 로그인을 시도한 유저가 존재하지만, 비밀번호가 일치하는가?
- 일치하지 않는다면 예외처리한다.
조건들을 추가하고 일치하지 않을 때마다 예외를 던져야합니다.
모든 조건에 부합되었다면 JwtUtil에서 만들었던 createJwt 메서드를 사용하여 토큰을 리턴합니다.
메서드를 사용하기 위한 파라미터로는 userName, secretkey, expireTimeMs가 필요합니다.
결과
반응형
'프로젝트 > Archive' 카테고리의 다른 글
[03] 포스트 기능 만들기 준비 (0) | 2022.12.23 |
---|---|
[02] 로그인 기능 만들기 - 2 (0) | 2022.12.21 |
[02] 로그인 기능 만들기 - 0 (0) | 2022.12.21 |
[01] 회원가입 기능 만들기 - 1 (0) | 2022.12.21 |
[01] 회원가입 기능 만들기 - 0 (1) | 2022.12.21 |