4 . 카카오 로그인 연동 처리
개발환경 구성
REST API는 HTTP 요청을 보낼 수 있는 환경이라면 어디에서든 이용할 수 있습니다. 다음은 REST API를 활용할 수 있는 환경의 예입니다.
- 모바일/PC 웹 환경에서 Javascript를 활용
- 다양한 환경(Java, Ruby, Python 등)의 웹 서버에서 활용
- iOS, Android 등 다양한 모바일 환경에서 활용
iOS, Android, Javascript의 경우 개발을 좀 더 쉽고 편리하게 할 수 있는 Kakao SDK를 제공합니다.
개발자 웹사이트에서는 REST API를 개발하고 디버깅 할 수 있는 다양한 툴을 제공하며, 본 문서에서는 curl을 사용한 예시 화면을 제공합니다.
curl이 설치되어 있지 않은 환경의 경우 curl 다운로드를 통해 설치가 가능합니다.
앱 생성
내 애플리케이션 > 앱 만들기를 통해 앱을 생성합니다.
- 앱 이름과 앱 아이콘을 지정합니다.
- 앱 만들기를 클릭하면 앱 생성이 완료되고 앱 키가 할당됩니다. REST API를 사용할 때에는 REST API 키를 사용합니다.
- 설정을 클릭하여 설정을 이어 갑니다. 플랫폼 추가 > 웹 선택후 사이트 도메인을 입력합니다.
- 추가로 사용자 관리 기능을 사용하기 위해서 코드를 리다이렉트 해줄 Redirect Path를 입력해야 합니다.
사용자 관리 설정
사용자 관리 기능을 사용하기 위해서 설정 > 사용자 관리에서 추가 설정이 필요합니다.
-
첫째, 사용을 ON 해야합니다
-
둘째, 앱 연동 설정 > 자동 가입 을 선택할 수 있습니다.
카카오 플랫폼 서비스는 편의를 위해 자동 앱 연결 기능을 제공합니다. 해당 설정이 활성화되어 있을 경우 최초 로그인시 자동으로 앱 연결이 호출되므로 별도의 앱 연결 과정을 수행할 필요는 없습니다.
사용자가 서비스에 최초 로그인하여 토큰을 얻는 순간과 실제 서비스 가입 시점이 동일하지 않는 경우(예를 들어, 서비스 내에 가입절차가 별도로 있거나 서비스약관동의 등의 절차가 별도로 있는 경우) 반드시 자동 가입 옵션을 끄셔야 합니다. 자동 가입 옵션을 끈 경우 사용자 최초 로그인 후에 명시적으로 가입API를 호출해야 사용자 가입이 완료됩니다.
실제 서비스 가입하는 순간이 다름에도 불구 하고 자동 가입 옵션을 켜서 사용하는 경우는 사용자에게 혼란을 줄 수 있습니다. 예를 들어, 서비스 가입 과정 중에 이탈한 경우 카카오 로그인이 완료된 상태라면 연결된 앱관리에 해당 앱이 나타나게 됩니다. 이런 과정은 서비스를 탈퇴하고 난 후 탈퇴가 잘 되었는 지 확인차 로그인을 해보는 과정에서 자주 겪게 됩니다.
사용자는 카카오계정으로 연결된 앱의 정보를 카카오톡이나 카카오스토리 내에 존재하는 카카오계정의 연결된 앱관리 페이지에서 확인할 수 있습니다.
-
셋째, 앱 연동 설정 > 카카오 계정 연동 을 선택할 수 있습니다.
기본으로 제공되는 사용자 정보로 카카오톡 서비스 정보를 사용할지, 카카오스토리 서비스 정보를 사용할지, 두 서비스 모두 사용하는 사용자의 경우는 어느 서비스 정보에 우선순위를 둘지를 결정합니다. 기본으로 추가되어 있는 사용자 프로퍼티로는 nickname, profile_image, thumbnail_image가 있습니다.
앱 연결 과정에서 최초 한번만 카카오톡 또는 카카오스토리 서비스와 동기화 연동을 하게 됩니다. 사용자가 해당 정보를 카카오톡 또는 카카오스토리에서 변경하였어도 추후 변경된 데이타는 반영되지 않습니다.
카카오톡 또는 카카오스토리와의 동기화 연동 기능을 사용하지 않도록 설정되어 있을 경우, 해당 부가정보는 빈값으로 채워져 있습니다. 이 기본 부가정보는 사용자 정보 저장 기능을 통해 다른 데이타로 언제든 교체가 가능합니다.
-
넷째, 가입시 추가하고 싶은 사용자 정보를 사용자 목록 및 프로퍼티 관리 메뉴를 통해 추가할 수 있습니다.
커스텀 사용자 정보 컬럼은 5개 이하로 제한 하고, 각 커스텀 사용자 정보 값은 160자 이내로 권장합니다. 실제로 사용자의 프로퍼티는 앱 연결 시에 추가 가능합니다. 또한 사용자 정보 저장 기능을 통해서도 추가 가능합니다.
-
다섯째, 서비스에서 사용할 API에서 요구하는 동의항목을 선택하고, 해당 API를 호출하는 목적, 즉 해당 정보의 수집 목적을 설정해야 합니다.
입력한 수집목적의 내용과 실제 서비스에서 해당 개인 정보를 사용하는 목적이 다를 경우 API서비스의 거부 사유가 될 수 있습니다. 카카오계정 이메일을 사용하기 위해서는 여기에서 이메일 사용을 설정해야 합니다.
-
여섯째, 서비스를 운영하는 곳이 국외라면 사용자 관리 > 개인정보 국외이전 에서 개인정보가 저장되는 국가의 정보를 입력해야 합니다.
properties 에서 name, email, profile_img 값을 받아오지 못해서 오류발생
소스 변경
데이터베이스 저장 처리
public function kakao_login_action() {
if (isset($_GET['code'])) {
require_once realpath(dirname(__FILE__).'/../libraries/SNS_OAuth/').'/kakao_oauth.php';
$url = "https://kauth.kakao.com/oauth/token";
$param = "grant_type=authorization_code";
$param .= "&client_id=".$kakao_api;
$param .= "&redirect_url=".$kakao_redirect;
$param .= "&code=".$_GET['code'];
// Get Aeccess Token Value
$auth_data = $this->common->restful_curl($url, $param, 'POST');
$auth_data = json_decode($auth_data);
if($auth_data->access_token) {
$_SESSION['kakao_token'] = $auth_data->access_token;
$url = "https://kapi.kakao.com/v1/user/me";
$param = "";
$header = array("Authorization: Bearer " .$auth_data->access_token);
// Get User Info
$user_data = $this->common->restful_curl($url, $param, 'POST', $header);
$user_data = json_decode($user_data);
$nickname=isset($user_data->name)?$user_data->name :"";
$thumbnail_image=isset($user_data->thumbnail_image)?$user_data->thumbnail_image:"";
// Add Code :: Valid Member
$assign_data=array(
'sns_id'=>$user_data->id,
'sns_type'=>'kakao',
'profile_img'=>$thumbnail_image,
'email'=>$user_data->kaccount_email,
'name'=>$user_data->name,
'nickname'=>''
);
$this->_register_action($assign_data);
}else {
$this->script->alert("Kakao Token Access Fail.");
$this->script->locationhref('/index.php/auth');
}
}else {
$this->script->alert("Invailed Access.");
$this->script->locationhref('/index.php/auth');
}
}
데이터 베이스 저장
// Register Action Process
function _register_action($assign_data) {
//sns 의경우 이메일이 없는 경우가 있으므로 없을 경우 sns_id 값으로 저장
$insertId=$assign_data['email']!=null ? $assign_data['email'] :$assign_data['sns_id'];
//sns_id 로 기존에 등록된 유저 확인
$sql="select * from users where userid=?";
$query=$this->db->query($sql, $insertId);
$message="";
//등록된 userid 를 확인 한다.
if($query->num_rows() > 0){
//테스트 메시지
$message="userid 가 존재";
}
else
{
//userid 값이 없으면 등록한다.
// Member Register in Your Code.
$data=array(
'userid' =>$insertId,
'sns_id'=>$assign_data['sns_id'],
'sns_type'=>$assign_data['sns_type'],
'register_auth_code'=>1, //이메일 인증 코드 1로
'profile_img'=>$assign_data['profile_img'],
'email'=>$assign_data['email'],
'nickname'=>$assign_data['nickname'],
'username'=>$assign_data['name'],
'register_ip'=>$_SERVER['REMOTE_ADDR']
);
$this->db->insert('users', $data);
$message="등록했습니다.";
}
//DB에서 정보를 다시 불러온다.
$sql="select * from users where userid=?";
$query=$this->db->query($sql, $insertId);
$result=$query->row();
//세션 생성
if($result) {
//세션 생성
$newdata =array(
'nickname' =>$result->nickname,
'email' =>$result->email,
'logged_in' =>TRUE,
'auth_code' =>$result->auth_code,
'icon'=>$result->icon,
'sns_type'=>$result->sns_type,
'userid' =>$result->userid
);
$this->session->set_userdata($newdata);
redirect('/');
exit;
}else{
alert('로그인에 실패 하였습니다.', '/');
exit;
}
}
댓글 ( 4)
댓글 남기기