Oauth관련 디버깅 기록
메모장 내용을 복붙한거라 탭 간격 안 맞음
1번. state를 꼭 포함시켜야 함. 2번. state 정보를 session에 저장해야 함.
3번. 프론트에서 로그인 요청을 할 때 무조건!!<a href="http://localhost:8080/oauth2/authorization/google">
이렇게 요청해야 함. 이래야 oauth~RequestResolver?에서 resolve하고 정보 save하고 send해서 나중에 authorization 관련 오류가 안 남.
4번.
"http://localhost:8080/oauth2/authorization/google"
OAuth2AuthorizationRequestRedirectFilter
.resolve()
->
DefaultOAuth2AuthorizationRequestResolver
.resolve(request)
-> resolve(request, registrationId)
//{registrationId=google}
-> resolve(request, registrationId, redirectUriAction);
//{registrationId=google,
redirectUriAction=login}{login이 default값}
-> ClientRegistragion clientRegistration = this.clientRegistrationRepository.findByRegistrationId(registrationId);
// 내가 보낸 요청 정보(google, scope, client_secret 등)
-> String redirectUriStr = expandRedirectUri(request, clientRegistration, redirectUriAction);
// 결과값: "http://localhost:8080/login/oauth2/code/google"?
->
OAuth2AuthorizationRequestRedirectFilter
->doFilterInternal
if (authorizationRequest != null) {
this.sendRedirectForAuthorization(request, response, authorizationRequest);
return;
}
여기서
sendRedirectForAuthorization
this.authorizationRequestRepository.saveAuthorizationRequest(authorizationRequest, request, response);
this.authorizationRedirectStrategy.sendRedirect(request, response, authorizationRequest.getAuthorizationRequestUri());
sendRedirect는 RedirectStategy(interface) 객체
DefaulatRedirectStategy(RedirectStrategy 구현체)
-> sendRedirect(request, response, url)에서
if (this.statusCode == HttpStatus.FOUND) {
response.sendRedirect(redirectUrl);
}
여기까지는 들어옴. http status code: 302.
근데 저기서 sendRedirect 부분에서 문제 생긴듯함.
OAuth2AuthorizationRequestRedirectFilter
원래는 doFilterInternal로 다시 돌아와서
if (authorizationRequest != null) {
this.sendRedirectForAuthorization(request, response, authorizationRequest);
return;
}
여기서 sendRedirectForAuthorization까지 한 상황이라 return해야하는데
exception 잡힘.
""""cannot call sendredirect() after the response has been committed""""
구글 로그아웃하고 다시 들어가기... 이미 동의했던 기록이 있어ㅓㅅ 구글 로그인 화면이 안 나온듯.
아무래도 OAuth2AuthorizationRequestRedirectFilter 에서 sendRedirectForAuthorization메서드에서
sendRedirect 부분에 파라미터(authorizationRequest.getAuthorizationRequestUri()) 이 부분 문제?
sendRedirect 부분 다시 확인?
-> 문제가 없음!!!!!!!!!
{authorizationUri 정상("~/o/oauth2/v2/auth")}
일단 doFilterInternal의
if (authorizationRequest != null) {
this.sendRedirectForAuthorization(request, response, authorizationRequest);
return;
}
여기서 authorizationRequest부분에는 문제 없음. authorizationUri 정상("~/o/oauth2/v2/auth")
OAuth2LoginAuthenticationFilter의 attemptAuthentication() 안
OAuth2LoginAuthenticationToken authenticationResult = (OAuth2LoginAuthenticationToken)this.getAuthenticationManager().authenticate(authenticationRequest);
customOAuth2UserService loadUser까지 잘 들어옴
attributes, client 정보 정상.
return new PrincipalDetails(client, oAuth2User, userNameAttributeName);
-> 이 부분에 문제 있는지 확인 필요
OAuth2AuthorizedClient authorizedClient = new OAuth2AuthorizedClient(authenticationResult.getClientRegistration(), oauth2Authentication.getName(), authenticationResult.getAccessToken(), authenticationResult.getRefreshToken());
OAuth2LoginAuthenticationFilter 문제 없음.
->-> OAuth2SuccessHandler 진입.
구글 로그인 테스트 시 이미 테스트 해본 적이 있으면 로그아웃하고 하기...