userModel = new UserListModel(); } //구글 로그인 콜백(인증) public function callback() { if (isset($_GET['code'])) { $code = $_GET['code']; // Google 클라이언트 설정 $client = new Client(); $client->setClientId('373780605211-diojebh7mug45urv9rnqdil6n0b1ogge.apps.googleusercontent.com'); $client->setClientSecret('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'); $client->setRedirectUri('https://shopdeli.mycafe24.com/auth/callback'); $client->setAccessType('offline'); // 인증 요청 전에 지정! $client->authenticate($code); $googleAccessToken = $client->getAccessToken(); // 별도의 변수로 분리 $googleOAuthAccessToken = $googleAccessToken['access_token'] ?? null; $googleOAuthRefreshToken = $googleAccessToken['refresh_token'] ?? null; // 업데이트: setAccessToken에는 전체 배열을 넣을 수 있지만 // accessToken 만 넣으려면 아래처럼 쓸 수 있습니다. if ($googleOAuthAccessToken) { $client->setAccessToken($googleOAuthAccessToken); } // 사용자 정보 가져오기 $oauth2 = new Oauth2($client); $userInfo = $oauth2->userinfo->get(); // 사용자 정보 변수 지정 $id = $userInfo->id; $authenticatedEmail = $userInfo->email; $name = $userInfo->name; // DB Connection (CodeIgniter 4) $db = \Config\Database::connect(); // 1. USER_LIST에서 이메일로 조회 $builder = $db->table('USER_LIST'); $user = $builder->where('EMAIL', $authenticatedEmail)->get()->getRowArray(); if ($user) { $jwtSecret = env('JWT_SECRET'); $kid = env('JWT_KID'); if (empty($jwtSecret) || empty($kid)) { return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.'); } if (!class_exists('\App\Libraries\JwtLib\JWT')) { return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.'); } $issuedAt = time(); $accessExpire = $issuedAt + 60 * 15; // 15분 $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일 $accessPayload = [ 'iat' => $issuedAt, 'exp' => $accessExpire, 'sub' => $id, 'name' => $name ?? '', ]; $refreshPayload = [ 'iat' => $issuedAt, 'exp' => $refreshExpire, 'sub' => $id, ]; try { $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid); $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid); // (선택) DB의 리프레시 토큰 값 업데이트 $db = \Config\Database::connect(); $builder = $db->table('USER_LIST'); $builder->where('ID', $id)->update(['REFRESH_TOKEN' => $refreshToken]); } catch (\Throwable $e) { return $this->failServerError('JWT 생성 오류: ' . $e->getMessage()); } unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지 $query = http_build_query([ "accessToken" => $accessToken, "refreshToken" => $refreshToken, "user" => urlencode(json_encode($user)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); } else { // 회원이 없으면 회원가입 $type = 1; // ID는 auto_increment라면 생략 $authData = [ 'ID' => $id, 'NAME' => $name, 'EMAIL' => $authenticatedEmail, 'TYPE' => $type, 'JOIN' => '1', 'GOOGLE_REFRESH_TOKEN' => $googleOAuthRefreshToken ?? null ]; $query = http_build_query([ "user" => urlencode(json_encode($authData)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); } } else { echo "인증코드가 없습니다."; } } public function join() { $postData = $this->request->getJSON(true); // 필수값 추출 $id = $postData['ID'] ?? null; $password = $postData['PASSWORD'] ?? null; $name = $postData['NAME'] ?? null; $nick_name = $postData['NICK_NAME'] ?? null; $phone = $postData['PHONE'] ?? null; $email = $postData['EMAIL'] ?? null; $sns_type = $postData['SNS_TYPE'] ?? null; $sns_link_id = $postData['SNS_LINK_ID'] ?? null; $add_info1 = $postData['ADD_INFO1'] ?? null; $google_refresh_token = $postData['GOOGLE_REFRESH_TOKEN'] ?? null; $type = $postData['TYPE'] ?? null; // 필수값 검증 if (empty($name) || empty($email)) { return redirect()->back()->with('error', '필수 정보를 입력해 주세요.'); } // insert용 데이터 준비 $insertData = [ 'ID' => $id, 'PASSWORD' => $password, 'NAME' => $name, 'NICK_NAME' => $nick_name, 'PHONE' => $phone, 'EMAIL' => $email, 'SNS_TYPE' => $sns_type, 'SNS_LINK_ID' => $sns_link_id, 'ADD_INFO1' => $add_info1, 'GOOGLE_REFRESH_TOKEN' => $google_refresh_token, 'TYPE' => $type, ]; if (!empty($password)) { $insertData['PASSWORD'] = password_hash($password, PASSWORD_DEFAULT); } // DB 연결 및 INSERT try { $db = \Config\Database::connect(); $builder = $db->table('USER_LIST'); $result = $builder->insert($insertData); if (!$result) { $error = $db->error(); return $this->response->setJSON([ 'status' => 'fail', 'message' => 'DB Error: '.$error['message'] ])->setStatusCode(500); } } catch (\Throwable $e) { return $this->response->setJSON([ 'status' => 'fail', 'message' => 'Exception: ' . $e->getMessage() ])->setStatusCode(500); } // 회원가입 성공 시, JSON 응답으로 결과 반환 (200 OK) return $this->response->setJSON([ 'status' => 'success', 'message' => '회원가입이 완료되었습니다.' ])->setStatusCode(200); } public function joinVendor() { $postData = $this->request->getJSON(true); // 필수값 추출 $id = $postData['ID'] ?? null; $password = $postData['PASSWORD'] ?? null; $name = $postData['NAME'] ?? null; $company_name = $postData['COMPANY_NAME'] ?? null; $company_number = $postData['COMPANY_NUMBER'] ?? null; $hp = $postData['HP'] ?? null; $email = $postData['EMAIL'] ?? null; // 필수값 검증 if (empty($name) || empty($email)) { return redirect()->back()->with('error', '필수 정보를 입력해 주세요.'); } // insert용 데이터 준비 $insertData = [ 'ID' => $id, 'PASSWORD' => $password, 'NAME' => $name, 'COMPANY_NAME' => $company_name, 'HP' => $hp, 'EMAIL' => $email, 'COMPANY_NUMBER' => $company_number ]; if (!empty($password)) { $insertData['PASSWORD'] = password_hash($password, PASSWORD_DEFAULT); } // DB 연결 및 INSERT try { $db = \Config\Database::connect(); $builder = $db->table('VENDOR_LIST'); $result = $builder->insert($insertData); if (!$result) { $error = $db->error(); return $this->response->setJSON([ 'status' => 'fail', 'message' => 'DB Error: '.$error['message'] ])->setStatusCode(500); } } catch (\Throwable $e) { return $this->response->setJSON([ 'status' => 'fail', 'message' => 'Exception: ' . $e->getMessage() ])->setStatusCode(500); } // 회원가입 성공 시, JSON 응답으로 결과 반환 (200 OK) return $this->response->setJSON([ 'status' => 'success', 'message' => '회원가입이 완료되었습니다.' ])->setStatusCode(200); } //구글 로그인 환경 회원 탈퇴 public function withdrawal() { // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET) $postData = $this->request->getJSON(true); $seq = $postData['SEQ']; $googleAccessToken = $postData['GOOGLE_REFRESH_TOKEN']; // 2. 사용자 정보 조회 (구글 토큰 포함) $user = $this->userModel->find($seq); if (!$user) { return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404); } // 3. 구글 인증 연결 해제(access_token 필요) if ($googleAccessToken) { $this->revokeGoogleAccess($googleAccessToken); } // 4. USER_LIST에서 사용자 삭제 $this->userModel->delete($seq); // 5. 응답 반환 return $this->response->setJSON([ 'result' => 'User account deleted and Google link revoked' ])->setStatusCode(200); } /*********************************** * 카카오 간편로그인 / 가입 **********************************/ //카카오 인증 public function kakaoLogin() { $clientId = '1f8376b18a02a00f2e4e5594f9ace6d4'; // 카카오 REST API 키로 변경 $redirectUri = urlencode('https://shopdeli.mycafe24.com/auth/kakao'); // 콜백 URL (ex: https://도메인/auth/kakaoCallback) $url = "https://kauth.kakao.com/oauth/authorize?client_id={$clientId}&redirect_uri={$redirectUri}&response_type=code"; return redirect()->to($url); } //카카오 인증후 진행 public function kakao() { $code = $this->request->getGet('code'); $clientId = '1f8376b18a02a00f2e4e5594f9ace6d4'; // 카카오 REST API 키 $redirectUri = 'https://shopdeli.mycafe24.com/auth/kakao'; // 콜백 URL $tokenUrl = "https://kauth.kakao.com/oauth/token"; // 토큰 요청 $tokenData = [ 'grant_type' => 'authorization_code', 'scopes' => 'offline_access', 'client_id' => $clientId, 'redirect_uri' => $redirectUri, 'code' => $code, ]; $client = \Config\Services::curlrequest(); $tokenResponse = $client->post($tokenUrl, [ 'form_params' => $tokenData ]); $tokenResult = json_decode($tokenResponse->getBody(), true); $accessTokenKakao = $tokenResult['access_token']; $refreshTokenKakao = $tokenResult['refresh_token']; // 사용자 정보 요청 $userUrl = "https://kapi.kakao.com/v2/user/me"; $userResponse = $client->get($userUrl, [ 'headers' => [ 'Authorization' => 'Bearer ' . $accessTokenKakao, ] ]); $userInfo = json_decode($userResponse->getBody(), true); $userInfo['access_token'] = $accessTokenKakao; $userInfo['refresh_token'] = $refreshTokenKakao; //회원탈퇴시 이용 로그인시 마다 신규 리프래시 토큰 발급 받게 됨 // 여기에 회원가입/로그인 처리를 구현하세요 // 예: $userInfo['kakao_account']['email'], $userInfo['properties']['nickname'] //DB 커넥션 $db = \Config\Database::connect(); // 1. USER_LIST에서 이메일로 조회 $id = $userInfo['id']; $email = $userInfo['kakao_account']['email']; $builder = $db->table('USER_LIST'); $user = $builder->where('EMAIL', $email)->get()->getRowArray(); if($user){ $jwtSecret = env('JWT_SECRET'); $kid = env('JWT_KID'); if (empty($jwtSecret) || empty($kid)) { return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.'); } if (!class_exists('\App\Libraries\JwtLib\JWT')) { return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.'); } $issuedAt = time(); $accessExpire = $issuedAt + 60 * 15; // 15분 $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일 $accessPayload = [ 'iat' => $issuedAt, 'exp' => $accessExpire, 'sub' => $id, //'name' => $name ?? '', ]; $refreshPayload = [ 'iat' => $issuedAt, 'exp' => $refreshExpire, 'sub' => $id, ]; try { $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid); $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid); // (선택) DB의 리프레시 토큰 값 업데이트 $db = \Config\Database::connect(); $builder = $db->table('USER_LIST'); $builder->where('ID', $id)->update([ 'REFRESH_TOKEN' => $refreshToken, 'KAKAO_REFRESH_TOKEN' => $userInfo['refresh_token'] ]); } catch (\Throwable $e) { return $this->failServerError('JWT 생성 오류: ' . $e->getMessage()); } unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지 $query = http_build_query([ "accessToken" => $accessToken, "refreshToken" => $refreshToken, "user" => urlencode(json_encode($user)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); }else{ // 회원이 없으면 회원가입 $type = 1; // ID는 auto_increment라면 생략 $authData = [ 'ID' => $id, //'NAME' => $name, 'EMAIL' => $email, 'TYPE' => $type, 'JOIN' => '1', 'KAKAO_REFRESH_TOKEN' => $userInfo['refresh_token'] ?? null ]; $query = http_build_query([ "user" => urlencode(json_encode($authData)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); } } //카카오 회원탈퇴 public function kakaoWithdrawal(){ // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET) $postData = $this->request->getJSON(true); $seq = $postData['SEQ']; $refreshTokenKaKao = $postData['KAKAO_REFRESH_TOKEN']; // 2. 사용자 정보 조회 (구글 토큰 포함) $user = $this->userModel->find($seq); if (!$user) { return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404); } // 3. 카카오 언링크 처리 $tokenUrl = "https://kauth.kakao.com/oauth/token"; $tokenData = [ 'grant_type' => 'refresh_token', 'client_id' => '1f8376b18a02a00f2e4e5594f9ace6d4', 'refresh_token' => $refreshTokenKaKao, // DB에서 불러온 값 ]; $client = \Config\Services::curlrequest(); $tokenResponse = $client->post($tokenUrl, [ 'form_params' => $tokenData ]); $tokenResult = json_decode($tokenResponse->getBody(), true); $accessTokenKakao = $tokenResult['access_token']; // (2) 발급받은 access_token으로 연결 끊기 요청 $userUnlinkUrl = "https://kapi.kakao.com/v1/user/unlink"; $response = $client->post($userUnlinkUrl, [ 'headers' => [ 'Authorization' => 'Bearer ' . $accessTokenKakao, ] ]); // 4. USER_LIST에서 사용자 삭제 $this->userModel->delete($seq); // 5. 응답 반환 return $this->response->setJSON([ 'result' => 'User account deleted and Google link revoked' ])->setStatusCode(200); } /*********************************** * 내아버 간편로그인 / 가입 **********************************/ //네이버 인증 public function naverLogin() { $client_id = 'tPw7dRu1r7yY89O5gN7n'; $redirect_uri = urlencode('https://shopdeli.mycafe24.com/auth/naver'); // ex) https://your.site/naver-callback $state = bin2hex(random_bytes(8)); session()->set('naver_state', $state); $naver_auth_url = "https://nid.naver.com/oauth2.0/authorize?" . "response_type=code" . "&client_id={$client_id}" . "&client_icon=https://ndevthumb-phinf.pstatic.net/20250708_43/1751954347202gc3db_JPEG/x49C3CDfcWcI20250708145907.jpeg" . "&redirect_uri={$redirect_uri}" . "&state={$state}"; // 네이버 인증/동의화면으로 리디렉트 return redirect()->to($naver_auth_url); } public function naver(){ $client_id = 'tPw7dRu1r7yY89O5gN7n'; $client_secret = 'Pgan4lv9l9'; $state = $this->request->getGet('state'); $code = $this->request->getGet('code'); if ($state !== session()->get('naver_state')) { exit('CSRF 실패'); } // 토큰 발급 $token_url = "https://nid.naver.com/oauth2.0/token" . "?grant_type=authorization_code" . "&client_id={$client_id}" . "&client_secret={$client_secret}" . "&code={$code}" . "&state={$state}"; // cURL로 토큰 요청 $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $token_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $token_response = curl_exec($ch); curl_close($ch); // JSON 파싱 $token_data = json_decode($token_response, true); $access_token = $token_data['access_token'] ?? null; // 회원 정보 요청 if ($access_token) { $headers = [ "Authorization: Bearer {$access_token}" ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, "https://openapi.naver.com/v1/nid/me"); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); $user_info = curl_exec($ch); curl_close($ch); $user_info_arr = json_decode($user_info, true); $user_info_arr['refresh_token'] = $token_data['refresh_token']; $user_info_arr['access_token'] = $token_data['access_token']; //DB 커넥션 $db = \Config\Database::connect(); // 1. USER_LIST에서 이메일로 조회 $id = $user_info_arr['response']['id']; $email = $user_info_arr['response']['email']; $name = $user_info_arr['response']['name']; $phone = $user_info_arr['response']['mobile']; $builder = $db->table('USER_LIST'); $user = $builder->where('EMAIL', $email)->get()->getRowArray(); if($user){ $jwtSecret = env('JWT_SECRET'); $kid = env('JWT_KID'); if (empty($jwtSecret) || empty($kid)) { return $this->failServerError('환경변수가 누락되었습니다. 관리자에게 문의하세요.'); } if (!class_exists('\App\Libraries\JwtLib\JWT')) { return $this->failServerError('JWT 라이브러리를 찾을 수 없습니다.'); } $issuedAt = time(); $accessExpire = $issuedAt + 60 * 15; // 15분 $refreshExpire = $issuedAt + 60 * 60 * 24 * 14; // 14일 $accessPayload = [ 'iat' => $issuedAt, 'exp' => $accessExpire, 'sub' => $id, 'name' => $name ?? '', ]; $refreshPayload = [ 'iat' => $issuedAt, 'exp' => $refreshExpire, 'sub' => $id, ]; try { $accessToken = JWT::encode($accessPayload, $jwtSecret, 'HS256', $kid); $refreshToken = JWT::encode($refreshPayload, $jwtSecret, 'HS256', $kid); // (선택) DB의 리프레시 토큰 값 업데이트 $db = \Config\Database::connect(); $builder = $db->table('USER_LIST'); $builder->where('ID', $id)->update([ 'REFRESH_TOKEN' => $refreshToken, 'NAVER_REFRESH_TOKEN' => $user_info_arr['refresh_token'] ]); } catch (\Throwable $e) { return $this->failServerError('JWT 생성 오류: ' . $e->getMessage()); } unset($user['PASSWORD']); // 혹시 비번이 있다면 노출 방지 $query = http_build_query([ "accessToken" => $accessToken, "refreshToken" => $refreshToken, "user" => urlencode(json_encode($user)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); }else{ // 회원이 없으면 회원가입 $type = 1; // ID는 auto_increment라면 생략 $authData = [ 'ID' => $id, 'NAME' => $name, 'PHONE' => $phone, 'EMAIL' => $email, 'TYPE' => $type, 'JOIN' => '1', 'NAVER_REFRESH_TOKEN' => $user_info_arr['refresh_token'] ?? null ]; $query = http_build_query([ "user" => urlencode(json_encode($authData)), ]); //return redirect()->to(base_url("auth/popupClose?$query")); // 개발진행중 풀 URL return redirect()->to(self::FRONTEND_BASE_URL."/auth/popupClose?$query"); } } else { // 오류 처리 } } public function naverWithdrawal($refreshToken) { // 1. 요청에서 사용자 SEQ 추출 (예: POST or GET) $postData = $this->request->getJSON(true); $seq = $postData['SEQ']; $refreshTokenNaver = $postData['NAVER_REFRESH_TOKEN']; // 2. 사용자 정보 조회 (구글 토큰 포함) $user = $this->userModel->find($seq); if (!$user) { return $this->response->setJSON(['error' => 'User not found'])->setStatusCode(404); } $clientId = 'tPw7dRu1r7yY89O5gN7n'; $clientSecret = 'Pgan4lv9l9'; // 1. 리프레시 토큰으로 엑세스 토큰 재발급 요청 $tokenUrl = "https://nid.naver.com/oauth2.0/token"; $tokenParams = [ 'grant_type' => 'refresh_token', 'client_id' => $clientId, 'client_secret' => $clientSecret, 'refresh_token' => $refreshTokenNaver ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $tokenUrl); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($tokenParams)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $tokenResponse = curl_exec($ch); $tokenError = curl_error($ch); curl_close($ch); if ($tokenError) { return [ 'success' => false, 'message' => "토큰 재발급 오류: " . $tokenError, ]; } $tokenData = json_decode($tokenResponse, true); if (empty($tokenData['access_token'])) { return [ 'success' => false, 'message' => '엑세스 토큰 재발급 실패: ' . ($tokenData['error_description'] ?? '알 수 없는 오류'), ]; } $accessToken = $tokenData['access_token']; // 2. 엑세스 토큰으로 연결끊기 $withdrawUrl = "https://nid.naver.com/oauth2.0/token"; $withdrawParams = [ 'grant_type' => 'delete', 'client_id' => $clientId, 'client_secret' => $clientSecret, 'access_token' => $accessToken, 'service_provider' => 'NAVER', ]; $ch2 = curl_init(); curl_setopt($ch2, CURLOPT_URL, $withdrawUrl); curl_setopt($ch2, CURLOPT_POST, true); curl_setopt($ch2, CURLOPT_POSTFIELDS, http_build_query($withdrawParams)); curl_setopt($ch2, CURLOPT_RETURNTRANSFER, true); $withdrawResponse = curl_exec($ch2); $withdrawError = curl_error($ch2); curl_close($ch2); if ($withdrawError) { return [ 'success' => false, 'message' => "연결해제 요청 오류: " . $withdrawError, ]; } $withdrawData = json_decode($withdrawResponse, true); if (isset($withdrawData['result']) && $withdrawData['result'] === 'success') { return [ 'success' => true, 'message' => '네이버 연동 해제 완료', ]; // 4. USER_LIST에서 사용자 삭제 $this->userModel->delete($seq); // 5. 응답 반환 return $this->response->setJSON([ 'result' => 'User account deleted and Google link revoked' ])->setStatusCode(200); } else { return [ 'success' => false, 'message' => $withdrawData['error'] ?? '연동 해제 실패', ]; } } /*********************************** * @param $refreshTokenGoogle * @return void **********************************/ // 구글 연결 가입정보 연결 해제(회원가입중 페이지 빠져나올경우 리프래시 토큰이 사라짐 고객이 직접 계정에서 해제 필요) protected function revokeGoogleAccess($refreshTokenGoogle) { // 1. 리프레시 토큰으로 엑세스 토큰 발급 $client_id = '373780605211-diojebh7mug45urv9rnqdil6n0b1ogge.apps.googleusercontent.com'; $client_secret = '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'; $refresh_token = $refreshTokenGoogle; $token_url = 'https://oauth2.googleapis.com/token'; $params = [ 'client_id' => $client_id, 'client_secret' => $client_secret, 'refresh_token' => $refresh_token, 'grant_type' => 'refresh_token', ]; $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $token_url); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($params)); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $response = curl_exec($ch); curl_close($ch); $data = json_decode($response, true); // 2. 새 엑세스 토큰으로 연결 끊기 if (!empty($data['access_token'])) { $accessToken = $data['access_token']; $revoke_url = 'https://accounts.google.com/o/oauth2/revoke?token=' . urlencode($accessToken); $ch = curl_init($revoke_url); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_exec($ch); curl_close($ch); } else { // TODO : 엑세스 토큰 발급 실패 처리 필요 } } /*********************************** * 아이디 체크 **********************************/ public function checkId() { $postData = $this->request->getJSON(true); // 필수값 검증 if (empty($id) || empty($type)) { return $this->response->setJSON([ 'status' => 'fail', 'message' => '필수 정보가 누락되었습니다.' ])->setStatusCode(400); } $db = \Config\Database::connect(); try { // type에 따라 다른 테이블에서 ID 중복 체크 if ($type === 'vendor') { // 벤더 회원가입의 경우 VENDOR_LIST 테이블 체크 $builder = $db->table('VENDOR_LIST'); $existingUser = $builder->where('ID', $id)->get()->getRowArray(); if ($existingUser) { return $this->response->setJSON([ 'status' => 'fail', 'message' => '이미 사용 중인 아이디입니다.' ])->setStatusCode(200); } } elseif ($type === 'influencer') { // 인플루언서(일반회원가입)의 경우 USER_LIST 테이블 체크 $builder2 = $db->table('USER_LIST'); $existingUser = $builder2->where('ID', $id)->get()->getRowArray(); if ($existingUser) { return $this->response->setJSON([ 'status' => 'fail', 'message' => '이미 사용 중인 아이디입니다.' ])->setStatusCode(200); } } else { return $this->response->setJSON([ 'status' => 'fail', 'message' => '유효하지 않은 회원 유형입니다.' ])->setStatusCode(400); } // ID가 사용 가능한 경우 return $this->response->setJSON([ 'status' => 'success', 'message' => '사용 가능한 아이디입니다.' ])->setStatusCode(200); } catch (\Throwable $e) { return $this->response->setJSON([ 'status' => 'fail', 'message' => 'DB 오류: ' . $e->getMessage() ])->setStatusCode(500); } } }