카카오로그인을 이용한 가입, 로그인 프로세스 보완

This commit is contained in:
2018-03-18 04:12:37 +09:00
parent be7df8adac
commit b52bd4e4e2
11 changed files with 298 additions and 26 deletions
+5 -6
View File
@@ -7,10 +7,9 @@ require_once(ROOT.'/f_config/SESSION.php');
$SESSION->logout();
unset($_SESSION['access_token']);
setcookie("hello", "", time()-3600);
$response['result'] = 'SUCCESS';
sleep(1);
echo json_encode($response);
echo json_encode([
'result'=>'SUCCESS'
]);
+28 -1
View File
@@ -2,6 +2,7 @@
require_once('_common.php');
require_once(ROOT.'/f_func/class._Session.php');
require_once(ROOT.'/f_func/class._String.php');
require(ROOT.'/f_func/class._Time.php');
require_once(ROOT.'/f_config/DB.php');
use utilphp\util as util;
@@ -21,8 +22,16 @@ if(!$username || !$password){
]);
}
$canLogin = getRootDB()->queryFirstField('SELECT `LOGIN` FROM `SYSTEM` WHERE `NO` = 1');
if($canLogin != 'Y'){
returnJson([
'result'=>false,
'reason'=>'현재는 로그인이 금지되어있습니다!'
]);
}
$userInfo = getRootDB()->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade` '.
'SELECT `no`, `id`, `name`, `grade`, `delete_after` '.
'from member where id=%s_username AND '.
'pw=sha2(concat(salt, %s_password, salt), 512)',[
'username'=>$username,
@@ -36,6 +45,24 @@ if(!$userInfo){
]);
}
$nowDate = _Time::DatetimeNow();
if($userInfo['delete_after']){
if($userInfo['delete_after'] < $nowDate){
getRootDB()->delete('member', 'no=%i', $userInfo['no']);
returnJson([
'result'=>false,
'reason'=>"기간 만기로 삭제되었습니다. 재 가입을 시도해주세요."
]);
}
else{
returnJson([
'result'=>false,
'reason'=>"삭제 요청된 계정입니다.[{$userInfo['delete_after']}]"
]);
}
}
$SESSION->login($userInfo['no'], $userInfo['id'], $userInfo['grade']);
returnJson([
'result'=>true,
+78 -1
View File
@@ -7,9 +7,86 @@ require('conf.php');
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>카카오 로그인하기</title>
<script src="../e_lib/jquery-3.2.1.min.js"></script>
<script>
var oauthMode = null;
function getOAuthToken(mode='login', scope_list = null){
oauthMode = mode;
var url = 'https://kauth.kakao.com/oauth/authorize?client_id=<?=KakaoKey::REST_KEY?>&redirect_uri=<?=KakaoKey::REDIRECT_URI?>&response_type=code';
if(Array.isArray(scope_list)){
url += '&scope='+scope_list.join(',');
}
else if(typeof scope_list === 'string' || scope_list instanceof String){
url += '&scope='+scope_list;
}
window.open(url,"KakaoAccountLogin","width=600,height=450");
}
function sendTempPasswordToKakaoTalk(retry=false){
$.post({
url:'j_change_pw.php',
dataType:'json'
}).then(function(obj){
if (!obj.result && retry) {
getOAuthToken('change_pw', 'talk_message');
}
else if(!obj.result){
alert(obj.reason);
}
else{
alert('임시 비밀번호가 카카오톡으로 전송되었습니다.');
}
});
}
function doLoginUsingOAuth(retry=false){
$.post({
url:'j_login_oauth.php',
dataType:'json'
}).then(function(obj){
if(!obj.result){
if(obj.noRetry || !retry){
alert(obj.reason);
}
else{
getOAuthToken();
}
}
else{
window.location.href = '../';
}
});
}
function postOAuthResult(result){
if(result == 'join'){
window.location.href = 'join.php';
}
else if(result == 'login'){
console.log('로그인모드');
if(oauthMode=='change_pw'){
sendTempPasswordToKakaoTalk();
}
}
else{
alert('예외 발생!');
}
}
</script>
</head>
<body>
<a href="https://kauth.kakao.com/oauth/authorize?client_id=<?=KakaoKey::REST_KEY?>&redirect_uri=<?=KakaoKey::REDIRECT_URI?>&response_type=code"><img src="kakao_btn.png"></a>
<a href="javascript:doLoginUsingOAuth(true);"><img src="kakao_btn.png"></a><br>
<br>
비밀번호 찾기<br>
<a href="javascript:sendTempPasswordToKakaoTalk(true);"><img src="kakao_to_me.png"></a>
<input type='hidden' name="login_mode" id="login_mode">
</body>
</html>
+6
View File
@@ -0,0 +1,6 @@
<?php
require('_common.php');
require(ROOT.'/f_config/DB.php');
require(ROOT.'/f_func/class._Time.php');
require('kakao.php');
+13 -3
View File
@@ -28,7 +28,8 @@ if(!$access_token){
'reason'=>'로그인 토큰 에러. 다시 카카오로그인을 수행해주세요.'
]);
}
if($refresh_token_expires < $nowDate){
if($expires < $nowDate && (!$refresh_token || ($refresh_token_expires < $nowDate))){
unset($_SESSION['access_token']);
returnJson([
'result'=>false,
'reason'=>'로그인 토큰 만료.'.$refresh_token_expires.' 다시 카카오로그인을 수행해주세요.'
@@ -85,6 +86,7 @@ $restAPI = new Kakao_REST_API_Helper($access_token);
if($expires < $nowDate){
$result = $restAPI->refresh_access_token($refresh_token);
if(!isset($refresh_token)){
unset($_SESSION['access_token']);
returnJson([
'result'=>false,
'reason'=>'카카오 로그인 과정 중 추가 갱신 절차를 실패했습니다'
@@ -111,6 +113,15 @@ if(!$kakaoID && util::array_get($signupResult['msg'])!='already registered'){
}
$me = $restAPI->meWithEmail();
$me['code'] = util::array_get($me['code'], 0);
if ($me['code']< 0) {
$restAPI->unlink();
returnJson([
'result'=>false,
'reason'=>'카카오로그인이 정상적으로 수행되지 않았습니다.'
]);
}
if(!util::array_get($me['kaccount_email_verified'],false)){
$restAPI->unlink();
returnJson([
@@ -120,6 +131,7 @@ if(!util::array_get($me['kaccount_email_verified'],false)){
}
$email = $me['kaccount_email'];
$_SESSION['kaccount_email'] = $email;
$emailChk = checkEmailDup($email);
if($emailChk !== true){
$restAPI->unlink();
@@ -130,8 +142,6 @@ if($emailChk !== true){
}
//모든 절차 종료. 등록.
getRootDB()->insert('auth_kakao',[
'id'=>$kakaoID,
'access_token'=>$access_token,
+130
View File
@@ -0,0 +1,130 @@
<?php
require('_common.php');
require(ROOT.'/f_func/class._Session.php');
require(ROOT.'/f_config/DB.php');
require(ROOT.'/f_func/class._Time.php');
require('kakao.php');
use utilphp\util as util;
$SESSION = new _Session();
if($SESSION->isLoggedIn()){
$SESSION->logout();
}
$canLogin = getRootDB()->queryFirstField('SELECT `LOGIN` FROM `SYSTEM` WHERE `NO` = 1');
if($canLogin != 'Y'){
returnJson([
'result'=>false,
'reason'=>'현재는 로그인이 금지되어있습니다!',
'noRetry'=>true
]);
}
$nowDate = _Time::DatetimeNow();
$access_token = util::array_get($_SESSION['access_token']);
$expires = util::array_get($_SESSION['expires']);
$refresh_token = util::array_get($_SESSION['refresh_token']);
$refresh_token_expires = util::array_get($_SESSION['refresh_token_expires']);
$email = util::array_get($_SESSION['kaccount_email']);
if(!$access_token || !$expires){
returnJson([
'result'=>false,
'reason'=>'카카오로그인이 이루어지지 않았습니다.'
]);
}
//TODO: join과 login의 동작이 비슷하다. helper class로 묶자.
$restAPI = new Kakao_REST_API_Helper($access_token);
if($expires < $nowDate && (!$refresh_token || ($refresh_token_expires < $nowDate))){
returnJson([
'result'=>false,
'reason'=>'로그인 토큰 만료.'.$refresh_token_expires.' 다시 카카오로그인을 수행해주세요.'
]);
}
if($expires < $nowDate){
unset($_SESSION['kaccount_email']);
$email = null;
$result = $restAPI->refresh_access_token($refresh_token);
if(!isset($refresh_token)){
returnJson([
'result'=>false,
'reason'=>'카카오 로그인 과정 중 추가 갱신 절차를 실패했습니다'
]);
}
$access_token = $result['access_token'];
$expires = _Time::DatetimeFromNowSecond($nowDate, $result['expires_in']);
if(isset($result['refresh_token'])){
$refresh_token = util::array_get($result['refresh_token']);
$refresh_token_expires = _Time::DatetimeFromNowSecond($nowDate, $result['refresh_token_expires_in']);
}
}
if(!$email){
$me = $restAPI->meWithEmail();
$me['code'] = util::array_get($me['code'], 0);
if ($me['code']< 0) {
returnJson([
'result'=>false,
'reason'=>'카카오로그인이 정상적으로 수행되지 않았습니다.'
]);
}
if(!util::array_get($me['kaccount_email_verified'],false)){
$restAPI->unlink();
returnJson([
'result'=>false,
'reason'=>'카카오 계정 이메일이 아직 인증되지 않았습니다'
]);
}
$email = $me['kaccount_email'];
$_SESSION['kaccount_email'] = $email;
}
$userInfo = getRootDB()->queryFirstRow(
'SELECT `no`, `id`, `name`, `grade`, `delete_after` from member where email=%s',$email);
if(!$userInfo){
$restAPI->unlink();
unset($_SESSION['access_token']);
returnJson([
'result'=>false,
'reason'=>'카카오로그인에 해당하는 계정이 없습니다. 재 가입을 시도해주세요.'
]);
}
if($userInfo['delete_after']){
if($userInfo['delete_after'] < $nowDate){
$restAPI->unlink();
unset($_SESSION['access_token']);
getRootDB()->delete('member', 'no=%i', $userInfo['no']);
returnJson([
'result'=>false,
'reason'=>"기간 만기로 삭제되었습니다. 재 가입을 시도해주세요."
]);
}
else{
$restAPI->unlink();
unset($_SESSION['access_token']);
returnJson([
'result'=>false,
'reason'=>"삭제 요청된 계정입니다.[{$userInfo['delete_after']}]"
]);
}
}
$SESSION->login($userInfo['no'], $userInfo['id'], $userInfo['grade']);
returnJson([
'result'=>true,
'reason'=>'로그인 되었습니다.'
]);
+5
View File
@@ -39,6 +39,7 @@ class Talk_Path
{
public static $TALK_PROFILE= "/v1/api/talk/profile";
public static $TALK_TO_ME = "/v2/api/talk/memo/send";
public static $TALK_TO_ME_DEFAULT = "/v2/api/talk/memo/default/send";
}
class Push_Notification_Path
@@ -230,6 +231,10 @@ class Kakao_REST_API_Helper
return $this->request(Talk_Path::$TALK_PROFILE);
}
public function talk_to_me_default($req){
return $this->request(TalkPath::$TALK_TO_ME_DEFAULT, json_encode($req), 'POST');
}
///////////////////////////////////////////////////////////////
// API Test
Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.5 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

+14 -3
View File
@@ -2,6 +2,7 @@
require_once('_common.php');
require_once(__dir__.'/../d_setting/conf.php');
require_once(__dir__.'/../f_func/func.php');
require(ROOT.'/f_func/class._Time.php');
function checkUsernameDup($username){
if(!$username){
@@ -48,9 +49,19 @@ function checkEmailDup($email){
return '적절하지 않은 길이입니다.';
}
$cnt = getRootDB()->queryFirstField('SELECT count(no) FROM member WHERE `email` = %s LIMIT 1', $email);
if($cnt != 0){
return '이미 사용중인 이메일입니다';
$userInfo = getRootDB()->queryFirstField('SELECT `no`, `delete_after` FROM member WHERE `email` = %s LIMIT 1', $email);
if($userInfo){
$nowDate = _Time::DatetimeNow();
if (!$userInfo['delete_after']) {
return '이미 사용중인 이메일입니다. 관리자에게 문의해주세요.';
}
if($userInfo['delete_after'] >= $userInfo){
return "삭제 요청된 계정입니다.[{$userInfo['delete_after']}]";
}
//$userInfo['delete_after'] < $userInfo
getRootDB()->delete('member', 'no=%i', $userInfo['no']);
}
return true;
}
+19 -12
View File
@@ -1,6 +1,5 @@
<?php
require('_common.php');
require(ROOT.'/f_config/DB.php');
require(ROOT.'/f_func/class._Time.php');
require('kakao.php');
use utilphp\util as util;
@@ -42,23 +41,31 @@ $_SESSION['tmpx'] = json_encode($result,JSON_UNESCAPED_UNICODE);
//echo "<br>\n";
$me = $restAPI->meWithEmail();
var_dump($me);
$oauth_mode = 'login';
$me['code'] = util::array_get($me['code'], 0);
if($me['code']< 0){
switch($me['msg']){
case 'NotRegisteredUserException':
header('Location:join.php', true, 303);
die();
$oauth_mode = 'join';
break;
default:
die('알 수 없는 에러:'.$me['msg']);
$oauth_mode = 'error';
}
}
else{
$_SESSION['kaccount_email'] = $me['kaccount_email'];
}
//이메일 주소를 받아옴
//
//$db = getRootDB();
//TODO: 로그인된 유저인지 확인해야함.
?>
<!DOCTYPE html>
<html lang="ko">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<script>
opener.location.href="javascript:postOAuthResult('<?=$oauth_mode?>');";
window.close();
</script>
</head>
</html>