카카오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>
결과