Skip to content
Merged
Original file line number Diff line number Diff line change
@@ -1,22 +1,35 @@
package org.example.siljeun.domain.auth.controller;

import lombok.RequiredArgsConstructor;
import org.example.siljeun.domain.auth.dto.LoginRequest;
import org.example.siljeun.domain.auth.dto.LoginResponse;
import org.example.siljeun.domain.auth.dto.request.LoginRequest;
import org.example.siljeun.domain.auth.dto.request.SignUpRequest;
import org.example.siljeun.domain.auth.dto.response.LoginResponse;
import org.example.siljeun.domain.auth.dto.response.SignUpResponse;
import org.example.siljeun.domain.auth.service.AuthService;
import org.example.siljeun.global.dto.ResponseDto;
import org.springframework.stereotype.Controller;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@Controller
@RestController
@RequestMapping("/auth")
@RequiredArgsConstructor
public class AuthController {

private final AuthService authService;

@PostMapping("/signup")
public ResponseEntity<SignUpResponse> signUp(@RequestBody SignUpRequest request) {
SignUpResponse response = authService.signUp(request);
if (response != null) {
return ResponseEntity.ok(response);
}
return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(null);
}

@PostMapping("/login")
public ResponseDto<LoginResponse> login(@RequestBody LoginRequest request) {
try {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package org.example.siljeun.domain.auth.dto;
package org.example.siljeun.domain.auth.dto.request;

public record LoginRequest(String username, String password) {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package org.example.siljeun.domain.auth.dto.request;

import org.example.siljeun.domain.user.enums.Provider;
import org.example.siljeun.domain.user.enums.Role;

public record SignUpRequest(String email,
String username,
String password,
String nickname,
Role role,
Provider provider) {

}
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
package org.example.siljeun.domain.auth.dto;
package org.example.siljeun.domain.auth.dto.response;

import lombok.Getter;
import lombok.RequiredArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@RequiredArgsConstructor
public class LoginResponse {

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package org.example.siljeun.domain.auth.dto.response;

import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class SignUpResponse {

private Long id;
private String email;
private String username;

}
Original file line number Diff line number Diff line change
@@ -1,26 +1,35 @@
package org.example.siljeun.domain.auth.service;

import lombok.RequiredArgsConstructor;
import org.example.siljeun.domain.auth.dto.LoginResponse;
import org.example.siljeun.domain.auth.dto.request.SignUpRequest;
import org.example.siljeun.domain.auth.dto.response.LoginResponse;
import org.example.siljeun.domain.auth.dto.response.SignUpResponse;
import org.example.siljeun.domain.user.entity.User;
import org.example.siljeun.domain.user.repository.UserRepository;
import org.example.siljeun.global.security.JwtUtil;
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.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class AuthService {

private final AuthenticationManagerBuilder authManagerBuilder;
private final JwtUtil jwtUtil;
private final UserRepository userRepository;
private final PasswordEncoder passwordEncoder;

public LoginResponse login(String username, String password) {
Authentication authentication = authManagerBuilder.getObject()
.authenticate(new UsernamePasswordAuthenticationToken(username, password));
public SignUpResponse signUp(SignUpRequest request) {
// 비밀번호 암호화
String password = passwordEncoder.encode(request.password());

User user = new User(request.email(), request.username(), password, request.nickname(),
request.role(), request.provider());
User savedUser = userRepository.save(user);

SecurityContextHolder.getContext().setAuthentication(authentication);
return new SignUpResponse(savedUser.getId(), savedUser.getEmail(), savedUser.getUsername());
}

public LoginResponse login(String username, String password) {
String token = jwtUtil.createToken(username);

return new LoginResponse(token);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
import org.example.siljeun.domain.concert.dto.response.ConcertDetailResponse;
import org.example.siljeun.domain.concert.dto.response.ConcertSimpleResponse;
import org.example.siljeun.domain.concert.service.ConcertService;
import org.example.siljeun.global.security.CustomUserDetails;
import org.example.siljeun.global.security.PrincipalDetails;
import org.springframework.http.ResponseEntity;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.DeleteMapping;
Expand All @@ -31,7 +31,7 @@ public class ConcertController {
@PostMapping
public ResponseEntity<Long> createConcert(
@RequestBody @Valid ConcertCreateRequest request,
@AuthenticationPrincipal CustomUserDetails userDetails
@AuthenticationPrincipal PrincipalDetails userDetails
) {
Long concertId = concertService.createConcert(request, userDetails.getUserId());
return ResponseEntity.created(URI.create("/concerts" + concertId)).body(concertId);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ public String getAccessToken(String code) {

MultiValueMap<String, String> params = new LinkedMultiValueMap<>();
params.add("grant_type", "authorization_code");
params.add("client_id", properties.getClientId());
params.add("redirect_uri", properties.getRedirectUri());
params.add("client_id", "eaee0e144aeb9afef54d5c449448baea");
params.add("redirect_uri", "http://localhost:8080/oauth/kakao/callback");
params.add("code", code);

HttpEntity<MultiValueMap<String, String>> request = new HttpEntity<>(params, headers);

ResponseEntity<Map<String, Object>> response = restTemplate.exchange(
properties.getTokenUri(),
"https://kauth.kakao.com/oauth/token",
HttpMethod.POST,
request,
new ParameterizedTypeReference<>() {
Expand All @@ -57,7 +57,7 @@ public KakaoUserInfo getUserInfo(String accessToken) {
HttpEntity<Void> request = new HttpEntity<>(headers);

ResponseEntity<KakaoUserInfo> response = restTemplate.exchange(
properties.getUserInfoUri(),
"https://kapi.kakao.com/v2/user/me",
HttpMethod.GET,
request,
KakaoUserInfo.class
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.example.siljeun.domain.oauth.client;

public class NaverApiClient {

}
Original file line number Diff line number Diff line change
@@ -1,14 +1,41 @@
package org.example.siljeun.domain.oauth.dto;

import java.util.Map;
import lombok.AllArgsConstructor;
import lombok.Getter;

@Getter
@AllArgsConstructor
public class KakaoUserInfo {
public class KakaoUserInfo implements OAuth2UserInfo {

private Long id;
private String email;
private String nickname;
private Map<String, Object> attributes;
private Map<String, Object> attributesAccount;
private Map<String, Object> attributesProfile;

public KakaoUserInfo(Map<String, Object> attributes) {
this.attributes = attributes;
this.attributesAccount = (Map<String, Object>) attributes.get("kakao_account");
this.attributesProfile = (Map<String, Object>) attributesAccount.get("profile");
}

@Override
public String getProvider() {
return "Kakao";
}

@Override
public String getProviderId() {
return attributes.get("id").toString();
}

@Override
public String getEmail() {
return attributesAccount.get("email").toString();
}

@Override
public String getNickname() {
return attributesProfile.get("nickname").toString();
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package org.example.siljeun.domain.oauth.dto;

public class NaverUserInfo {

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package org.example.siljeun.domain.oauth.dto;

import java.util.Map;

public interface OAuth2UserInfo {

public Map<String, Object> getAttributes();

String getProvider();

String getProviderId();

String getEmail();

String getNickname();

}
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ public String kakaoLogin(String code) {

private User registerUser(KakaoUserInfo userInfo) {
User user = new User(userInfo.getEmail(), userInfo.getNickname(), Provider.KAKAO,
userInfo.getId());
userInfo.getProviderId());
return userRepository.save(user);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package org.example.siljeun.domain.oauth.service;

import org.springframework.stereotype.Service;

@Service
public class NaverOAuthService {

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,4 +5,6 @@
@Controller
public class UserController {

}
// TODO: 마이 페이지, 회원 정보 수정 등

}
17 changes: 14 additions & 3 deletions src/main/java/org/example/siljeun/domain/user/entity/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,15 +9,16 @@
import jakarta.persistence.Id;
import jakarta.persistence.Table;
import java.time.LocalDateTime;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import org.example.siljeun.domain.user.enums.Provider;
import org.example.siljeun.domain.user.enums.Role;
import org.example.siljeun.global.entity.BaseEntity;

@Getter
@Entity
@Table(name = "users")
@NoArgsConstructor
public class User extends BaseEntity {

@Id
Expand Down Expand Up @@ -47,11 +48,21 @@ public class User extends BaseEntity {
@Column(nullable = false)
private Provider provider;

private Long providerId;
private String providerId;

private LocalDateTime deletedAt;

public User(String email, String nickname, Provider provider, Long providerId) {
public User(String email, String username, String password, String nickname, Role role,
Provider provider) {
this.email = email;
this.username = username;
this.password = password;
this.nickname = nickname;
this.role = role;
this.provider = provider;
}

public User(String email, String nickname, Provider provider, String providerId) {
this.email = email;
this.nickname = nickname;
this.provider = provider;
Expand Down
Original file line number Diff line number Diff line change
@@ -1,26 +1,25 @@
package org.example.siljeun.domain.user.service;

import java.util.List;
import lombok.RequiredArgsConstructor;
import org.example.siljeun.domain.user.entity.User;
import org.example.siljeun.domain.user.repository.UserRepository;
import org.example.siljeun.global.security.PrincipalDetails;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class CustomUserDetailsService implements UserDetailsService {
public class PrincipalDetailsService implements UserDetailsService {

private final UserRepository userRepository;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
User user = userRepository.findByUsername(username)
User principal = userRepository.findByUsername(username)
.orElseThrow(() -> new UsernameNotFoundException("사용자를 찾을 수 없습니다."));
return new org.springframework.security.core.userdetails.User(user.getUsername(),
user.getPassword(), List.of());
return new PrincipalDetails(principal);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package org.example.siljeun.global.config;

import lombok.Getter;
import lombok.Setter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Getter
@Setter
@Configuration
@ConfigurationProperties(prefix = "naver")
public class NaverOAuthProperties {

private String clientId;
private String clientSecret;
private String redirectUri;
private String tokenUri;
private String userInfoUri;

}
Loading
Loading