본문 바로가기
Android Studio

[Android Studio] 카카오 로그인 API로 간편 로그인 구현하기

by coding_su 2023. 3. 31.

📝안드로이드 스튜디오에 카카오 로그인 API로 간편 로그인 구현하기

아래 페이지로 가서 로그인 후 내 애플리케이션을 등록해준다

(https://developers.kakao.com/)

 

애플리케이션 등록을 하면 네이티브 앱 키를 얻을 수 있다

(네이티브 앱 키를 확인하려면 내 애플리케이션 > 앱 설정 > 요약정보로 들어가면 확인이 가능하다)

 

좌측의 플랫폼으로 들어가서 Android 플랫폼 등록을 클릭하여 등록해주는데 

 

키 해시를 얻기 위해서는 안드로이드 스튜디오를 실행 시켜 아래 코드를 입력해 로그를 확인하고

확인한 로그를 키해시에 입력해주면 플랫폼 등록은 완료된다

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // getKeyHash() 메서드를 호출하여 키해시를 얻습니다.
        String keyHash = getKeyHash(this, getPackageName());
        Log.d("KeyHash", keyHash);
    }

    // 키해시를 얻기 위한 메서드
    public static String getKeyHash(Context context, String packageName) {
        PackageInfo packageInfo;
        try {
            packageInfo = context.getPackageManager().getPackageInfo(packageName, PackageManager.GET_SIGNATURES);
        } catch (PackageManager.NameNotFoundException e) {
            return null;
        }

        for (Signature signature : packageInfo.signatures) {
            try {
                MessageDigest md = MessageDigest.getInstance("SHA");
                md.update(signature.toByteArray());
                return Base64.encodeToString(md.digest(), Base64.NO_WRAP);
            } catch (NoSuchAlgorithmException e) {
                Log.e("KeyHash", "Unable to get MessageDigest. signature=" + signature, e);
            }
        }
        return null;
    }
}

 

그리고 사용할 기능을 on 처리 해준다(카카오 로그인)

그리고 밑의 Redirect URI가 등록되어있지 않으면 카카오 로그인시 에러가 난다하니 임의로 적어준다

 

 

등록을 다 하였다면 동의항목을 설정해준다

동의항목에 설정한 항목들은 유저가 카카오 로그인시에 카카오 서비스에 등록한 사용자의 정보를 가지고 올 수 있으니

필요한 정보를 체크해준다

(이메일 필수 동의는 내 애플리케이션 > 앱 설정 > 비즈니스에 사업자 정보를 등록해야한다)

 

웹에서 하는 설정은 끝났다

이제 Android에서 구현하기 위해 Gradle을 먼저 설정해 준다

 

settings.gradle 파일의 dependencyResolutionManagement에 repositories 안에 아래 코드를 추가해준다

maven { url 'https://devrepo.kakao.com/nexus/content/groups/public/' }

 

build.gradle(Module) 파일의 dependencies에 필요한 모듈을 설치해준다

// 카카오 로그인
implementation 'com.kakao.sdk:v2-user:2.10.0'

 

Android SDK를 사용하기 위해서 가장 먼저 네이티브 앱 키로 초기화를 해야 하기때문에 클래스를 새로 만들어 초기화 코드를 추가

public class kakaoApplication extends Application {
    @Override
    public void onCreate() {
        super.onCreate();
        KakaoSdk.init(this, {KAKAO_NATIVE_APP_KEY});
    }
}

 

AndroidManifest.xml 파일에 인터넷 권한과 kakaoApplication 클래스 추가하기

// 인터넷 권한
<uses-permission android:name="android.permission.INTERNET" />

// kakaoApplication 추가
<activity
    android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
    android:exported="true">
    <intent-filter>
        <action android:name="android.intent.action.VIEW" />

        <category android:name="android.intent.category.DEFAULT" />
        <category android:name="android.intent.category.BROWSABLE" />

        <data
            android:host="oauth"
            android:scheme={KAKAO_NATIVE_APP_KEY}/>
    </intent-filter>
</activity>

 

위에서 생성한 kakaoApplication 를 application name에 등록해준다

<application
    android:name=".kako.kakaoApplication"
    ...

 

아래는 내가 구현한 코드 예시이다

로그인이 성공하면 회원 정보를 받아 등록하는 형식으로 코드를 입력했다

(레이아웃 이미지는 공식 홈페이지에서 제공한다 https://developers.kakao.com/tool/resource/login)

public class LoginActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_login);
        
		imgKakao.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                // 카카오 로그인 구현
                if(UserApiClient.getInstance().isKakaoTalkLoginAvailable(LoginActivity.this)){
                    login();
                }
                else {
                    accountLogin();
                }
            }
        });
        
        public void login(){
        String TAG = "login()";
        UserApiClient.getInstance().loginWithKakaoTalk(LoginActivity.this,(oAuthToken, error) -> {
            if (error != null) {
                Log.e(TAG, "로그인 실패", error);
            } else if (oAuthToken != null) {
                // 로그인 성공시 사용자 정보 받아오기
                getUserInfo();
            }
            return null;
        });
    }

    public void accountLogin(){
        String TAG = "accountLogin()";
        UserApiClient.getInstance().loginWithKakaoAccount(LoginActivity.this,(oAuthToken, error) -> {
            if (error != null) {
                Log.e(TAG, "로그인 실패", error);
            } else if (oAuthToken != null) {
                // 로그인 성공시 사용자 정보 받아오기
                getUserInfo();
            }
            return null;
        });
    }
    public void getUserInfo(){
        String TAG = "getUserInfo()";
        UserApiClient.getInstance().me((user, meError) -> {
            // 사용자 정보 요청 실패
            if (meError != null) {
                Log.e(TAG, "사용자 정보 요청 실패", meError);
            } else {
                // 사용자 정보 요청(성공 정보 받아오기)
                setUser = new User();
                setUser.setEmail(user.getKakaoAccount().getEmail());
                setUser.setName(user.getKakaoAccount().getProfile().getNickname());

                // 받아온 정보로 회원 등록
                setUserInfo();
            }
            return null;
        });
    }

댓글