Post

스프링부트 OAuth2 소셜로그인 설정 - (2)

📌 안드로이드 OAuth2 소셜로그인

👉 개요

1번째 글에서 하려고 했던 것은 소셜로그인 로직을 모두 SpringBoot에서 코딩하는 것이었다.

  1. 안드로이드에서 사용자가 로그인 아이디와 비밀번호를 보내줌
  2. 백엔드에서 이 값을 사용해 소셜로그인을 진행
  3. 토큰 발행
  4. 안드로이드에서 api를 날릴 때 토큰을 함께 사용

이렇게 사용하려고 했었는데, 만들면서 찾아보고 코딩을 하다보니 변경하게 되었다.

  1. 안드로이드에서 소셜로그인 진행 후 Access Token 발행
  2. Access Token을 서버로 보내고, JWT 발행
  3. Jwt를 Shared Preference에 저장
  4. API를 호출할 때 Jwt를 헤더에 넣어 호출

alt text
초기의 화면은 이 사진과 같다.

👉 기능

1
2
3
4
1. 카카오 로그인
2. 네이버 로그인
3. 소셜로그인이 아닌 이메일로 가입
4. 로그인하지 않고 시작

👉 안드로이드에서 소셜로그인 구현

alt text

alt text

Activity에서 두 소셜로그인의 로직을 넣기엔 코드가 너무 길어져 두 LoginManager 클래스를 따로 만들었다. 실제 Activity는 실제 로그인을 하는 로직한 넣어 만들었다.

카카오 로그인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
private void performKakaoLogin() {
        kakaoLoginManager.performLogin(this, new KakaoLoginManager.KakaoLoginCallback() {
            @Override
            public void onSuccess(OAuthToken token) {
                Log.i(TAG, "카카오 로그인 성공: " + token.getAccessToken());
                kakaoLoginManager.kakaoSocialLogin(token.getAccessToken(), new KakaoLoginManager.SocialLoginCallback() {
                    @Override
                    public void onSuccess(String message) {
                        Toast.makeText(LoginActivity.this, message, Toast.LENGTH_SHORT).show();
                        // TODO: 로그인 후 채팅방 화면으로 이동
                        Intent intent = new Intent(LoginActivity.this, ChatRoomActivity.class);
                        startActivity(intent);
                        finish(); // 현재 LoginActivity를 종료 (선택사항)
                    }

                    @Override
                    public void onFailure(String error) {
                        Toast.makeText(LoginActivity.this, error, Toast.LENGTH_SHORT).show();
                    }
                });
            }

            @Override
            public void onFailure(Throwable error) {
                Log.e(TAG, "카카오 로그인 실패", error);
                Toast.makeText(LoginActivity.this, "카카오 로그인 실패", Toast.LENGTH_SHORT).show();
            }
        });
    }

네이버 로그인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private final ActivityResultLauncher<Intent> naverLauncher = registerForActivityResult(
            new ActivityResultContracts.StartActivityForResult(),
            result -> {
                NaverLoginManager.handleLoginResult(result.getResultCode(), new NaverLoginManager.NaverLoginCallback() {
                    @Override
                    public void onSuccess(String accessToken) {
                        naverLoginManager.naverSocialLogin(accessToken, LoginActivity.this);
                        Log.i(TAG, "네이버 로그인 성공: " + accessToken);
                        // TODO: 추가 작업 수행
                        Intent intent = new Intent(LoginActivity.this, ChatRoomActivity.class);
                        startActivity(intent);
                        finish(); // 현재 LoginActivity를 종료
                    }

                    @Override
                    public void onFailure(String errorCode, String errorDescription) {
                        Log.e(TAG, "네이버 로그인 실패: " + errorCode + " - " + errorDescription);
                    }
                });
            }
    );

이메일로 로그인(소셜로그인 X) -> 새로운 엑티비티로 이동

1
2
3
4
5
private void performEmailLogin() {
        // 이메일 로그인 로직 구현
        Intent intent = new Intent(this, EmailLoginActivity.class);
        startActivity(intent);
    }
This post is licensed under CC BY 4.0 by the author.