"refreshJWT is missing"]); // exit; // } // if (!$refreshJwt) { // echo json_encode([ // "status" => "fail", // "message" => "세션이 만료되었습니다. 다시 로그인해 주세요." // ]); // exit; // } // 비밀번호 변경 요청일 때만 refreshJwt 필수 if ($password && !$refreshJwt) { echo json_encode([ "status" => "fail", "step" => "password", "message" => "세션이 만료되었습니다. 다시 로그인해 주세요." ]); exit; } $internalDomains = [ "hanmaceng.co.kr", "samaneng.com", "jangheon.co.kr", "hallasanup.com", "pre-cast.co.kr", "baroncs.co.kr" ]; $TENANT_INTERNAL = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; // Hanmac Family $TENANT_CUSTOMER = "T2x4TDzxasp7auPCPcN8uOrxXchh"; // Customer $TENANT_EGBIM = "T2yGFrGSnFX601G22JOMojJX7OMd"; // egBIM $TENANT_EDU = "T31ZmUcwOZbwk0y3YmMxrPCpzpQR"; // egBIM-edu // $domain = explode('@', $email)[1] ?? ''; $domain = strtolower(explode('@', $email)[1] ?? ''); // if (in_array($domain, $internalDomains)) { // $tenantId = "T2wQcWCBhUfJgUWHWgNwLg4iUDVY"; //내부 // } else { // $tenantId = "T2x4TDzxasp7auPCPcN8uOrxXchh"; //외부 // } // if (in_array($domain, $internalDomains)) { // // 내부 사용자 → 내부 tenant 하나만 // $userTenants = [ // [ // "tenantId" => "T2wQcWCBhUfJgUWHWgNwLg4iUDVY" // 내부 tenantId // ] // ]; // } else { // // 외부 사용자 → customer + egbim 두 개 tenant 자동 등록 // $userTenants = [ // [ // "tenantId" => "T2x4TDzxasp7auPCPcN8uOrxXchh" // customer tenantId // ], // [ // "tenantId" => "T2yGFrGSnFX601G22JOMojJX7OMd" // egbim tenantId // ] // ]; // } if (in_array($domain, $internalDomains, true)) { // 1️⃣ 내부 사용자 $userTenants = [ [ "tenantId" => $TENANT_INTERNAL ] ]; } elseif (str_ends_with($domain, '.ac.kr')) { // 2️⃣ 학교 사용자 (egBIM-edu) $userTenants = [ [ "tenantId" => $TENANT_EDU ] ]; } else { // 3️⃣ 외부 일반 사용자 $userTenants = [ [ "tenantId" => $TENANT_CUSTOMER ], [ "tenantId" => $TENANT_EGBIM ] ]; } //라이센스 만료일 계산 $now = new DateTime('now', new DateTimeZone('Asia/Seoul')); $expiry = (clone $now)->modify('+90 days')->format(DateTime::ATOM); // -- Custom Attribute 실제 Machine Name에 맞춰서 할당 (Descope 콘솔 기준) -- $custom = [ "familyCompany" => $family, // 소속 가족사 "familyUniqueKey" => $familyUniqueKey, // 사번 "team" => $team, // 소속팀 "position" => $position, // 직위 "completeForm" => $completeForm, // 정보입력완료 (Boolean) // "egBimLExpiryDate" => $expiry //egbim 라이센스 만료일 // 필요하면 추가로 다른 Machine Name도 사용 가능 ]; if (! in_array($domain, $internalDomains, true)) { $custom["egBimLExpiryDate"] = $expiry; } if ($company) { $custom["company"] = $company; // 외부사용자 회사명 추가 } // -- 1. 사용자 정보 업데이트 -- $update_body = [ "loginId" => $email, "email" => $email, "name" => $name, "phone" => $hp, "verifiedPhone" => false, "customAttributes" => $custom, // "roleNames" => [ "Default User" ], "userTenants" => $userTenants ]; $ch = curl_init('https://api.descope.com/v1/mgmt/user/update'); curl_setopt_array($ch, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer {$projectId}:{$managementKey}" ], CURLOPT_POSTFIELDS => json_encode($update_body), ]); $response = curl_exec($ch); $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); $res_data = json_decode($response, true); // -- 1-1. 사용자 정보 업데이트 실패시 -- if ($http_code !== 200) { $msg = $res_data['errorDescription'] ?? 'Descope 정보 업데이트 실패'; echo json_encode([ 'status' => 'fail', 'step' => 'info', 'message' => $msg, 'raw' => $response ]); exit; } // -- 2. 비밀번호 변경 (입력값이 있을 경우) -- if ($password) { $pw_body = [ "loginId" => $email, "newPassword" => $password ]; error_log("Descope password update payload: " . json_encode($pw_body)); error_log("Using refreshJwt for password update: " . $refreshJwt); $ch2 = curl_init('https://api.descope.com/v1/auth/password/update'); curl_setopt_array($ch2, [ CURLOPT_RETURNTRANSFER => true, CURLOPT_CUSTOMREQUEST => "POST", CURLOPT_HTTPHEADER => [ "Content-Type: application/json", "Authorization: Bearer {$projectId}:{$refreshJwt}" ], CURLOPT_POSTFIELDS => json_encode($pw_body), ]); $response2 = curl_exec($ch2); $http_code2 = curl_getinfo($ch2, CURLINFO_HTTP_CODE); curl_close($ch2); $res_data2 = json_decode($response2, true); if ($http_code2 !== 200) { $msg2 = $res_data2['errorDescription'] ?? 'Descope 비밀번호 변경 실패'; echo json_encode([ 'status' => 'fail', 'step' => 'password', 'message' => $msg2, 'raw' => $response2 ]); exit; } } // -- 3. 모두 성공 -- echo json_encode(['status' => 'ok']); ?>