|
@@ -0,0 +1,911 @@
|
|
|
|
|
+<?php
|
|
|
|
|
+
|
|
|
|
|
+ namespace App\Controllers;
|
|
|
|
|
+ require_once __DIR__ . '/../Libraries/autoload.php';
|
|
|
|
|
+
|
|
|
|
|
+ use App\Models\UserListModel;
|
|
|
|
|
+ use CodeIgniter\RESTful\ResourceController;
|
|
|
|
|
+ use Google\Client;
|
|
|
|
|
+ use Google\Service\Oauth2;
|
|
|
|
|
+ use App\Libraries\JwtLib\JWT;
|
|
|
|
|
+ use App\Libraries\JwtLib\Key;
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+ class Auth extends ResourceController
|
|
|
|
|
+ {
|
|
|
|
|
+ private const FRONTEND_BASE_URL = "http://localhost:3000";
|
|
|
|
|
+
|
|
|
|
|
+ //private const FRONTEND_BASE_URL = 'https://shopdeli.mycafe24.com';
|
|
|
|
|
+ protected $userModel;
|
|
|
|
|
+
|
|
|
|
|
+ public function __construct()
|
|
|
|
|
+ {
|
|
|
|
|
+ $this->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);
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|