-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge branch 'develop' into bug/#140-login_response
- Loading branch information
Showing
18 changed files
with
304 additions
and
93 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
27 changes: 27 additions & 0 deletions
27
src/main/java/io/oeid/mogakgo/domain/auth/application/AuthUserService.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,27 @@ | ||
package io.oeid.mogakgo.domain.auth.application; | ||
|
||
import io.oeid.mogakgo.domain.user.application.dto.res.UserOAuth2Response; | ||
import io.oeid.mogakgo.domain.user.domain.User; | ||
import io.oeid.mogakgo.domain.user.infrastructure.UserJpaRepository; | ||
import lombok.RequiredArgsConstructor; | ||
import org.springframework.stereotype.Service; | ||
import org.springframework.transaction.annotation.Transactional; | ||
|
||
@Service | ||
@RequiredArgsConstructor | ||
public class AuthUserService { | ||
|
||
private final UserJpaRepository userRepository; | ||
|
||
@Transactional | ||
public UserOAuth2Response manageOAuth2User(long githubPk, String githubId, String avatarUrl, | ||
String githubUrl, | ||
String repositoryUrl) { | ||
User user = userRepository.findByGithubPk(githubPk).orElseGet(() -> userRepository.save( | ||
User.of(githubPk, githubId, avatarUrl, githubUrl, repositoryUrl))); | ||
user.updateGithubInfo(githubId, avatarUrl, githubUrl, repositoryUrl); | ||
return UserOAuth2Response.from(user); | ||
} | ||
|
||
|
||
} |
52 changes: 0 additions & 52 deletions
52
src/main/java/io/oeid/mogakgo/domain/auth/oauth/GithubOAuth2UserService.java
This file was deleted.
Oops, something went wrong.
54 changes: 44 additions & 10 deletions
54
src/main/java/io/oeid/mogakgo/domain/auth/oauth/OAuth2AuthenticationSuccessHandler.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,48 +1,82 @@ | ||
package io.oeid.mogakgo.domain.auth.oauth; | ||
|
||
import io.oeid.mogakgo.domain.auth.application.AuthUserService; | ||
import io.oeid.mogakgo.domain.auth.jwt.JwtAuthenticationToken; | ||
import io.oeid.mogakgo.domain.auth.jwt.JwtHelper; | ||
import io.oeid.mogakgo.domain.auth.jwt.JwtRedisDao; | ||
import io.oeid.mogakgo.domain.auth.jwt.JwtToken; | ||
import io.oeid.mogakgo.domain.user.domain.enums.Role; | ||
import io.oeid.mogakgo.domain.user.application.dto.res.UserOAuth2Response; | ||
import jakarta.servlet.ServletException; | ||
import jakarta.servlet.http.HttpServletRequest; | ||
import jakarta.servlet.http.HttpServletResponse; | ||
import java.io.IOException; | ||
import java.util.HashMap; | ||
import java.util.Map; | ||
import lombok.RequiredArgsConstructor; | ||
import lombok.extern.slf4j.Slf4j; | ||
import org.springframework.security.core.Authentication; | ||
import org.springframework.security.core.GrantedAuthority; | ||
import org.springframework.security.core.context.SecurityContextHolder; | ||
import org.springframework.security.oauth2.core.user.DefaultOAuth2User; | ||
import org.springframework.security.oauth2.core.user.OAuth2User; | ||
import org.springframework.security.web.authentication.AuthenticationSuccessHandler; | ||
import org.springframework.stereotype.Component; | ||
|
||
@Slf4j | ||
@Component | ||
@RequiredArgsConstructor | ||
public class OAuth2AuthenticationSuccessHandler implements AuthenticationSuccessHandler { | ||
|
||
private final JwtHelper jwtHelper; | ||
private final JwtRedisDao jwtRedisDao; | ||
private final AuthUserService authUserService; | ||
|
||
@Override | ||
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, | ||
Authentication authentication) throws IOException, ServletException { | ||
log.info("OAuth2 Login Success -> onAuthenticationSuccess"); | ||
// 인증 완료된 유저 정보를 불러오기 | ||
OAuth2User oAuth2User = (OAuth2User) authentication.getPrincipal(); | ||
JwtToken jwtToken = jwtHelper.sign(Long.parseLong(oAuth2User.getName()), | ||
new String[]{Role.ROLE_USER.name()}); | ||
// 인증 완료된 유저 정보 기반 유저 엔티티 관리 및 결과 반환 | ||
var userOAuth2Response = manageUserEntity(Long.parseLong(oAuth2User.getName()), oAuth2User); | ||
// JWT 토큰 생성 및 저장 | ||
var jwtToken = generateJwtToken(userOAuth2Response); | ||
// 완료된 인증 정보 기반 새로운 authentication 생성 | ||
oAuth2User = generateAuthentication(userOAuth2Response, jwtToken); | ||
// 새로운 authentication을 SecurityContextHolder에 저장 | ||
authentication = new JwtAuthenticationToken(oAuth2User, null, | ||
oAuth2User.getAuthorities()); | ||
SecurityContextHolder.getContext().setAuthentication(authentication); | ||
// 로그인 성공 페이지로 리다이렉트 | ||
response.sendRedirect("/oauth2/login/success"); | ||
} | ||
|
||
private UserOAuth2Response manageUserEntity(long githubPk, OAuth2User oAuth2User) { | ||
String githubId = oAuth2User.getAttribute("login"); | ||
String avatarUrl = oAuth2User.getAttribute("avatar_url"); | ||
String githubUrl = oAuth2User.getAttribute("html_url"); | ||
String repositoryUrl = oAuth2User.getAttribute("repos_url"); | ||
return authUserService.manageOAuth2User(githubPk, githubId, avatarUrl, githubUrl, | ||
repositoryUrl); | ||
} | ||
|
||
private JwtToken generateJwtToken(UserOAuth2Response response) { | ||
long userId = response.getUserId(); | ||
String[] roles = response.getAuthorities().stream().map(GrantedAuthority::getAuthority) | ||
.toArray(String[]::new); | ||
var jwtToken = jwtHelper.sign(userId, roles); | ||
jwtRedisDao.saveTokens(jwtToken.getAccessToken(), jwtToken.getRefreshToken()); | ||
return jwtToken; | ||
} | ||
|
||
private OAuth2User generateAuthentication(UserOAuth2Response oAuth2Response, | ||
JwtToken jwtToken) { | ||
Map<String, Object> attributes = new HashMap<>(); | ||
attributes.put("id", Long.parseLong(oAuth2User.getName())); | ||
attributes.put("signUpComplete", oAuth2User.getAttribute("signupComplete")); | ||
attributes.put("id", oAuth2Response.getUserId()); | ||
attributes.put("signUpComplete", oAuth2Response.getSignUpComplete()); | ||
attributes.put("accessToken", jwtToken.getAccessToken()); | ||
attributes.put("refreshToken", jwtToken.getRefreshToken()); | ||
attributes.put("refreshTokenExpireTime", jwtToken.getRefreshTokenExpirySeconds()); | ||
oAuth2User = new DefaultOAuth2User(oAuth2User.getAuthorities(), attributes, "id"); | ||
authentication = new JwtAuthenticationToken(oAuth2User, null, | ||
oAuth2User.getAuthorities()); | ||
SecurityContextHolder.getContext().setAuthentication(authentication); | ||
response.sendRedirect("/oauth2/login/success"); | ||
return new DefaultOAuth2User(oAuth2Response.getAuthorities(), attributes, "id"); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
20 changes: 20 additions & 0 deletions
20
src/main/java/io/oeid/mogakgo/domain/user/application/dto/res/UserDevelopLanguageRes.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,20 @@ | ||
package io.oeid.mogakgo.domain.user.application.dto.res; | ||
|
||
import io.oeid.mogakgo.domain.user.domain.UserDevelopLanguageTag; | ||
import io.oeid.mogakgo.domain.user.domain.enums.DevelopLanguage; | ||
import lombok.AccessLevel; | ||
import lombok.AllArgsConstructor; | ||
import lombok.Getter; | ||
|
||
@Getter | ||
@AllArgsConstructor(access = AccessLevel.PRIVATE) | ||
public class UserDevelopLanguageRes { | ||
|
||
private final DevelopLanguage language; | ||
private final Integer byteSize; | ||
|
||
public static UserDevelopLanguageRes from(UserDevelopLanguageTag userDevelopLanguageTag) { | ||
return new UserDevelopLanguageRes(userDevelopLanguageTag.getDevelopLanguage(), | ||
userDevelopLanguageTag.getByteSize()); | ||
} | ||
} |
Oops, something went wrong.