안내 |
|
간편 로그인의 경우 사이트내 인증수단으로 많이 사용되며 요즘 사이트들은 거의 반 필수적으로
도입을 하고 있는 추세다.
간편로그인의 장점같은 경우 사용자의 수고를 덜어줌에 있기때문에 사용자를 위한 서비스를 한다면
반드시 간편로그인을 연동하는게 좋다.
이번편은 카카오에서 제공하는 카카오 로그인 연동중 REST API 를 통한 방법을
예제 소스를 통해 소개할려 고 한다.
솔직히 JAVASCRIPT 의 경우 고도화된 사이트에서는 인증처리가 오히려 복잡해 지기 때문에
나같은 경우 사용 하지 않는다.
만약 JAVASCRIPT 방식으로 연동을 원한다면 아래의 카카오 개발문서를 참고바란다.
카카오로그인 JAVASCRIPT 샘플 바로가기 |
https://developers.kakao.com/tool/demo/login/login |
참고로 이번편에 소개하는 REST API 의 경우 PHP 서버에서 CURL로 통신하기 떄문에
자신의 서버에 CURL 통신이 가능한지 먼저 확인이 필요하다.
(이번편은 카카오 로그인 REST API 연동편이기에 절대 귀찮아서(맞음..) 링크로 대체한건 아니니 양해 바란다.)
리눅스 CURL 테스트 검색 - BY Google |
카카오 로그인 REST API를 연동하기 위해선 당연하겠지만 카카오 개발자 사이트를 통해
필요한 정보가 미리 세팅이 되어있어야 한다. 이러한 세팅이 안되어있다면 지금 소개하는
샘플 소스를 이용할 수 없다.
추가되는 파일은 아래 4가지 파일로 볼 수 있다.
예제 파일이므로 반드시 수정할 부분과 db 처리 부분은 별도 처리하길 바란다.
|
카카오 API 설정파일 (config.php) |
<?php
// 설정파일 조정 필요
$kakaoConfig = array(
// ![수정필요] 카카오 REST API 키값 , 카카오 개발자 사이트 > 내 애플리케이션 > 요약정보에서 REST API 키값
'client_id'=>'',
// ![수정필요] 카카오 개발자 사이트 > 내 애플리케이션 > 카카오로그인 > 보안 에서 생성가능
'client_secret'=>'',
// 로그인 인증 URL
'login_auth_url'=>'https://kauth.kakao.com/oauth/authorize?response_type=code&client_id={client_id}&redirect_uri={redirect_uri}&state={state}',
// 로그인 인증토큰 요청 URL
'login_token_url'=>'https://kauth.kakao.com/oauth/token?grant_type=authorization_code&client_id={client_id}&redirect_uri={redirect_uri}&client_secret={client_secret}&code={code}',
// 프로필정보 호출 URL
'profile_url'=>'https://kapi.kakao.com/v2/user/me',
// ![수정필요] 로그인 인증 후 Callback url 설정 - 변경시 URL 수정 필요, 카카오 개발자 사이트 > 내 애플리케이션 > 카카오로그인 > Redirect URI 에서 등록가능
'redirect_uri'=>'http'.(!empty($_SERVER['HTTPS']) ? 's':null).'://'.$_SERVER['HTTP_HOST'].'/oauth.php',
);
// 함수: 카카오 curl 통신
function curl_kakao($url,$headers = array()){
if(empty($url)){ return false ; }
// URL에서 데이터를 추출하여 쿼리문 생성
$purl = parse_url($url); $postfields = array();
if( !empty($purl['query']) && trim($purl['query']) != ''){
$postfields = explode("&",$purl['query']);
}
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
curl_setopt($ch, CURLOPT_USERAGENT, $_SERVER['HTTP_USER_AGENT']);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
if( count($headers) > 0){
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
}
ob_start(); // prevent any output
$data = curl_exec($ch);
ob_end_clean(); // stop preventing output
if (curl_error($ch)){ return false;}
curl_close($ch);
return $data;
}
로그인 페이지 (login.php) |
<?php
// ![수정필요] 카카오 API 환경설정 파일
include_once dirname(__FILE__)."/config.php";
// 정보치환
$replace = array(
'{client_id}'=>$kakaoConfig['client_id'],
'{redirect_uri}'=>$kakaoConfig['redirect_uri'],
'{state}'=>md5(mt_rand(111111111,999999999)),
);
setcookie('state',$replace['{state}'],time()+300); // 300 초동안 유효
$login_auth_url = str_replace(array_keys($replace), array_values($replace),$kakaoConfig['login_auth_url']);
?>
<script src="//code.jquery.com/jquery-3.5.1.min.js" integrity="sha256-9/aliU8dGd2tb6OSsuzixeV4y/faTqgFtohetphbbj0=" crossorigin="anonymous"></script><?php // http://craftpip.github.io/jquery-confirm/ ?>
<div class="kakao-login">
<a href="<?php echo $login_auth_url ?>" id="kakao-login"><img alt="resource preview" src="https://k.kakaocdn.net/14/dn/btroDszwNrM/I6efHub1SN5KCJqLm1Ovx1/o.jpg"></a>
</div>
카카오 인증 후 처리 페이지 (oauth.php) |
<?php
try{
// ![수정필요] 카카오 API 환경설정 파일
include_once dirname(__FILE__)."/config.php";
// 기본 응답 설정
$res = array('rst'=>'fail','code'=>(__LINE__*-1),'msg'=>'');
// code && state 체크
if( empty($_GET['code']) || empty($_GET['state']) || $_GET['state'] != $_COOKIE['state']){ throw new Exception("인증실패", (__LINE__*-1) );}
// 토큰 요청
$replace = array(
'{grant_type}'=>'authorization_code',
'{client_id}'=>$kakaoConfig['client_id'],
'{redirect_uri}'=>$kakaoConfig['redirect_uri'],
'{client_secret}'=>$kakaoConfig['client_secret'],
'{code}'=>$_GET['code']
);
$login_token_url = str_replace(array_keys($replace), array_values($replace), $kakaoConfig['login_token_url']);
$token_data = json_decode(curl_kakao($login_token_url));
if( empty($token_data)){ throw new Exception("토큰요청 실패", (__LINE__*-1) ); }
if( !empty($token_data->error) || empty($token_data->access_token) ){
throw new Exception("토큰인증 에러", (__LINE__*-1) );
}
// 프로필 요청
$header = array("Authorization: Bearer ".$token_data->access_token);
$profile_url = $kakaoConfig['profile_url'];
$profile_data = json_decode(curl_kakao($profile_url,$header));
if( empty($profile_data) || empty($profile_data->id) ){ throw new Exception("프로필요청 실패", (__LINE__*-1) ); }
// 프로필정보 저장 -- DB를 통해 저장하세요
/*
echo '<pre>';
print_r($profile_data);
echo '</pre>';
exit;
*/
$is_member = true; // 기존회원인지(true) / 비회원인지(false) db 체크
// 로그인 회원일 경우
if( $is_member === true){
}
// 새로 가입일 경우
else{
}
// 최종 성공 처리
$res['rst'] = 'success';
}catch(Exception $e){
if(!empty($e->getMessage())){ $res['msg'] = $e->getMessage(); }
if(!empty($e->getMessage())){ $res['code'] = $e->getCode(); }
}
// 성공처리
if($res['rst'] == 'success'){
}
// 실패처리
else{
}
// state 초기화
setcookie('state','',time()-3000); // 300 초동안 유효
header("Location: /");
exit;
정말 염치 없이지만 체크 한번만 부탁드리겠습니다.