안내

  • 본 글은 카카오API 에서 소개되는 글과 중복되어 함께 살펴보셔도 좋습니다. 

 

 
[카카오API] 카카오로그인 - REST API 를 이용한 로그인 방식 (PHP) - R BLOG
지난번 팝업을 이용한 카카오로그인에 대해 간단한게 살펴보았다.  이번에는 REST API 를 이용한 카카오로그인에 대해 알아보도록 하자    기본적으로 REST API 를 이용하기 위해선 PHP 스크립트를 실행할 수 있는 서버가 있어야하며 해당 서버가 준비가 안되었다면 이번 샘플을 실행할 수 없다. CURL 통신의 경우 L··· - R BLOG
blog.redinfo.co.kr/post/view?pid=105

 

간편 로그인의 경우 사이트내 인증수단으로 많이 사용되며 요즘 사이트들은 거의 반 필수적으로 

도입을 하고 있는 추세다. 

 

간편로그인의 장점같은 경우 사용자의 수고를 덜어줌에 있기때문에 사용자를 위한 서비스를 한다면

반드시 간편로그인을 연동하는게 좋다. 

 

이번편은 카카오에서 제공하는 카카오 로그인 연동중 REST API 를 통한 방법을

예제 소스를 통해 소개할려 고 한다. 

 

솔직히 JAVASCRIPT 의 경우 고도화된 사이트에서는 인증처리가 오히려 복잡해 지기 때문에 

나같은 경우 사용 하지 않는다.

 

만약 JAVASCRIPT 방식으로 연동을 원한다면 아래의 카카오 개발문서를 참고바란다. 

 

카카오로그인 JAVASCRIPT 샘플 바로가기

https://developers.kakao.com/tool/demo/login/login 

 

참고로 이번편에 소개하는 REST API 의 경우 PHP 서버에서 CURL로 통신하기 떄문에

자신의 서버에 CURL 통신이 가능한지 먼저 확인이 필요하다.   

(이번편은 카카오 로그인 REST API 연동편이기에 절대 귀찮아서(맞음..)  링크로 대체한건 아니니 양해 바란다.)

 

리눅스 CURL 테스트 검색 - BY Google

https://www.google.com/search?q=%EB%A6%AC%EB%88%85%EC%8A%A4+curl+%ED%85%8C%EC%8A%A4%ED%8A%B8&oq=%EB%A6%AC%EB%88%85%EC%8A%A4+curl+%ED%85%8C%EC%8A%A4%ED%8A%B8&aqs=chrome..69i57j0i512l2j0i20i263i512j0i512l6.5468j0j7&sourceid=chrome&ie=UTF-8 

 

카카오 로그인 REST API를 연동하기 위해선 당연하겠지만 카카오 개발자 사이트를 통해 

필요한 정보가 미리 세팅이 되어있어야 한다. 이러한 세팅이 안되어있다면  지금 소개하는

샘플 소스를 이용할 수 없다. 

 

추가되는 파일은 아래 4가지 파일로 볼 수 있다.  

예제 파일이므로 반드시 수정할 부분과 db 처리 부분은 별도 처리하길 바란다. 

 

  1. 카카오 API 설정파일 (config.php)
    • 카카오 인증 키값 및 함수 정의 파일
  2.  로그인 페이지 (login.php)
  3.  카카오 인증 후 처리 페이지 (oauth.php)

 

카카오 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;