카카오로그인을 이용한 가입, 로그인 프로세스 보완
This commit is contained in:
@@ -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
@@ -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
@@ -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>
|
||||
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
require('_common.php');
|
||||
require(ROOT.'/f_config/DB.php');
|
||||
require(ROOT.'/f_func/class._Time.php');
|
||||
require('kakao.php');
|
||||
@@ -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,
|
||||
|
||||
@@ -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'=>'로그인 되었습니다.'
|
||||
]);
|
||||
@@ -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
@@ -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
@@ -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>
|
||||
Reference in New Issue
Block a user