카카오톡 로그인 api 연결하기

최준호·2023년 4월 24일
0

- 카카오 api를 사용하기 위해선 아래 사이트를 사용해야합니다.

https://developers.kakao.com/

카카오api 사용을 위해 기초를 배우고 싶다면 밑에 주소를 참고해주세요

카카오 디펠로퍼 사이트에서 내 애플리케이션를 추가합니다

위 내용을 작성 후

키를 발급 받습니다.

메뉴- 앱설정 - 플랫폼에 들어와 web를 사용할 거니 설정해줍니다.

전 미리 사용하는 주소를 사용하였고
Redirect URI를 등록해줍니다.

이와 같이 카카오 api를 사용하였을 때 돌아오는 주소를 설정해주시는 겁니다.

메뉴- 제품설정 - 카카오 로그인 - 동의항목에 들어가 각각 설정을 해줍니다.

카카오 디펠로퍼 설정은 끝.


php 코드
https://blog.redinfo.co.kr/post/view?pid=86
위 블로그를 참고하여 작성하였습니다.

php 구조

config.php

<?php
session_start(); // 세션 시작
// 설정파일 조정 필요
$kakaoConfig = array(
	// ![수정필요] @@ 카카오 REST API 키값 , 카카오 개발자 사이트 > 내 애플리케이션 > 요약정보에서 REST API 키값
	'client_id'=>'7b3d8c145b5fffe4dcc8e55b07ea7512',

	// ![수정필요] @@ 카카오 개발자 사이트 > 내 애플리케이션 > 카카오로그인 > 보안 에서 생성가능
	'client_secret'=>'iVTc5xjwo9LPpcJ7zkaJjkKSOxqYqOsS',

	// 로그인 인증 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'].'/controller/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 "./controller/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 "config.php";
        include_once "../DB/db_connection.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) ); }

        
        // include_once "../DB/db_connection.php";
		// 프로필정보 저장 -- 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: ../test.php");
    // index 페이지 이동
	exit;

test.php

<?php
session_start(); // 세션 시작

echo print_r($_SESSION);
// 세션의 모든 값을 출력
echo "<hr/>";

echo var_dump($_SESSION);

echo "<hr/>";

echo print_r($_SESSION['properties']);

echo "<hr/>";

echo print_r($_SESSION['kakao_account']);


echo "<hr/>";

// 배열내 특정 값 뽑아내는 방법
echo $_SESSION['kakao_account']->email;

결과


  • 수정본

config.php

<?php
session_start(); // 세션 시작
// 설정파일 조정 필요
$kakaoConfig = array(
	// ![수정필요] @@ 카카오 REST API 키값 , 카카오 개발자 사이트 > 내 애플리케이션 > 요약정보에서 REST API 키값
	'client_id'=>'7b3d8c145b5fffe4dcc8e55b07ea7512',

	// ![수정필요] @@ 카카오 개발자 사이트 > 내 애플리케이션 > 카카오로그인 > 보안 에서 생성가능
	'client_secret'=>'iVTc5xjwo9LPpcJ7zkaJjkKSOxqYqOsS',

	// 로그인 인증 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'].'/controller/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;		
}

oauth.php

<?php 
	try{
		// ![수정필요] 카카오 API 환경설정 파일 
		include_once "config.php";
        include_once("..\DB\db_connection.php"); // DB 연결

		// 기본 응답 설정
		$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;
		*/
    
        try{
            
        // CANNOT USE OBJECT OF TYPE STDCLASS AS ARRAY 해결법
        $xml_data=json_encode($profile_data);
        $xml_data=json_decode($xml_data,true);
        // json 타입으로 변경해준다.

        $json_profile_data_array = array_merge($xml_data['properties'],$xml_data['kakao_account']); // 배열 합치기 이게 최종 배열
        // $json_profile_data_unique_array = array_unique($json_profile_data_array); // 종복된 배열의 값 삭제
        foreach ($json_profile_data_array as $key => $val){    // 세션에 profile_date 값을 다 넣어준다.
            if(!is_numeric($key)){  // key 값이 정수 일때가 아닐경우 넣어준다.
                $_SESSION[$key] = $val;
                // Session 의 키 값이 숫자 들어갈 경우 오류가 발생하므로
                // key값에 숫자를 넣지 않는다.
            }
        }  // foreach

        // DB 내 같은 이메일이 있는지 확인. 나중엔 핸드폰 번호로 확인하면 된다. 
        
        $sql_query = "select * from member_table where memEmail = '".$json_profile_data_array["email"]."' "; //DB 쿼리문 작성
        $result = mysqli_query($connect, $sql_query);   //쿼리문으로 받은 데이터를 $result에 넣어준다.
        $memInfo = mysqli_fetch_array($result);   // 이메일이 같은게 있다면 모든 정보를 가져온다.
        
        
		//$is_member = true; // 기존회원인지(true) / 비회원인지(false) db 체크 
		// 로그인 회원일 경우
		if(isset($memInfo)){
            $_SESSION[ 'yes' ] = 11111111;
		} // if
		// 새로 가입일 경우
		else{
            $sql_query = "Insert into member_table (memName,memPassword,memEmail,memId,memProfilePath,memProfileName,memAddr) ".
            "values ('".$json_profile_data_array["nickname"]."','kakaoPassword','".$json_profile_data_array["email"]."','kakaoId','','".$json_profile_data_array["profile_image"]."','kakaoAddr')";
            mysqli_query($connect, $sql_query);   //쿼리문으로 받은 데이터를 $result에 넣어준다.
            
            $_SESSION[ 'no' ] = 00000000;
        } // else
        }

        catch(Exception $e){

        }
        
        // try{
        //     // CANNOT USE OBJECT OF TYPE STDCLASS AS ARRAY 해결법
        // $xml_data=json_encode($profile_data);
        // $xml_data=json_decode($xml_data,true);


                    
           
		// }
        // }        
        
		
		// 최종 성공 처리
		$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{
        
	}
    // 데이터입력 후 데이터베이스 연결을 무조건 끊어줘야함
    mysqli_close($connect); 
	// state 초기화 
	setcookie('state','',time()-3000); // 300 초동안 유효

	header("Location: ../test.php");
    // index 페이지 이동
	exit;

login.php

<?php 
	// ![수정필요] 카카오 API 환경설정 파일 
	include_once "./controller/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>
	<button onclick="location.href='./controller/logout.php'"  >session_destroy</button>
</div>

결과

업로드중..

profile
변화를 두려워하는 사람이 가장 불행한 사람이다.

0개의 댓글