Skip to content

Commit

Permalink
[ADD] OAuth 로그인 & 회원가입 #115
Browse files Browse the repository at this point in the history
  • Loading branch information
sunseo18 committed Sep 12, 2023
1 parent e9a85b8 commit 5b60ea6
Show file tree
Hide file tree
Showing 11 changed files with 121 additions and 28 deletions.
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
package indipage.org.indipage.api.auth.controller;

import indipage.org.indipage.api.auth.dto.request.LoginRequestDto;
import indipage.org.indipage.auth.service.AuthService;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.web.bind.annotation.*;
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.ResponseStatus;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
Expand All @@ -15,10 +20,9 @@ public class AuthController {
@PostMapping("/login")
@ResponseStatus(HttpStatus.OK)
public void login(
@RequestParam(value = "platform") final String platform,
@RequestParam(value = "token") final String token
@RequestBody LoginRequestDto requestDto
) {
authService.login(platform, token);
authService.login(requestDto);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package indipage.org.indipage.api.auth.dto.request;

import indipage.org.indipage.auth.Platform;
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor
public class LoginRequestDto {

private String accessToken;

private Platform platform;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package indipage.org.indipage.api.auth.dto.response;

import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Getter
@AllArgsConstructor(access = AccessLevel.PRIVATE)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@Builder
public class LoginResponseDto {

private String accessToken;

public static LoginResponseDto of(String accessToken) {
return new LoginResponseDto(accessToken);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,18 +6,26 @@
import indipage.org.indipage.api.ticket.service.TicketService;
import indipage.org.indipage.api.user.controller.dto.response.HasReceivedTicketResponseDto;
import indipage.org.indipage.api.user.controller.dto.response.UserDto;
import indipage.org.indipage.domain.*;
import indipage.org.indipage.auth.Platform;
import indipage.org.indipage.domain.Article;
import indipage.org.indipage.domain.ArticleRepository;
import indipage.org.indipage.domain.InviteSpaceRelationRepository;
import indipage.org.indipage.domain.Relation.InviteSpaceRelation;
import indipage.org.indipage.domain.Space;
import indipage.org.indipage.domain.SpaceRepository;
import indipage.org.indipage.domain.Ticket;
import indipage.org.indipage.domain.User;
import indipage.org.indipage.domain.UserRepository;
import indipage.org.indipage.exception.Error;
import indipage.org.indipage.exception.model.ConflictException;
import indipage.org.indipage.exception.model.NotFoundException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import javax.transaction.Transactional;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
Expand Down
9 changes: 4 additions & 5 deletions src/main/java/indipage/org/indipage/auth/JwtProvider.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,14 +7,13 @@
import io.jsonwebtoken.Header;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.security.Keys;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.nio.charset.StandardCharsets;
import java.security.Key;
import java.util.Base64;
import java.util.Date;
import javax.annotation.PostConstruct;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

@Component
public class JwtProvider {
Expand All @@ -27,7 +26,7 @@ protected void init() {
jwtSecret = Base64.getEncoder().encodeToString(jwtSecret.getBytes(StandardCharsets.UTF_8));
}

public String issuedToken(String userId) {
public String issuedToken(Long userId) {
final Date now = new Date();

final Claims claims = Jwts.claims().setSubject("access_token").setIssuedAt(now)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,11 @@
import lombok.AccessLevel;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Builder
@Getter
@JsonIgnoreProperties(ignoreUnknown = true)
@NoArgsConstructor(access = AccessLevel.PRIVATE)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
Expand Down
30 changes: 26 additions & 4 deletions src/main/java/indipage/org/indipage/auth/service/AuthService.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,12 @@
package indipage.org.indipage.auth.service;

import indipage.org.indipage.api.auth.dto.request.LoginRequestDto;
import indipage.org.indipage.api.auth.dto.response.LoginResponseDto;
import indipage.org.indipage.auth.JwtProvider;
import indipage.org.indipage.auth.Platform;
import indipage.org.indipage.auth.dto.OAuthUserResponseDto;
import indipage.org.indipage.domain.User;
import indipage.org.indipage.domain.UserRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
Expand All @@ -12,13 +17,30 @@
public class AuthService {

private final OAuthClientProvider clientProvider;
private final UserRepository userRepository;
private final JwtProvider jwtProvider;

public void login(final String platform, final String accessToken) {
OAuthClient client = clientProvider.getClient(platform);
OAuthUserResponseDto oAuthUserResponseDto = client.getUser(accessToken);
public LoginResponseDto login(final LoginRequestDto requestDto) {
OAuthClient client = clientProvider.getClient(requestDto.getPlatform());
OAuthUserResponseDto responseDto = client.getUser(requestDto.getAccessToken());

// TODO: 회원가입, 로그인 및 토큰 반환 기능 구현
String accessToken = userRepository.findByEmailAndName(responseDto.getEmail(), responseDto.getName())
.map(user -> jwtProvider.issuedToken((user.getId())))
.orElse(singUp(requestDto.getPlatform(), responseDto));

if (accessToken.isEmpty()) {
userRepository.save(
User.of(responseDto.getEmail(), responseDto.getName(), requestDto.getPlatform()));
}

return LoginResponseDto.of(accessToken);
}

public String singUp(final Platform platform, final OAuthUserResponseDto responseDto) {
User user = userRepository.save(
User.of(responseDto.getEmail(), responseDto.getName(), platform));

return jwtProvider.issuedToken(user.getId());
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ void initializeOAuthClientMap() {
oAuthClientMap.put(Platform.GOOGLE, googleOAuthClient);
}

public OAuthClient getClient(final String platformName) {
return oAuthClientMap.get(Platform.valueOf(platformName));
public OAuthClient getClient(final Platform platformName) {
return oAuthClientMap.get(platformName);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public OAuthUserResponseDto getUser(final String idToken) {
PublicKey publicKey = publicKeyGenerator.generatePublicKey(header, googlePublicKeys);

Claims claims = tokenProcessor.extractClaims(idToken, publicKey);

tokenProcessor.validate(claims);
return OAuthUserResponseDto.generateAppleUserResponseDto(claims.get("email", String.class));
}

Expand Down
27 changes: 22 additions & 5 deletions src/main/java/indipage/org/indipage/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -3,14 +3,21 @@
import indipage.org.indipage.auth.Platform;
import indipage.org.indipage.domain.Relation.ArticleBookmarkRelation;
import indipage.org.indipage.domain.Relation.SpaceBookmarkRelation;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

import javax.persistence.*;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
Expand Down Expand Up @@ -42,4 +49,14 @@ public class User extends CreatedTimeBaseEntity {
public void updateSlideAt() {
this.slideAt = LocalDateTime.now();
}

private User(String email, String name, Platform platform) {
this.email = email;
this.name = name;
this.platform = platform;
}

public static User of(String email, String name, Platform platform) {
return new User(email, name, platform);
}
}
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
package indipage.org.indipage.domain;

import org.springframework.data.repository.Repository;

import java.util.Optional;
import org.springframework.data.repository.Repository;

public interface UserRepository extends Repository<User, Long> {
Optional<User> findById(Long id);

Optional<User> findByEmailAndName(String email, String name);

User save(User user);
}

0 comments on commit 5b60ea6

Please sign in to comment.