queryFirstField('SELECT REG FROM `system` WHERE `NO` = 1'); if($canJoin != 'Y'){ Json::die([ 'result'=>false, 'reason'=>'현재는 가입이 금지되어있습니다!' ]); } $nowDate = TimeUtil::now(); $access_token = $session->access_token; $expires = $session->expires; $refresh_token = $session->refresh_token; $refresh_token_expires = $session->refresh_token_expires; if(!$access_token){ Json::die([ 'result'=>false, 'reason'=>'로그인 토큰 에러. 다시 카카오로그인을 수행해주세요.' ]); } if($expires < $nowDate && (!$refresh_token || ($refresh_token_expires < $nowDate))){ $session->access_token = null; Json::die([ 'result'=>false, 'reason'=>'로그인 토큰 만료.'.$refresh_token_expires.' 다시 카카오로그인을 수행해주세요.' ]); } $secret_agree = Util::getPost('secret_agree', 'bool'); $secret_agree2 = Util::getPost('secret_agree2', 'bool'); $third_use = Util::getPost('third_use', 'bool'); $username = mb_strtolower(Util::getPost('username'), 'utf-8'); $password = Util::getPost('password'); $nickname = Util::getPost('nickname'); if(!$username || !$password || !$nickname){ Json::die([ 'result'=>false, 'reason'=>'입력값이 설정되지 않았습니다.' ]); } '@phan-var-force string $password'; if(strlen($password)!=128){ Json::die([ 'result'=>false, 'reason'=>'올바르지 않은 비밀번호 해시 포맷입니다.' ]); } if(!$secret_agree){ Json::die([ 'result'=>false, 'reason'=>'약관에 동의해야 가입하실 수 있습니다.' ]); } if(!$secret_agree2){ Json::die([ 'result'=>false, 'reason'=>'개인정보 제공 및 이용에 대해 동의해야 가입하실 수 있습니다.' ]); } $usernameChk = checkUsernameDup($username); if($usernameChk !== true){ Json::die([ 'result'=>false, 'reason'=>$usernameChk ]); } $nicknameChk = checkNicknameDup($nickname); if($nicknameChk !== true){ Json::die([ 'result'=>false, 'reason'=>$nicknameChk ]); } $userSalt = bin2hex(random_bytes(8)); $finalPassword = Util::hashPassword($userSalt, $password); //클라이언트 단에서 보내준 데이터 준비가 끝났다. $restAPI = new Kakao_REST_API_Helper($access_token); if($expires < $nowDate){ $result = $restAPI->refresh_access_token($refresh_token); if(!isset($refresh_token)){ $session->access_token = null; Json::die([ 'result'=>false, 'reason'=>'카카오 로그인 과정 중 추가 갱신 절차를 실패했습니다' ]); } $access_token = $result['access_token']; $expires = TimeUtil::nowAddSeconds($result['expires_in']); if(isset($result['refresh_token'])){ $refresh_token = $result['refresh_token'] ?? null; $refresh_token_expires = TimeUtil::nowAddSeconds($result['refresh_token_expires_in']); } } $signupResult = $restAPI->signup(); $kakaoID = $signupResult['id'] ?? null; if(!$kakaoID && ($signupResult['msg'] ?? null) !='already registered'){ Json::die([ 'result'=>false, 'reason'=>'카카오 로그인 과정 중 앱 연결 절차를 실패했습니다'.Json::encode($signupResult) ]); } $me = $restAPI->meWithEmail(); $me['code'] = $me['code'] ?? 0; $kakao_account = $me['kakao_account']??[]; if ($me['code']< 0) { $restAPI->unlink(); Json::die([ 'result'=>false, 'reason'=>'카카오로그인이 정상적으로 수행되지 않았습니다.', ]); } if(!($kakao_account['has_email']??false)){ Json::die([ 'result'=>false, 'reqOTP'=>false, 'reason'=>'이메일 정보 공유를 허가해 주셔야 합니다.', ]); } $validEmail = $kakao_account['is_email_valid']??false; $verifiedEmail = $kakao_account['is_email_verified']??false; if(!$validEmail || !$verifiedEmail){ $restAPI->unlink(); Json::die([ 'result'=>false, 'reason'=>'카카오 계정 이메일이 아직 인증되지 않았습니다', ]); } $email = $kakao_account['email']??null; $session->kaccount_email = $email; $emailChk = checkEmailDup($email); if($emailChk !== true){ $restAPI->unlink(); Json::die([ 'result'=>false, 'reason'=>$emailChk ]); } //모든 절차 종료. 등록. RootDB::db()->insert('member',[ 'oauth_id' => $kakaoID, 'oauth_type' => 'KAKAO', 'id' => $username, 'email' => $email, 'third_use'=> $third_use, 'pw' => $finalPassword, 'salt' => $userSalt, 'name'=>$nickname, 'reg_date'=>$nowDate, 'oauth_info'=>Json::encode([ 'accessToken'=>$access_token, 'refreshToken'=>$refresh_token, 'accessTokenValidUntil'=>$expires, 'refreshTokenValidUntil'=>$refresh_token_expires ]) ]); $userID = RootDB::db()->insertId(); RootDB::db()->insert('member_log', [ 'member_no'=>$userID, 'date'=>$nowDate, 'action_type'=>'reg', 'action'=>Json::encode([ 'type'=>'kakao', 'id'=>$kakaoID, 'email'=>$email, 'name'=>$nickname ]) ]); Json::die([ 'result'=>true, 'reason'=>'success' ]);