diff --git a/MeetKey/MeetKey.xcodeproj/project.pbxproj b/MeetKey/MeetKey.xcodeproj/project.pbxproj index d6fd4ab..ddc4efc 100644 --- a/MeetKey/MeetKey.xcodeproj/project.pbxproj +++ b/MeetKey/MeetKey.xcodeproj/project.pbxproj @@ -288,7 +288,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = CJX79LBA76; + DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = MeetKey/Info.plist; @@ -323,7 +323,7 @@ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor; CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 1; - DEVELOPMENT_TEAM = CJX79LBA76; + DEVELOPMENT_TEAM = ""; ENABLE_PREVIEWS = YES; GENERATE_INFOPLIST_FILE = YES; INFOPLIST_FILE = MeetKey/Info.plist; diff --git a/MeetKey/MeetKey/Network/API/BlockAPI.swift b/MeetKey/MeetKey/Network/API/BlockAPI.swift index e99c3d1..1b1cddb 100644 --- a/MeetKey/MeetKey/Network/API/BlockAPI.swift +++ b/MeetKey/MeetKey/Network/API/BlockAPI.swift @@ -24,11 +24,17 @@ extension BlockAPI: TargetType { var method: Moya.Method { .post } var task: Task { .requestPlain } var headers: [String: String]? { - var headers = ["Content-Type": "application/json"] - - let accessToken = APIConfig.testToken - - headers["Authorization"] = "Bearer \(accessToken)" + let token = KeychainManager.load(account: "accessToken") ?? "" + + var headers: [String: String] = [ + "Content-Type": "application/json" + ] + + // 토큰 있을 때만 Authorization 붙이기 + if !token.isEmpty { + headers["Authorization"] = "Bearer \(token)" + } + return headers } } diff --git a/MeetKey/MeetKey/Network/API/LocationAPI.swift b/MeetKey/MeetKey/Network/API/LocationAPI.swift index 0bf7af2..149cf33 100644 --- a/MeetKey/MeetKey/Network/API/LocationAPI.swift +++ b/MeetKey/MeetKey/Network/API/LocationAPI.swift @@ -49,11 +49,17 @@ extension LocationAPI: TargetType { } var headers: [String: String]? { - var headers = ["Content-Type": "application/json"] + let token = KeychainManager.load(account: "accessToken") ?? "" + + var headers: [String: String] = [ + "Content-Type": "application/json" + ] + + // 토큰 있을 때만 Authorization 붙이기 + if !token.isEmpty { + headers["Authorization"] = "Bearer \(token)" + } - let accessToken = APIConfig.testToken - - headers["Authorization"] = "Bearer \(accessToken)" return headers } } diff --git a/MeetKey/MeetKey/Network/API/RecommendationAPI.swift b/MeetKey/MeetKey/Network/API/RecommendationAPI.swift index eac8109..a9051a4 100644 --- a/MeetKey/MeetKey/Network/API/RecommendationAPI.swift +++ b/MeetKey/MeetKey/Network/API/RecommendationAPI.swift @@ -60,11 +60,26 @@ extension RecommendationAPI: TargetType { } var headers: [String: String]? { - var headers = ["Content-Type": "application/json"] + let token = KeychainManager.load(account: "accessToken") ?? "" + + // 🔍 디버깅 로그 추가 + print("------------------------------------------") + print("🚀 [NETWORK DEBUG] API 요청 발생") + print("📍 경로(Path): \(path)") + print("🔑 토큰 존재 여부: \(token.isEmpty ? "❌ 없음" : "✅ 있음")") + if !token.isEmpty { + print("🎫 토큰 앞부분: \(token.prefix(15))...") // 토큰 유효성 대조용 + } + print("------------------------------------------") + + var headers: [String: String] = [ + "Content-Type": "application/json" + ] - let accessToken = APIConfig.testToken - - headers["Authorization"] = "Bearer \(accessToken)" + // 토큰 있을 때만 Authorization 붙이기 + if !token.isEmpty { + headers["Authorization"] = "Bearer \(token)" + } switch self { diff --git a/MeetKey/MeetKey/Network/API/ReportAPI.swift b/MeetKey/MeetKey/Network/API/ReportAPI.swift index 8fd1d66..8af1bd2 100644 --- a/MeetKey/MeetKey/Network/API/ReportAPI.swift +++ b/MeetKey/MeetKey/Network/API/ReportAPI.swift @@ -42,12 +42,27 @@ extension ReportAPI: TargetType { } var headers: [String: String]? { - var headers = ["Content-Type": "application/json"] - - let accessToken = APIConfig.testToken - - headers["Authorization"] = "Bearer \(accessToken)" + let token = KeychainManager.load(account: "accessToken") ?? "" + // 🔍 디버깅 로그 추가 + print("------------------------------------------") + print("🚀 [NETWORK DEBUG] API 요청 발생") + print("📍 경로(Path): \(path)") + print("🔑 토큰 존재 여부: \(token.isEmpty ? "❌ 없음" : "✅ 있음")") + if !token.isEmpty { + print("🎫 토큰 앞부분: \(token.prefix(15))...") // 토큰 유효성 대조용 + } + print("------------------------------------------") + + var headers: [String: String] = [ + "Content-Type": "application/json" + ] + + // 토큰 있을 때만 Authorization 붙이기 + if !token.isEmpty { + headers["Authorization"] = "Bearer \(token)" + } + return headers } } diff --git a/MeetKey/MeetKey/Presentation/Login/KeychainManager.swift b/MeetKey/MeetKey/Presentation/Login/KeychainManager.swift index 56d5b07..14f9073 100644 --- a/MeetKey/MeetKey/Presentation/Login/KeychainManager.swift +++ b/MeetKey/MeetKey/Presentation/Login/KeychainManager.swift @@ -4,17 +4,25 @@ import Security // Token 저장용 Keychain 헬퍼 enum KeychainManager { static func save(value: String, account: String) throws { + if value.isEmpty { + print("❌ [KEYCHAIN DEBUG] 저장 실패: '\(account)'에 넣으려는 값이 빈 문자열입니다.") + return + } + let data = Data(value.utf8) let query: [String: Any] = [ kSecClass as String: kSecClassGenericPassword, kSecAttrService as String: "MeetKey", kSecAttrAccount as String: account, - kSecValueData as String: data + kSecValueData as String: data, ] SecItemDelete(query as CFDictionary) let status = SecItemAdd(query as CFDictionary, nil) - if status != errSecSuccess { + if status == errSecSuccess { + print("✅ [KEYCHAIN DEBUG] '\(account)' 저장 성공") + } else { + print("❌ [KEYCHAIN DEBUG] '\(account)' 저장 실패 (Status: \(status))") throw NSError(domain: "Keychain", code: Int(status), userInfo: nil) } } @@ -25,7 +33,7 @@ enum KeychainManager { kSecAttrService as String: "MeetKey", kSecAttrAccount as String: account, kSecReturnData as String: true, - kSecMatchLimit as String: kSecMatchLimitOne + kSecMatchLimit as String: kSecMatchLimitOne, ] var item: CFTypeRef? @@ -44,6 +52,10 @@ enum KeychainManager { } static func load(account: String) -> String? { - return try? read(account: account) + let result = try? read(account: account) + if result == nil { + print("⚠️ [KEYCHAIN DEBUG] '\(account)' 로드 실패 혹은 데이터 없음") + } + return result } } diff --git a/MeetKey/MeetKey/Presentation/Login/LoginViewModel.swift b/MeetKey/MeetKey/Presentation/Login/LoginViewModel.swift index 0b882be..e324e4d 100644 --- a/MeetKey/MeetKey/Presentation/Login/LoginViewModel.swift +++ b/MeetKey/MeetKey/Presentation/Login/LoginViewModel.swift @@ -32,12 +32,20 @@ class LoginViewModel: ObservableObject { let response = try await authService.login(provider: provider, idToken: idToken) self.loginResponse = response self.isLoginSuccess = true + print("DEBUG: 서버 응답 데이터 - AccessToken: \(response.accessToken ?? "nil"), IsNewMember: \(response.isNewMember)") UserDefaults.standard.set(response.isNewMember, forKey: isNewMemberKey) UserDefaults.standard.set(provider.rawValue, forKey: authProviderKey) UserDefaults.standard.set(idToken, forKey: lastIdTokenKey) if response.isNewMember { + if let accessToken = response.accessToken { + try? KeychainManager.save(value: accessToken, account: "accessToken") + print("DEBUG: 신규 유저 임시 토큰 저장 완료") + } else { print ("신규 유저에게 토큰이 전달되지 않았습니다")} + if response.memberId == nil { + print ("서버로부터 MemberID를 받지 못했습니다.") + } self.shouldNavigateToSignup = true } else { guard let accessToken = response.accessToken, diff --git a/MeetKey/MeetKey/Presentation/Onboarding/ViewModel/OnboardingViewModel.swift b/MeetKey/MeetKey/Presentation/Onboarding/ViewModel/OnboardingViewModel.swift index 34147a5..492f801 100644 --- a/MeetKey/MeetKey/Presentation/Onboarding/ViewModel/OnboardingViewModel.swift +++ b/MeetKey/MeetKey/Presentation/Onboarding/ViewModel/OnboardingViewModel.swift @@ -280,7 +280,7 @@ class OnboardingViewModel: ObservableObject { let firstLanguage = mapLanguage(data.nativeLanguage) let targetLanguage = mapLanguage(data.targetLanguage) let targetLevel = mapLanguageLevel() - let phoneNumber = "010-0000-0000" + let phoneNumber = "+821000000000" return SignupRequest( idToken: idToken,