MintState WebLog

카카오 사용자 관리 (카카오 아이디로 로그인) PHP 연동 본문

Develop/PHP

카카오 사용자 관리 (카카오 아이디로 로그인) PHP 연동

MintState 2018. 7. 6. 10:28


이전에 네아로 (네이버 아이디로 로그인)에 대해 글을 쓴적이 있습니다.
이번에는 카카오톡 아이디로로 로그인하는 방법을 알아볼까 합니다.

네이버와 마찬가지로 카카오 로그인도 자바스크립트 api를 지원합니다.
하지만 자바스크립트의 경우 제한사항이 많으므로 이전에 알아본 네아로의 방법인 REST API로 설명을 드리겠습니다.
개발가이드 URL : https://developers.kakao.com/docs/restapi/user-management

1. 우선 카카오 개발자 페이지에서 app_key를 발급 받고 설정하여 주셔야합니다.
https://developers.kakao.com/

개발자 페이지에 로그인을 하고 로고와 앱이름을 입력하고 앱 만들기를 합니다.

앱을 만들었으면 각종키(네이티브 앱 키, REST API 키, JavaScript 키, Admin 키)가 자동으로 생성됩니다.
해당 키는 개발자 페이지 좌측의 설정->일반에서 확인할 수 있습니다.

여기서 필요한 것은 REST API 키입니다.
설정->일반 메뉴에서 플랫폼(웹)을 추가해 줍니다. 
도메인과 Redirect Path를 입력하시면 됩니다. 도메인은 자신의 홈페이지 주소를 적으시고, Redirect Path은 api호출시 리턴 받을 URL을 적으시면됩니다.

저는 임으로 /kakao_callback.php 이라고 하였습니다.

플랫폼을 추가하셨으면 좌측 메뉴 설정->사용자 관리로 가셔서 마지막 설정을 해주시면 됩니다.
사용자 관리를 활성화 하시고 동의항목에서 필요한 부문을 체크하여 주세요. 불필요한 항목을 체크하는 것은 바람직하지 않습니다.

필요하다면 탭에 접근권한 관리항목에서 카카오글쓰기, 카카오톡 메시지 전송등을 체크하시면 됩니다.

더욱 보안에 신경을 쓴다면 좌측메뉴 설정->고급에서 Client Secret 코드를 발급 받아서 REST API 호출시 사용하셔도 됩니다.
단 필수 사항이 아니므로 그냥 넘어 가겠습니다. 자세한 내용은 API 가이드를 확인하세요

2. 로그인 버튼
이제 설정이 끝났으니 로그인 버튼을 달아 보겠습니다.

로그인 버튼은 https://developers.kakao.com/buttons 에서 다운 받을 수 있습니다.

<?php
// KAKAO LOGIN
define('KAKAO_CLIENT_ID', '클라언트 아이디');
define('KAKAO_CLIENT_SECRET', '클아이언트 시크릿'); // 필수 아님
define('KAKAO_CALLBACK_URL', 'http://yesyo.com/kakao_callback.php'); // 콜백URL

// 카카오 로그인 접근토큰 요청 예제
$kakao_state = md5(microtime() . mt_rand()); // 보안용 값
$_SESSION['kakao_state'] = $kakao_state;
$kakao_apiURL = "https://kauth.kakao.com/oauth/authorize?client_id=".KAKAO_CLIENT_ID."&redirect_uri=".urlencode(KAKAO_CALLBACK_URL)."&response_type=code&state=".$kakao_state;
?>
<a href="<?=$kakao_apiURL;?>"><img src="sns_kakao.png"></a>


3. 콜백 받기
로그인 버튼으로 로그인하시면 설정하신 콜백 URL로 정보가 리다이렉트 됩니다.
아래처럼 code 값과 state값이 넘어 옵니다. state 값으로 접근 체크하시고 code값으로 토큰과 사용자 정보를 받으시면 됩니다.
kakao_callback.php?code=Lrk936YWHKbFKUdlMKbNmxs3PSjHsepc9a3kgV6w9hnUsi-JcqSoSCqaWhf1rUR8hz_06Ao8BNgAAAFkbPyAiQ&state=76f3681c0145b467f50fbfc07

<?php
session_start();
// KAKAO LOGIN
define('KAKAO_CLIENT_ID', '클라언트 아이디');
define('KAKAO_CLIENT_SECRET', '클아이언트 시크릿'); // 필수 아님
define('KAKAO_CALLBACK_URL', 'http://yesyo.com/kakao_callback.php');

if ($_SESSION['kakao_state'] != $_GET['state']) {
	// 오류가 발생하였습니다. 잘못된 경로로 접근 하신것 같습니다.
}

if ($_GET["code"]) {
	//사용자 토큰 받기
	$code   = $_GET["code"]; 
	$params = sprintf( 'grant_type=authorization_code&client_id=%s&redirect_uri=%s&code=%s', KAKAO_CLIENT_ID, KAKAO_CALLBACK_URL, $code); 

	$TOKEN_API_URL = "https://kauth.kakao.com/oauth/token"; 
	$opts = array(
		CURLOPT_URL => $TOKEN_API_URL, 
		CURLOPT_SSL_VERIFYPEER => false, 
		CURLOPT_SSLVERSION => 1, // TLS
		CURLOPT_POST => true, 
		CURLOPT_POSTFIELDS => $params, 
		CURLOPT_RETURNTRANSFER => true, 
		CURLOPT_HEADER => false 
	);

	$curlSession = curl_init(); 
	curl_setopt_array($curlSession, $opts); 
	$accessTokenJson = curl_exec($curlSession); 
	curl_close($curlSession); 

	$responseArr = json_decode($accessTokenJson, true);
	$_SESSION['kakao_access_token'] = $responseArr['access_token'];
	$_SESSION['kakao_refresh_token'] = $responseArr['refresh_token'];
	$_SESSION['kakao_refresh_token_expires_in'] = $responseArr['refresh_token_expires_in'];

	//사용자 정보 가저오기
	$USER_API_URL= "https://kapi.kakao.com/v2/user/me"; 
	$opts = array(
		CURLOPT_URL => $USER_API_URL,
		CURLOPT_SSL_VERIFYPEER => false,
		CURLOPT_SSLVERSION => 1,
		CURLOPT_POST => true,
		CURLOPT_POSTFIELDS => false,
		CURLOPT_RETURNTRANSFER => true,
		CURLOPT_HTTPHEADER => array(
			"Authorization: Bearer " . $responseArr['access_token']
		)
	);

	$curlSession = curl_init();
	curl_setopt_array($curlSession, $opts);
	$accessUserJson = curl_exec($curlSession);
	curl_close($curlSession);

	$me_responseArr = json_decode($accessUserJson, true);

	if ($me_responseArr['id']) {
		// 회원아이디(kakao_ 접두사에 네이버 아이디를 붙여줌)
		$mb_uid = 'kakao_'.$me_responseArr['id'];
		// 회원가입 DB에서 회원이 있으면(이미 가입되어 있다면) 토큰을 업데이트 하고 로그인함
		if (회원정보가 있다면) {
			// 멤버 DB에 토큰값 업데이트 $responseArr['access_token']
			// 로그인
		}
		// 회원정보가 없다면 회원가입
		else {
			// 회원아이디 $mb_uid
			// properties 항목은 카카오 회원이 설정한 경우만 넘겨 받습니다.
			$mb_nickname = $me_responseArr['properties']['nickname']; // 닉네임
			$mb_profile_image = $me_responseArr['properties']['profile_image']; // 프로필 이미지
			$mb_thumbnail_image = $me_responseArr['properties']['thumbnail_image']; // 프로필 이미지

			$mb_email = $me_responseArr['kakao_account']['email']; // 이메일
			$mb_gender = $me_responseArr['kakao_account']['gender']; // 성별 female/male
			$mb_age = $me_responseArr['kakao_account']['age_range']; // 연령대
			$mb_birthday = $me_responseArr['kakao_account']['birthday']; // 생일

			// 멤버 DB에 토큰과 회원정보를 넣고 로그인
		}

	} else {
		// 회원정보를 가져오지 못했습니다.
	}
}


4. 연결해제(탈퇴시)
회원탈퇴나 카카오로그인 연결 해제시 필요한 부분입니다.
카카오 약관에도 명시되어 있듯이 탈퇴시 연결을 해제 해야 합니다.

<?php
//연결 해제(탈퇴시)
$access_token = 회원 토큰값;

$UNLINK_API_URL = "https://kapi.kakao.com/v1/user/unlink"; 
$opts = array(
	CURLOPT_URL => $UNLINK_API_URL,
	CURLOPT_SSL_VERIFYPEER => false,
	CURLOPT_SSLVERSION => 1,
	CURLOPT_POST => true,
	CURLOPT_POSTFIELDS => false,
	CURLOPT_RETURNTRANSFER => true,
	CURLOPT_HTTPHEADER => array(
		"Authorization: Bearer " . $access_token
	)
);

$curlSession = curl_init();
curl_setopt_array($curlSession, $opts);
$accessUnlinkJson = curl_exec($curlSession);
curl_close($curlSession);

$unlink_responseArr = json_decode($accessUnlinkJson, true);

// 성공시 카카오 사용자 id ($unlink_responseArr['id'])값을 넘겨 받습니다. 회원정보의 카카오 id 값과 비교하시면 됩니다.

카카오 웹페이지나 카카오 앱에서 연결된 앱을 확인 할 수 있습니다.
https://accounts.kakao.com/weblogin/account/connected_apps


Comments