한 걸음 두 걸음

Android / 안드로이드 ] kakao auth login 구현하기(kakao OAuth) 본문

FrontEnd/Android

Android / 안드로이드 ] kakao auth login 구현하기(kakao OAuth)

언제나 변함없이 2019. 8. 25. 14:48
반응형

1. kakao developers 가입합니다.

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

2. 내 애플리케이션 생성으로 들어갑니다.

[https://developers.kakao.com/apps/new](https://developers.kakao.com/apps/new)

3. 앱을 만들어줍니다.

4. 사용자관리로 들어갑니다.

사용자 관리에서 사용자관리를 활성화시키고, 개인정보 보호항목 및 접근권한 관리항목을 조정합니다.

5. 이제 안드로이드 프로젝트로 가서 gradle에 사용하고자 하는 SDK를 추가해줍니다.(Gradle환경)

5.1 Project단위의 Gradle에 추가시켜줍니다.

subprojects {
    repositories {
        mavenCentral()
        maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/' }
    }
}

5.2 module단위의 Gradle에 추가시켜줍니다.
저는 현재 Login모듈만 추가시키는 중이므로 아래 한 줄만 가져오도록 하겠습니다.

implementation group: 'com.kakao.sdk', name: 'usermgmt', version: '1.14.0'

https://developers.kakao.com/docs/android/getting-started#%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC-%EC%9D%B4%EC%9A%A9
(이에 대한 문서는 위의 링크에 있습니다.)

6. value-string파일에 네이티브앱키를 등록시켜줍니다.

만들어두었던 애플리케이션으로 들어가서 네이티브 앱키를 가져옵니다.

<resources>
    <string name="app_name">내앱</string>
    <string name="kakao_app_key">네이티브앱키</string>
</resources>

7. Manifest.xml파일에 다음과 같이 추가해줍니다.

<!-- 1 -->
<uses-permission android:name="android.permission.INTERNET" />

<application>
    <!-- 2 -->
    <activity
        ...
        android:name=".SampleLoginActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />
            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
    <!-- 3 -->
    <meta-data
        android:name="com.kakao.sdk.AppKey"
        android:value="@string/kakao_app_key" />
    <!-- 4 -->
    <activity
        android:name="com.kakao.auth.authorization.authcode.KakaoWebViewActivity"
        android:launchMode="singleTop"
        android:windowSoftInputMode="adjustResize">

        <intent-filter>
            <action android:name="android.intent.action.MAIN"/>
            <category android:name="android.intent.category.DEFAULT"/>
        </intent-filter>
    </activity>
    ...
</application

8. 카카오 API 콜을 수행하려면 앱별 키 해시를 등록

키 해시를 구하는 방법은
Activity에서 다음의 함수를 호출하여 확인하실 수 있습니다.
저같은 경우는 MainActivity에서 호출하여 로그로 확인해주었습니다.(아래코드)

public class MainActivity extends AppCompatActivity {

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

        Log.d("MyHashKey", getKeyHash(getApplicationContext()));
    }


    public static String getKeyHash(final Context context) {
        PackageInfo packageInfo = getPackageInfo(context, PackageManager.GET_SIGNATURES);
        if (packageInfo == null)
            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.w("임시체크태그", "Unable to get MessageDigest. signature=" + signature, e);
            }
        }
        return null;
    }
}

9. 자잘하게 할게 많네요..

10. 이제 진짜로 코딩을 해봅시다.

일단 코드 통째로 올려드림!


로그인 할 때 필요한 3개

구성 1. activity_main.xml
2. MainActivity.java
3. GlobalActivity.java


로그인 성공 후 볼 간단한 화면

  1. SuccessActivity.java
  2. activity_success.xml

1. activity.main

<?xml version="1.0" encoding="utf-8"?>

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <com.kakao.usermgmt.LoginButton
        android:id="@+id/com_kakao_login"
        android:layout_width="300dp"
        android:layout_height="wrap_content"
        android:layout_marginBottom="30dp"
        android:layout_marginLeft="30dp"
        android:layout_marginRight="30dp"
        android:layout_marginTop="350dp"
        android:layout_weight="1" />

</FrameLayout>
  1. MainActivity.java
package com.onsemiro.hanpinetree.kakaologinmodule;
import android.app.Activity;  
import android.content.Context;  
import android.content.Intent;  
import android.content.SharedPreferences;  
import android.content.pm.PackageInfo;  
import android.content.pm.PackageManager;  
import android.content.pm.Signature;  
import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.util.Base64;  
import android.util.Log;  
import android.view.View;  
import android.widget.Button;

import com.kakao.auth.ISessionCallback;  
import com.kakao.auth.KakaoSDK;  
import com.kakao.auth.Session;  
import com.kakao.util.exception.KakaoException;  
import com.kakao.util.helper.log.Logger;

import java.io.BufferedWriter;  
import java.io.File;  
import java.io.FileWriter;  
import java.io.IOException;  
import java.io.PrintWriter;  
import java.security.MessageDigest;  
import java.security.NoSuchAlgorithmException;

import static com.kakao.util.helper.Utility.getPackageInfo;

import android.support.v7.app.AppCompatActivity;  
import android.os.Bundle;  
import android.app.Activity;  
import android.content.Intent;  
import android.widget.Toast;

import com.kakao.auth.ISessionCallback;  
import com.kakao.auth.KakaoSDK;  
import com.kakao.auth.Session;  
import com.kakao.util.exception.KakaoException;  
import com.kakao.util.helper.log.Logger;

public class MainActivity extends Activity {  
private SessionCallback callback;  
/\*\* \* 로그인 버튼을 클릭 했을시 access token을 요청하도록 설정한다.  
\* \* @param savedInstanceState 기존 session 정보가 저장된 객체  
\*/  
@Override  
protected void onCreate(final Bundle savedInstanceState) {  
super.onCreate(savedInstanceState);  
setContentView(R.layout.activity\_main);

    callback = new SessionCallback();
    Session.getCurrentSession().addCallback(callback);
    Session.getCurrentSession().checkAndImplicitOpen();
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (Session.getCurrentSession().handleActivityResult(requestCode, resultCode, data)) {
        Intent intent = new Intent(this, SuccessActivity.class);
        startActivity(intent);
        finish();
        return;
    }

    super.onActivityResult(requestCode, resultCode, data);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Session.getCurrentSession().removeCallback(callback);
}

private class SessionCallback implements ISessionCallback {

    @Override
    public void onSessionOpened() {
        redirectSignupActivity();
    }

    @Override
    public void onSessionOpenFailed(KakaoException exception) {
        if(exception != null) {
            Logger.e(exception);
        }
    }
}

protected void redirectSignupActivity() {
    final Intent intent = new Intent(this, SuccessActivity.class);
    startActivity(intent);
    finish();
}
}
  1. GlobalActivity.java
package com.onsemiro.hanpinetree.kakaologinmodule;
import android.app.Application;
import android.content.Context;

import com.kakao.auth.ApprovalType;
import com.kakao.auth.AuthType;
import com.kakao.auth.IApplicationConfig;
import com.kakao.auth.ISessionConfig;
import com.kakao.auth.KakaoAdapter;
import com.kakao.auth.KakaoSDK;

public class GlobalApplication extends Application {
    private static volatile GlobalApplication instance = null;
    public static GlobalApplication getGlobalApplicationContext() {
        if(instance == null)
            throw new IllegalStateException("this application does not inherit com.kakao.GlobalApplication");
        return instance;
    }



    public static class KakaoSDKAdapter extends KakaoAdapter {
        /**
         * Session Config에 대해서는 default값들이 존재한다.
         * 필요한 상황에서만 override해서 사용하면 됨.
         * @return Session의 설정값.
         */
        @Override
        public ISessionConfig getSessionConfig() {
            return new ISessionConfig() {
                @Override
                public AuthType[] getAuthTypes() {
                    return new AuthType[] {AuthType.KAKAO_LOGIN_ALL};
                }

                @Override
                public boolean isUsingWebviewTimer() {
                    return false;
                }

                @Override
                public boolean isSecureMode() {
                    return false;
                }

                @Override
                public ApprovalType getApprovalType() {
                    return ApprovalType.INDIVIDUAL;
                }

                @Override
                public boolean isSaveFormData() {
                    return true;
                }
            };
        }

        @Override
        public IApplicationConfig getApplicationConfig() {
            return new IApplicationConfig() {
                @Override
                public Context getApplicationContext() {
                    return GlobalApplication.getGlobalApplicationContext();
                }
            };
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
        KakaoSDK.init(new KakaoSDKAdapter());
    }
}

4. SuccessActivity.java랑 xml은 안드려도 되겠죠? 아무거나 보고싶은 창으로 만드세용 : ) ㅎㅎ


깃허브로 보고싶다면?

https://github.com/losnah/ModuleAsset.git


  1. kakako developers login API
    https://developers.kakao.com/docs/android/user-management

참고

https://yhong.tistory.com/2

https://developers.kakao.com/apps/342442

내 모듈 위치
[https://accounts.kakao.com/login?continue=https://developers.kakao.com/login?redirectUrl=%2Fapps%2F342442]


반응형