diff --git a/DevLog/Infra/Service/SocialLogin/AppleAuthenticationService.swift b/DevLog/Infra/Service/SocialLogin/AppleAuthenticationService.swift index c3df5cda..0c8c1240 100644 --- a/DevLog/Infra/Service/SocialLogin/AppleAuthenticationService.swift +++ b/DevLog/Infra/Service/SocialLogin/AppleAuthenticationService.swift @@ -144,21 +144,31 @@ final class AppleAuthenticationService: AuthenticationService { } func unlink(_ uid: String) async throws { - let accessToken = try await refreshAppleAccessToken() + do { + logger.info("Starting Apple access token refresh for unlink. uid: \(uid)") + let accessToken = try await refreshAppleAccessToken() - try await revokeAppleAccessToken(token: accessToken) + logger.info("Starting Apple access token revocation for unlink. uid: \(uid)") + try await revokeAppleAccessToken(token: accessToken) - let tokensRef = store.document("users/\(uid)/userData/tokens") + let tokensRef = store.document("users/\(uid)/userData/tokens") - let doc = try await tokensRef.getDocument() + logger.info("Starting Apple token document fetch for unlink. uid: \(uid)") + let doc = try await tokensRef.getDocument() - if doc.exists { - try await tokensRef.updateData([ - "appleRefreshToken": FieldValue.delete() - ]) - } + if doc.exists { + logger.info("Starting Apple refresh token deletion from Firestore for unlink. uid: \(uid)") + try await tokensRef.updateData([ + "appleRefreshToken": FieldValue.delete() + ]) + } - _ = try await user?.unlink(fromProvider: providerID.rawValue) + logger.info("Starting Firebase Apple provider unlink. uid: \(uid)") + _ = try await user?.unlink(fromProvider: providerID.rawValue) + } catch { + logger.error("Failed to unlink Apple account", error: error) + throw error + } } // Apple 인증 메서드 diff --git a/DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift b/DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift index 340ecbb8..1e5d94c4 100644 --- a/DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift +++ b/DevLog/Infra/Service/SocialLogin/GithubAuthenticationService.swift @@ -126,18 +126,17 @@ final class GithubAuthenticationService: NSObject, AuthenticationService { } func unlink(_ uid: String) async throws { - logger.info("Unlinking GitHub account for user: \(uid)") - do { + logger.info("Starting GitHub access token revocation for unlink. uid: \(uid)") try await revokeAccessToken() let tokensRef = store.document("users/\(uid)/userData/tokens") + logger.info("Starting GitHub access token deletion from Firestore for unlink. uid: \(uid)") try await tokensRef.updateData(["githubAccessToken": FieldValue.delete()]) + logger.info("Starting Firebase GitHub provider unlink. uid: \(uid)") _ = try await user?.unlink(fromProvider: providerID.rawValue) - - logger.info("Successfully unlinked GitHub account") } catch { logger.error("Failed to unlink GitHub account", error: error) throw error diff --git a/DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift b/DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift index 31e99b07..9033b35e 100644 --- a/DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift +++ b/DevLog/Infra/Service/SocialLogin/GoogleAuthenticationService.swift @@ -119,9 +119,11 @@ final class GoogleAuthenticationService: AuthenticationService { } func unlink(_ uid: String) async throws { + logger.info("Starting Google disconnect for unlink. uid: \(uid)") GIDSignIn.sharedInstance.signOut() try await GIDSignIn.sharedInstance.disconnect() + logger.info("Starting Firebase Google provider unlink. uid: \(uid)") _ = try await user?.unlink(fromProvider: AuthProviderID.google.rawValue) } diff --git a/Firebase/functions/src/auth/apple.ts b/Firebase/functions/src/auth/apple.ts index 1f3a642e..3e9dc953 100644 --- a/Firebase/functions/src/auth/apple.ts +++ b/Firebase/functions/src/auth/apple.ts @@ -277,13 +277,19 @@ export const revokeAppleAccessToken = onCall({ try { const { token } = request.data; - const { teamId, clientId, keyId, privateKey } = getAppleConfiguration(); if (!token) { throw new HttpsError("invalid-argument", "Token is required"); } - // JWT 생성 + console.log("Starting Apple token revocation", { + uid: request.auth.uid + }); + + console.log("Starting Apple configuration load for token revocation"); + const { teamId, clientId, keyId, privateKey } = getAppleConfiguration(); + + console.log("Starting Apple client secret creation for token revocation"); const clientSecret = jwt.sign({}, privateKey, { algorithm: "ES256", expiresIn: "5m", @@ -293,14 +299,15 @@ export const revokeAppleAccessToken = onCall({ keyid: keyId, }); - // Apple 서버에 토큰 취소 요청 - await axios.post("https://appleid.apple.com/auth/revoke", - new URLSearchParams({ - client_id: clientId, - client_secret: clientSecret, - token: token, - token_type_hint: "access_token" // access_token 또는 refresh_token 지정 가능 - }).toString(), { + console.log("Starting Apple revoke API request"); + await axios.post( + "https://appleid.apple.com/auth/revoke", + new URLSearchParams({ + client_id: clientId, + client_secret: clientSecret, + token: token, + token_type_hint: "access_token" // access_token 또는 refresh_token 지정 가능 + }).toString(), { headers: {"Content-Type": "application/x-www-form-urlencoded"}, });