코딩스토리

[Android/안드로이드] 카카오톡 로그인 연동 본문

Android/유용한 기술

[Android/안드로이드] 카카오톡 로그인 연동

라크라꾸 2020. 1. 3. 00:24

이번 시간에는 카카오톡으로 로그인 연동을 시켜보도록 하겠습니다.

 

App Key 발급 및 등록

카카오연동을 하기 위해서는 페이스북 연동할떄와 마찬가지로 SDK외에도 App Key를 발급받아 프로젝트에 등록을 해주어야 합니다. App Key는 카카오개발자 홈페이지에서 받을 수 있습니다.

 

https://developers.kakao.com/

 

카카오계정 로그인

여기를 눌러 링크를 확인하세요.

accounts.kakao.com

카카오개발자 홈페이지에 로그인을 하게되면 우측 상단에 이름을 클릭하게 되면 마이페이지로 갈 수 있습니다.

내 어플리케이션을 누르게 되면 앱을 만들 수 있는 폼이 생성됩니다. 앱 만들기 버튼을 클릭해줍니다.

 

앱 이름과 회사명을 설정하게 되면 다음과같이 앱 코드가 생성됩니다.

여기서 저희가 사용할 키는 네이티브 앱 키를 사용하게 됩니다.

우선 키를 만들었지만 프로젝트 생성을 하기 전에 몇가지 세팅을 더 해보겠습니다.

 

좌측 탭을 보면 설정에 사용자 관리를 클릭을 해 사용자 관리를 on시켜줍니다.

on으로 하지 않으면 api를 사용할 수 없습니다.

사용자관리를 활성화 시켜줬으면 이제 다시 좌측 탭에서 개요를 클릭해 앱에 대해 설정을 해줍니다.

앱정보를 설정해서 안드로이드 플랫폼을 추가해줍니다.

 

패키지명과 키해시를 입력해줍니다

 

키해시는 이전 글을 참조하여 넣어주시기 바랍니다.

2019/12/16 - [Android/유용한 기술] - [Android/안드로이드] 해시키(Hash key) 가져오는 방법

 

[Android/안드로이드] 해시키(Hash key) 가져오는 방법

해시키는 앱마다 가지고 있는 고유키입니다. 페이스북 SDK, 카카오톡 SDK 등과 연동하기 위해서는 해시키(Hash key)를 가지고 각각의 앱을 구분하여 설정된 기능을 제공하기 때문에 반드시 해시키(Hash Key) 를 등..

lakue.tistory.com

해시키를 넣고 저장을 누르면 카카오톡 로그인에 대한 세팅은 끝났습니다

 

이제 안드로이드 프로젝트를 생성해줍니다.

 

아까 생성한 네이티브 앱 코드를 strings.xml코드에 넣어줍니다.

 

수정사항

현재포스팅되어있는 버전은 v1 사용자 정보요청 버전입니다. v1은 지금 사용이 중단되어 v2로 업데이트를 해야 사용자 정보를 가져올 수 있습니다. App Key생성까지 하셨다면 다음 포스팅에서 다시 확인 부탁드립니다.

https://lakue.tistory.com/40

 

[Android/안드로이드] 카카오톡 로그인 (v2 ‘사용자 정보 요청’ API로 업데이트)

이전에 카카오톡으로 로그인을 할 경우 다음과 같은 메시지와 같이 사용자 정보 데이터를 가져올 수가 없었습니다. application(id=383706, name='Test2') using deprecated api(/v1/user/me) 이 에러는 카카오에..

lakue.tistory.com

 

프로젝트에 Kakao SDK 추가

strings.xml

  
  <resources>
      <string name="app_name">KakaoLoginSample</string>
      <string name="kakao_app_key">앱 키</string>
  </resources>
  

 

build.gradle(Project:~)파일에 다음과 같이 두줄을 추가해줍니다.

build.gradle(Project:~)

  
  allprojects {
      repositories {
          google()
          jcenter()
          maven{
              url "https://maven.google.com"
          }
          /*카카오*/
          maven { url 'http://devrepo.kakao.com:8088/nexus/content/groups/public/'}
      }
  }
  

gradle.properties파일에도 다음과 같이 두줄을 추가해줍니다.

gradle.properties

  
  KAKAO_SDK_GROUP=com.kakao.sdk
  KAKAO_SDK_VERSION=1.1.7
  

build.gradle(Module:app)에 카카오톡 SDK를 추가해줍니다.

build.gradle(Module:app)

  
  dependencies {
      implementation group: project.KAKAO_SDK_GROUP, name: 'usermgmt', version: project.KAKAO_SDK_VERSION
  }
  

 

카카오 API연동

Kakao SDK를 사용하기 위해서는 초기화를 해줘야 합니다. 초기화는 GlobalApplication 공유 클래스를 만들어 앱 수준에서 관리하도록 하겠습니다. kakaoSDKAdapter클래스는 KakaoAdapter를 상속받습니다.

 

  
  package com.example.kakaologinsample;
  
  import android.app.Activity;
  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 GlobalApplication instance;
  
      public static GlobalApplication getGlobalApplicationContext() {
          if (instance == null) {
              throw new IllegalStateException("This Application does not inherit com.kakao.GlobalApplication");
          }
  
          return instance;
      }
  
      @Override
      public void onCreate() {
          super.onCreate();
          instance = this;
  
          // Kakao Sdk 초기화
          KakaoSDK.init(new KakaoSDKAdapter());
      }
  
      @Override
      public void onTerminate() {
          super.onTerminate();
          instance = null;
      }
  
      public class KakaoSDKAdapter extends KakaoAdapter {
  
          @Override
          public ISessionConfig getSessionConfig() {
              return new ISessionConfig() {
  
                  // 로그인 시 인증 타입 지정
                  @Override
                  public AuthType[] getAuthTypes() {
                      return new AuthType[] {AuthType.KAKAO_ACCOUNT};
                  }
  
                  // pause와 resume시에 타이머를 설정/ CPU의 소모를 절약 할 지의 여부를 지정
                  @Override
                  public boolean isUsingWebviewTimer() {
                      return false;
                  }
  
  
                  // Kakao와 제휴 된 앱에서 사용되는 값
                  @Override
                  public ApprovalType getApprovalType() {
                      return ApprovalType.INDIVIDUAL;
                  }
  
                  // 로그인 웹뷰에서 email 입력 폼의 데이터를 저장할 지 여부를 지정
                  @Override
                  public boolean isSaveFormData() {
                      return true;
                  }
              };
          }
  
          // Application이 가지고 있는 정보를 얻기 위한 인터페이스
          @Override
          public IApplicationConfig getApplicationConfig() {
              return new IApplicationConfig() {
                  @Override
                  public Activity getTopActivity() { return null;
                  }
                  @Override
                  public Context getApplicationContext() {
                      return GlobalApplication.getGlobalApplicationContext();
                  }
              };
          }
      }
  }
  

GlobalApplication 객체를 공유하기 위해서 manifests.xml에 다음과 같이 추가를 해야합니다.

 

AuthType

Kakao SDK로그인을 하는 방식에 대한 Enum class

KAKAO_TALK 0 kakaotalk으로 login을 하고 싶을때 지정.
KAKAO_STORY 1 kakaostory으로 login을 하고 싶을때 지정.
KAKAO_ACCOUNT 2 웹뷰 Dialog를 통해 카카오 계정연결을 제공하고 싶을경우 지정.
KAKAO_TALK_EXCLUDE_NATIVE_LOGIN 3 카카오톡으로만 로그인을 유도하고 싶으면서 계정이 없을때 계정생성을 위한 버튼도 같이 제공을 하고 싶다면 지정.
KAKAO_TALK과 중복 지정불가.
KAKAO_LOGIN_ALL 4 모든 로그인 방식을 사용하고 싶을 때 지정.

 

manifests.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.lakue.kakaologinsample">
    
    <uses-permission android:name="android.permission.INTERNET" />
    
    <application
        android:name=".GlobalApplication"
        ...>
        <meta-data
            android:name="com.kakao.sdk.AppKey"
            android:value="@string/kakao_app_key" />
        <activity>
           ...
        </activity>
    </application>

</manifest>

인터넷을 사용하기 위해 <uses-permission android:name="android.permission.INTERNET" /> 를 넣어줘야 하고,

카카오에서 받아온 앱 키를 설정할 메타데이터 를 넣어줘야 합니다.

Login버튼 구현

로그인 버튼은 페이스북과 마찬가지로 카카오에서 제공하는 로그인 버튼과 사용자 맘대로 꾸밀 수 있는 커스텀 로그인버튼이 있습니다. 이번 프로젝트에서 두개 다 사용해보겠습니다.

 

activity_main.xml

  
  <?xml version="1.0" encoding="utf-8"?>
  <LinearLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:tools="http://schemas.android.com/tools"
      android:layout_width="match_parent"
      android:layout_height="match_parent"
      android:gravity="center"
      android:orientation="vertical"
      tools:context=".MainActivity">
  
      <Button
          android:id="@+id/btn_custom_login"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:text="카카오 로그인" />
  
      <com.kakao.usermgmt.LoginButton
          android:id="@+id/btn_kakao_login"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"/>
  
  </LinearLayout>
  

 

 

이제 MainActivity에서 버튼을 클릭했을 때 로그인을 요청해줍니다.

 

MainActivity.java

  
  package com.example.kakaologinsample;
  
  import android.os.Bundle;
  import android.view.View;
  import android.widget.Button;
  
  import androidx.appcompat.app.AppCompatActivity;
  
  import com.kakao.auth.AuthType;
  import com.kakao.auth.Session;
  
  public class MainActivity extends AppCompatActivity {
  
      private Button btn_custom_login;
  
      @Override
      protected void onCreate(Bundle savedInstanceState) {
          super.onCreate(savedInstanceState);
          setContentView(R.layout.activity_main);
  
          btn_custom_login = (Button) findViewById(R.id.btn_custom_login);
          btn_custom_login.setOnClickListener(new View.OnClickListener() {
              @Override
              public void onClick(View view) {
                  Session session = Session.getCurrentSession();
                  session.addCallback(new SessionCallback());
                  session.open(AuthType.KAKAO_LOGIN_ALL, MainActivity.this);
              }
          });
      }
  }
  

 

SessionCallback 클래스 구현

카카오톡 로그인 요청을 코드는 완성되었습니다. 이제 로그인 결과값을 전달받기 위한 Callback클래스를 구현하겠습니다.

 

SessionCallback.java

  
  package com.example.kakaologinsample;
  
  import android.util.Log;
  
  import com.kakao.auth.ISessionCallback;
  import com.kakao.network.ErrorResult;
  import com.kakao.usermgmt.UserManagement;
  import com.kakao.usermgmt.callback.MeResponseCallback;
  import com.kakao.usermgmt.response.model.UserProfile;
  import com.kakao.util.exception.KakaoException;
  
  public class SessionCallback implements ISessionCallback {
  
      // 로그인에 성공한 상태
      @Override
      public void onSessionOpened() {
          requestMe();
      }
  
      // 로그인에 실패한 상태
      @Override
      public void onSessionOpenFailed(KakaoException exception) {
          Log.e("SessionCallback :: ", "onSessionOpenFailed : " + exception.getMessage());
      }
  
      // 사용자 정보 요청
      public void requestMe() {
          // 사용자정보 요청 결과에 대한 Callback
          UserManagement.requestMe(new MeResponseCallback() {
              // 세션 오픈 실패. 세션이 삭제된 경우,
              @Override
              public void onSessionClosed(ErrorResult errorResult) {
                  Log.e("SessionCallback :: ", "onSessionClosed : " + errorResult.getErrorMessage());
              }
  
              // 회원이 아닌 경우,
              @Override
              public void onNotSignedUp() {
                  Log.e("SessionCallback :: ", "onNotSignedUp");
              }
  
              // 사용자정보 요청에 성공한 경우,
              @Override
              public void onSuccess(UserProfile userProfile) {
  
                  Log.e("SessionCallback :: ", "onSuccess");
  
                  String nickname = userProfile.getNickname();
                  String profileImagePath = userProfile.getProfileImagePath();
                  String thumnailPath = userProfile.getThumbnailImagePath();
                  long id = userProfile.getId();
  
                  Log.i("Profile : ", "nickname / " + nickname + "");
                  Log.i("Profile : ", "profileImagePath / " + profileImagePath  + "");
                  Log.i("Profile : ", "thumnailPath / " + thumnailPath + "");
                  Log.i("Profile : ", "id / " + id + "");
              }
  
              // 사용자 정보 요청 실패
              @Override
              public void onFailure(ErrorResult errorResult) {
                  Log.e("SessionCallback :: ", "onFailure : " + errorResult.getErrorMessage());
              }
          });
      }
  }
  

 

Name Type Description
onSuccess UserProfile 사용자 정보 요청이 성공한 경우로 사용자 정보 객체를 받습니다.
onSessionClosed ErrorResult 세션이 닫혀 실패한 경우로 에러 결과를 받습니다. 재로그인 / 토큰발급이 필요합니다.
onFailure ErrorResult 가입이 안된 경우와 세션이 닫힌 경우를 제외한 다른 이유로 요청이 실패한 경우 콜백입니다.

 

로그아웃

로그아웃 요청은 간단합니다.

UserManagerment에서 requestLogout()인터페이스만 정의해주면 로그아웃 요청이 됩니다.

로그아웃했을 때 Toast메시지를 띄워 확인해보도록 하겠습니다.

  
  UserManagement.requestLogout(new LogoutResponseCallback() {
      @Override
      public void onCompleteLogout() {
          Toast.makeText(MainActivity.this, "로그아웃 되었습니다.", Toast.LENGTH_SHORT).show();
      }
  });
  
실행화면

 

카카오에서 제공하는 카카오계정으로 로그인과 커스텀버튼으로 만든 카카오로그인의 기능은 같기 때문에 둘중 하나라도 누르면 카카오 로그인 창이 띄워집니다. 로그인에 성공을 하게 되면 Logcat을 확인하여 계정에 대한 카카오 정보를 가져올 수 있습니다.

 

 

Comments