Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

소셜 로그인 버그 FIX #169

Merged
merged 25 commits into from
Mar 14, 2024
Merged

소셜 로그인 버그 FIX #169

merged 25 commits into from
Mar 14, 2024

Conversation

uijin-j
Copy link
Contributor

@uijin-j uijin-j commented Mar 14, 2024

🎫 관련 이슈

Resolves #157

📌 기존 로그인 방식

1️⃣ 클라이언트(프론트엔드)에서 깃허브로 로그인하기 버튼을 누르면, 백엔드 서버 uri GET /api/v1/oauth2/authorization/github 로 요청!
2️⃣ 백엔드 서버는 깃허브 로그인 페이지로 넘어갈 수 있는 리다이렉트 uri를 클라이언트에 응답! (oauth2-client 프레임워크가 지원해줌😎)
3️⃣ 클라이언트가 깃허브 로그인 성공!
4️⃣ 깃허브 서버가 지정된 리다이렉트 uri(백엔드 서버 /api/v1/login/oauth2/code/github?code={code}&state={state})로 code를 넘겨줌!
5️⃣ 백엔드 서버가 code를 받아 처리한 뒤 로그인 응답을 내려줌! (oauth2-client 프레임워크가 지원해줌😎)

🚨 문제 상황

  • 4️⃣번 상황에서 문제 발생! 깃허브 서버가 백엔드 서버로 code를 넘겨주기 때문에 백엔드 서버에서 응답을 내려주면 클라이언트가 아닌 깃허브 서버쪽으로 응답이 내려가게됨!!😱
    • 해결책 1) 그럼 클라이언트로 리다이렉트 응답을 내려주면 되잖아?
    • 해결책 2) 그럼 깃허브가 백엔드로 code를 보내게 하지말고, 클라이언트로 보내게 한 뒤 백엔드 서버에서 code를 받아 처리하는 엔드포인트를 추가하면 되잖아?

💬 해결책 2번 방식을 사용하면 code를 받아서 깃허브 서버에 access token을 요청하고, 기타 처리를 해주는 유용한 oauth2-client의 장점을 사용할 수 없어😥
💬 그럼 해결책 1은? 리다이렉트 응답을 보내면 body를 넣을 수 없어! 하지만 우린.. 로그인 성공 시 json 응답(토큰+유저 정보)를 내려줘야해!! body 대신 uri에 파라미터 형식으로 넣을수도 있고, 쿠키에 json을 넣을수도 있지만 보안상으로나 json 파싱이나 너무 복잡해..

💡 해결된 방식

사실 해결책 2번으로 해결이 되었다..😆 클라이언트가 깃허브 로그인 성공 시 코드를 받고, 백엔드 서버에 요청을 하는데, 기존 oauth2client에서 제공해주는 엔드포인트(/login/oauth2/code/github?code={code}&state={state})를 그대로 쓸 수 있더라ㅎ
대신 application.yml에 redirectUri를 클라이언트 uri로 추가해 주어야함!

✅ 구현 내용

  • Security Filter에서 발생하는 예외를 처리하는 필터 구현 및 추가 (AuthExceptionHandlerFilter)
  • OAuth2Login 시 발생하는 예외를 처리하는 필터 구현 및 추가 (OAuth2LoginFailureHandler)

💬 코멘트

  • 어쩌다보니 여기에 트러블 슈팅을 작성했는데.. 더 자세하게 노션에 업뎃해 놓겠습니당!

@uijin-j uijin-j added this to the 3차 스프린트 milestone Mar 14, 2024
@uijin-j uijin-j self-assigned this Mar 14, 2024
Copy link
Member

@Sehee-Lee-01 Sehee-Lee-01 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

오늘 있엇던 이슈(#167)를 해결하는 코드도 있는 것 같군요!
전반적으로 메시지 상수화로 깔끔하게 해주시고 메서드 분리도 잘 해주셔서 잘 읽힌 것 같습니다!
어려운 기능 구현해주시느라 너무너무너무 수고 많으셨습니다....

Comment on lines +39 to +49
private OAuth2UserImpl extractOAuth2User(Authentication authentication) {
if (!(authentication.getPrincipal() instanceof OAuth2UserImpl oauth2User)) {
throw new InternalAuthenticationServiceException(OAUTH_USER_TYPE_IS_INVALID);
}
return oauth2User;
}

private SocialLoginResponse createSocialLoginResponse(User user, AuthProvider authProvider) {
LoginResponse loginResponse = authService.createTokens(user);
return SocialLoginResponse.of(loginResponse, authProvider);
}
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

메서드 분리 깔끔하게 해주셔서 감사합니다!!🥰

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

util로 뺀거 깔금하네유!

Copy link

📝 Jacoco Test Coverage

Overall Project 70.73% -2.06%
Files changed 22.8%

File Coverage
RefreshTokenService.java 100% 🍏
OAuth2RedirectUriProperties.java 100% 🍏
SecurityConfig.java 100% 🍏
AuthService.java 95.97% -4.03%
UserInfoMapperFactory.java 72.73% 🍏
OAuth2LoginFailureHandler.java 33.33% -66.67%
AuthExceptionHandlerFilter.java 28% -72%
AuthProvider.java 16.67% 🍏
GithubUserInfoMapper.java 6.12% 🍏
JWTValidationFilter.java 0% -9.8%
AuthConstant.java 0%
ResponseUtils.java 0%
OAuth2UserServiceImpl.java 0% 🍏
OAuth2LoginSuccessHandler.java 0%
OAuth2UserImpl.java 0% 🍏

@uijin-j uijin-j merged commit a7dce69 into dev Mar 14, 2024
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants