Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 10 additions & 3 deletions src/main/java/com/back/domain/user/service/UserAuthService.java
Original file line number Diff line number Diff line change
Expand Up @@ -87,8 +87,8 @@ public String generateUniqueNickname(String baseNickname) {

// 리프레시 토큰 관련

public void issueTokens(HttpServletResponse response, Long userId, String email) {
String accessToken = jwtUtil.generateAccessToken(userId, email);
public void issueTokens(HttpServletResponse response, Long userId, String email, String nickname) {
String accessToken = jwtUtil.generateAccessToken(userId, email, nickname);
String refreshToken = refreshTokenService.generateRefreshToken(userId, email);

jwtUtil.addAccessTokenToCookie(response, accessToken);
Expand All @@ -112,8 +112,15 @@ public boolean refreshTokens(HttpServletRequest request, HttpServletResponse res
Long userId = refreshTokenEntity.getUserId();
String email = refreshTokenEntity.getEmail();

// DB에서 현재 nickname 조회
Optional<User> user = userRepository.findById(userId);
if (user.isEmpty()) {
return false;
}
String nickname = user.get().getNickname();

String newRefreshToken = refreshTokenService.rotateToken(oldRefreshToken);
String newAccessToken = jwtUtil.generateAccessToken(userId, email);
String newAccessToken = jwtUtil.generateAccessToken(userId, email, nickname);

jwtUtil.addAccessTokenToCookie(response, newAccessToken);
jwtUtil.addRefreshTokenToCookie(response, newRefreshToken);
Expand Down
14 changes: 2 additions & 12 deletions src/main/java/com/back/global/jwt/JwtUtil.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,13 +28,14 @@ public JwtUtil(@Value("${custom.jwt.secretKey}") String secretKey,
this.accessTokenExpiration = accessTokenExpiration * 1000;
}

public String generateAccessToken(Long userId, String email) {
public String generateAccessToken(Long userId, String email, String nickname) {
Date now = new Date();
Date expiration = new Date(now.getTime() + accessTokenExpiration);

return Jwts.builder()
.subject(String.valueOf(userId))
.claim("email", email)
.claim("nickname", nickname)
.issuedAt(now)
.expiration(expiration)
.signWith(secretKey)
Expand All @@ -50,17 +51,6 @@ public void addAccessTokenToCookie(HttpServletResponse response, String accessTo
response.addCookie(cookie);
}

public String getAccessTokenFromCookie(HttpServletRequest request) {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (ACCESS_TOKEN_COOKIE_NAME.equals(cookie.getName())) {
return cookie.getValue();
}
}
}
return null;
}

public void removeAccessTokenCookie(HttpServletResponse response) {
Cookie cookie = new Cookie(ACCESS_TOKEN_COOKIE_NAME, null);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/back/global/rq/Rq.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ public User getActor() {
return User.builder()
.id(securityUser.getId())
.email(securityUser.getEmail())
.nickname(securityUser.getName())
.nickname(securityUser.getNickname())
.role(role)
.build();
})
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -116,7 +116,7 @@ private void work(HttpServletRequest request, HttpServletResponse response, Filt

// accessToken이 만료됐으면 새로 발급
if (isAccessTokenExists && !isAccessTokenValid) {
String newAccessToken = jwtUtil.generateAccessToken(user.getId(), user.getEmail());
String newAccessToken = jwtUtil.generateAccessToken(user.getId(), user.getEmail(), user.getNickname());
rq.setCrossDomainCookie("accessToken", newAccessToken, accessTokenExpiration);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,6 @@
package com.back.global.security;

import com.back.domain.user.service.UserService;
import com.back.global.jwt.JwtUtil;
import com.back.global.rq.Rq;
import com.back.domain.user.service.UserAuthService;
import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
Expand All @@ -13,14 +11,12 @@
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.util.concurrent.TimeUnit;

@Component
@RequiredArgsConstructor
public class CustomOAuth2LoginSuccessHandler implements AuthenticationSuccessHandler {
private final Rq rq;
private final JwtUtil jwtUtil;
private final UserService userService;

private final UserAuthService userAuthService;

@Value("${FRONTEND_URL}")
private String frontendUrl;
Expand All @@ -29,11 +25,8 @@ public class CustomOAuth2LoginSuccessHandler implements AuthenticationSuccessHan
public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
SecurityUser securityUser = (SecurityUser) authentication.getPrincipal();

// Access Token 생성
String accessToken = jwtUtil.generateAccessToken(securityUser.getId(), securityUser.getEmail());

// 쿠키에 토큰 저장
rq.setCrossDomainCookie("accessToken", accessToken, (int) TimeUnit.MINUTES.toSeconds(20));
// Access Token과 Refresh Token 발급
userAuthService.issueTokens(response, securityUser.getId(), securityUser.getEmail(), securityUser.getNickname());

// 프론트엔드로 리다이렉트
String redirectUrl = frontendUrl + "/oauth/success";
Expand Down
12 changes: 8 additions & 4 deletions src/main/java/com/back/global/security/SecurityUser.java
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ public class SecurityUser extends User implements OAuth2User {
private Long id;

@Getter
private String name;
private String nickname;

@Getter
private String email;
Expand All @@ -24,13 +24,13 @@ public class SecurityUser extends User implements OAuth2User {
public SecurityUser(
long id,
String email,
String name,
String nickname,
Collection<? extends GrantedAuthority> authorities,
Map<String, Object> attributes
) {
super(email, "", authorities); // OAuth2에서는 빈 패스워드
this.id = id;
this.name = name;
this.nickname = nickname;
this.email = email;
this.attributes = attributes;
}
Expand All @@ -42,6 +42,10 @@ public Map<String, Object> getAttributes() {

@Override
public String getName() {
return name; // OAuth2User 인터페이스용
return nickname; // OAuth2User 인터페이스용 - nickname 반환
}

public String getNickname() {
return getName();
}
}