Skip to content

Commit 840dc09

Browse files
authored
[#186] redirectUri에 한글이 들어가면 에러 터지는 문제 해결 (#187)
* fix(Login): redirectUri 안에 쿼리 파라미터로 한글이 들어가면 안되는 이슈 - 1. redirectUri를 임시로 보관하는 과정에서 쿠키에 담는데, 이때 쿠키에는 한글이 들어갈 수 없어서(파싱을 못함) 예외가 발생했음 - 따라서, 쿠키에 담기 전에 URLEncoder로 encode하고 꺼내올 때는 또 반대로 decode를 하여 문제 해결 - 2. 해당 redirectUri Redirect 시에도 한글로된 파라미터가 있으면 안됨 - 쿼리에서 한글로 전달될 수 있는 부분만을 재 인코딩 해서 프론트에 전달 - 현재 name=으로 하드코딩 하였음
1 parent 1704b9e commit 840dc09

File tree

5 files changed

+34
-6
lines changed

5 files changed

+34
-6
lines changed

src/main/java/com/prgrms/mukvengers/domain/proposal/api/ProposalController.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.prgrms.mukvengers.domain.proposal.api;
22

3+
import static org.springframework.http.HttpStatus.*;
34
import static org.springframework.http.MediaType.*;
45

56
import java.net.URI;
@@ -15,6 +16,7 @@
1516
import org.springframework.web.bind.annotation.PostMapping;
1617
import org.springframework.web.bind.annotation.RequestBody;
1718
import org.springframework.web.bind.annotation.RequestMapping;
19+
import org.springframework.web.bind.annotation.ResponseStatus;
1820
import org.springframework.web.bind.annotation.RestController;
1921
import org.springframework.web.util.UriComponentsBuilder;
2022

@@ -119,15 +121,14 @@ public class ProposalController {
119121
* @return
120122
*/
121123
@PatchMapping(value = "/proposals/{proposalId}", consumes = APPLICATION_JSON_VALUE)
122-
public ResponseEntity<Void> changeProposalStatus
124+
@ResponseStatus(NO_CONTENT)
125+
public void changeProposalStatus
123126
(
124127
@PathVariable Long proposalId,
125128
@RequestBody @Valid UpdateProposalRequest proposalRequest,
126129
@AuthenticationPrincipal JwtAuthentication user
127130
) {
128131
proposalService.updateProposalStatus(proposalRequest, user.id(), proposalId);
129-
130-
return ResponseEntity.ok().build();
131132
}
132133

133134
@DeleteMapping(value = "/proposals/{proposalId}")

src/main/java/com/prgrms/mukvengers/global/security/oauth/handler/OAuthAuthenticationFailureHandler.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
package com.prgrms.mukvengers.global.security.oauth.handler;
22

33
import static com.prgrms.mukvengers.global.security.oauth.repository.HttpCookieOAuthAuthorizationRequestRepository.*;
4+
import static java.nio.charset.StandardCharsets.*;
45

56
import java.io.IOException;
7+
import java.net.URLDecoder;
68

79
import javax.servlet.http.Cookie;
810
import javax.servlet.http.HttpServletRequest;
@@ -31,10 +33,11 @@ public void onAuthenticationFailure(HttpServletRequest request, HttpServletRespo
3133
AuthenticationException exception) throws IOException {
3234
String redirectUrl = CookieUtil.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME)
3335
.map(Cookie::getValue)
36+
.map(cookie -> URLDecoder.decode(cookie, UTF_8))
3437
.orElse(DEFAULT_TARGET_URL);
3538

3639
String targetUrl = UriComponentsBuilder.fromUriString(redirectUrl)
37-
.queryParam("error", exception.getMessage())
40+
.queryParam("error", exception.getMessage()) // TODO: exception.getMessage() -> error code
3841
.build().toUriString();
3942

4043
httpCookieOAuthAuthorizationRequestRepository.removeAuthorizationRequestCookies(request, response);

src/main/java/com/prgrms/mukvengers/global/security/oauth/handler/OAuthAuthenticationSuccessHandler.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,11 @@
11
package com.prgrms.mukvengers.global.security.oauth.handler;
22

33
import static com.prgrms.mukvengers.global.security.oauth.repository.HttpCookieOAuthAuthorizationRequestRepository.*;
4+
import static java.nio.charset.StandardCharsets.*;
45

56
import java.io.IOException;
7+
import java.net.URLDecoder;
8+
import java.net.URLEncoder;
69

710
import javax.servlet.ServletException;
811
import javax.servlet.http.Cookie;
@@ -29,6 +32,7 @@
2932
public class OAuthAuthenticationSuccessHandler
3033
extends SavedRequestAwareAuthenticationSuccessHandler {
3134

35+
public static final String NAME_QUERY = "name=";
3236
private final TokenService tokenService;
3337

3438
@Override
@@ -51,13 +55,29 @@ public void onAuthenticationSuccess(HttpServletRequest request, HttpServletRespo
5155
private String determineTargetUrl(HttpServletRequest request, String accessToken) {
5256
String targetUrl = CookieUtil.getCookie(request, REDIRECT_URI_PARAM_COOKIE_NAME)
5357
.map(Cookie::getValue)
58+
.map(cookie -> URLDecoder.decode(cookie, UTF_8))
59+
.map(this::encodeKr)
5460
.orElse(getDefaultTargetUrl());
5561

5662
return UriComponentsBuilder.fromUriString(targetUrl)
5763
.queryParam("accessToken", accessToken)
5864
.build().toUriString();
5965
}
6066

67+
// 문제가 발생한 영역 일단 하드 코딩해서 해결
68+
private String encodeKr(String url) {
69+
70+
String[] splitUrl = url.split(NAME_QUERY);
71+
72+
if (splitUrl.length > 1) {
73+
String name = splitUrl[1];
74+
String encodedName = URLEncoder.encode(name, UTF_8);
75+
return splitUrl[0] + NAME_QUERY + encodedName;
76+
}
77+
78+
return url;
79+
}
80+
6181
private void setRefreshTokenInCookie(HttpServletResponse response, String refreshToken) {
6282
ResponseCookie token = ResponseCookie.from("refreshToken", refreshToken)
6383
.path(getDefaultTargetUrl())

src/main/java/com/prgrms/mukvengers/global/security/oauth/repository/HttpCookieOAuthAuthorizationRequestRepository.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package com.prgrms.mukvengers.global.security.oauth.repository;
22

3+
import static java.nio.charset.StandardCharsets.*;
34
import static org.springframework.util.StringUtils.*;
45

6+
import java.net.URLEncoder;
7+
58
import javax.servlet.http.HttpServletRequest;
69
import javax.servlet.http.HttpServletResponse;
710

@@ -37,6 +40,7 @@ public void saveAuthorizationRequest(OAuth2AuthorizationRequest authorizationReq
3740
CookieUtil.serialize(authorizationRequest), COOKIE_EXPIRE_SECONDS);
3841
String redirectUriAfterLogin = request.getParameter(REDIRECT_URI_PARAM_COOKIE_NAME);
3942
if (hasText(redirectUriAfterLogin)) {
43+
redirectUriAfterLogin = URLEncoder.encode(redirectUriAfterLogin, UTF_8);
4044
CookieUtil.addCookie(response, REDIRECT_URI_PARAM_COOKIE_NAME, redirectUriAfterLogin,
4145
COOKIE_EXPIRE_SECONDS);
4246
}

src/test/java/com/prgrms/mukvengers/domain/proposal/api/ProposalControllerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ void getProposalsByLeaderId_success() throws Exception {
165165

166166
}
167167

168-
@Test
168+
@Test // 신청서가 거절 됐는데 왜 저장이 되는건가요?
169169
@DisplayName("[성공] 방장이 신청서를 거절하는 경우 신청서의 상태값이 'REFUSE' 로 변경되며 밥모임원에 저장된다.")
170170
void update_proposalStatus_refuse_success() throws Exception {
171171

@@ -177,7 +177,7 @@ void update_proposalStatus_refuse_success() throws Exception {
177177
.contentType(APPLICATION_JSON)
178178
.header(AUTHORIZATION, BEARER_TYPE + accessToken1)
179179
.content(jsonRequest))
180-
.andExpect(status().isOk())
180+
.andExpect(status().isNoContent())
181181
.andDo(document("proposal-Refuse",
182182
resource(
183183
builder()

0 commit comments

Comments
 (0)