@@ -18,16 +18,23 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
1818 private let messaging = Messaging . messaging ( )
1919 private var user : User ? { Auth . auth ( ) . currentUser }
2020 private let providerID = AuthProviderID . gitHub
21+ private let logger = Logger ( category: " GithubAuthService " )
2122
2223 func signIn( ) async throws -> AuthenticationDataResponse {
23- // 1. GitHub OAuth 로그인 요청
24- let authorizationCode = try await requestAuthorizationCode ( )
25-
26- // 2. Firebase Functions를 통해 customToken 발급 요청
27- let ( accessToken, customToken) = try await requestTokens ( authorizationCode: authorizationCode)
24+ logger. info ( " Starting GitHub sign in " )
2825
29- // 3. Firebase 로그인
30- let result = try await Auth . auth ( ) . signIn ( withCustomToken: customToken)
26+ do {
27+ // 1. GitHub OAuth 로그인 요청
28+ logger. debug ( " Requesting authorization code " )
29+ let authorizationCode = try await requestAuthorizationCode ( )
30+
31+ // 2. Firebase Functions를 통해 customToken 발급 요청
32+ logger. debug ( " Requesting tokens from Firebase Function " )
33+ let ( accessToken, customToken) = try await requestTokens ( authorizationCode: authorizationCode)
34+
35+ // 3. Firebase 로그인
36+ logger. debug ( " Signing in with custom token " )
37+ let result = try await Auth . auth ( ) . signIn ( withCustomToken: customToken)
3138
3239 // 4. Firebase Auth 사용자 프로필 업데이트
3340 let githubUser = try await requestUserProfile ( accessToken: accessToken)
@@ -45,13 +52,18 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
4552 try await result. user. link ( with: credential)
4653 }
4754
48- let fcmToken = try await messaging. token ( )
49-
50- return result. user. toData (
51- providerID: . gitHub,
52- fcmToken: fcmToken,
53- accessToken: accessToken
54- )
55+ let fcmToken = try await messaging. token ( )
56+
57+ logger. info ( " Successfully signed in with GitHub " )
58+ return result. user. toData (
59+ providerID: . gitHub,
60+ fcmToken: fcmToken,
61+ accessToken: accessToken
62+ )
63+ } catch {
64+ logger. error ( " Failed to sign in with GitHub " , error: error)
65+ throw error
66+ }
5567 }
5668
5769 func signOut( _ uid: String ) async throws {
@@ -79,36 +91,56 @@ final class GithubAuthenticationService: NSObject, AuthenticationService {
7991 }
8092
8193 func link( uid: String , email: String ) async throws {
82- let tokensRef = store. document ( " users/ \( uid) /userData/tokens " )
83- let authorizationCode = try await requestAuthorizationCode ( )
84- let ( accessToken, _) = try await requestTokens ( authorizationCode: authorizationCode)
94+ logger. info ( " Linking GitHub account for user: \( uid) " )
95+
96+ do {
97+ let tokensRef = store. document ( " users/ \( uid) /userData/tokens " )
98+ let authorizationCode = try await requestAuthorizationCode ( )
99+ let ( accessToken, _) = try await requestTokens ( authorizationCode: authorizationCode)
85100
86- let githubUser = try await requestUserProfile ( accessToken: accessToken)
101+ let githubUser = try await requestUserProfile ( accessToken: accessToken)
87102
88- guard let githubEmail = githubUser. email else {
89- try await revokeAccessToken ( accessToken: accessToken)
90- throw EmailFetchError . emailNotFound
91- }
103+ guard let githubEmail = githubUser. email else {
104+ logger. error ( " GitHub email not found " )
105+ try await revokeAccessToken ( accessToken: accessToken)
106+ throw EmailFetchError . emailNotFound
107+ }
92108
93- if githubEmail != email {
94- try await revokeAccessToken ( accessToken: accessToken)
95- throw EmailFetchError . emailMismatch
96- }
109+ if githubEmail != email {
110+ logger. error ( " Email mismatch - Expected: \( email) , Got: \( githubEmail) " )
111+ try await revokeAccessToken ( accessToken: accessToken)
112+ throw EmailFetchError . emailMismatch
113+ }
97114
98- try await tokensRef. setData ( [ " githubAccessToken " : accessToken] , merge: true )
115+ try await tokensRef. setData ( [ " githubAccessToken " : accessToken] , merge: true )
99116
100- let credential = OAuthProvider . credential ( providerID: AuthProviderID . gitHub, accessToken: accessToken)
101- try await user? . link ( with: credential)
117+ let credential = OAuthProvider . credential ( providerID: AuthProviderID . gitHub, accessToken: accessToken)
118+ try await user? . link ( with: credential)
119+
120+ logger. info ( " Successfully linked GitHub account " )
121+ } catch {
122+ logger. error ( " Failed to link GitHub account " , error: error)
123+ throw error
124+ }
102125 }
103126
104127 func unlink( _ uid: String ) async throws {
105- try await revokeAccessToken ( )
128+ logger. info ( " Unlinking GitHub account for user: \( uid) " )
129+
130+ do {
131+ try await revokeAccessToken ( )
106132
107- let tokensRef = store. document ( " users/ \( uid) /userData/tokens " )
133+ let tokensRef = store. document ( " users/ \( uid) /userData/tokens " )
108134
109- try await tokensRef. updateData ( [ " githubAccessToken " : FieldValue . delete ( ) ] )
135+ try await tokensRef. updateData ( [ " githubAccessToken " : FieldValue . delete ( ) ] )
110136
111- _ = try await user? . unlink ( fromProvider: providerID. rawValue)
137+ _ = try await user? . unlink ( fromProvider: providerID. rawValue)
138+
139+ logger. info ( " Successfully unlinked GitHub account " )
140+ } catch {
141+ logger. error ( " Failed to unlink GitHub account " , error: error)
142+ throw error
143+ }
112144 }
113145
114146 func requestAuthorizationCode( ) async throws -> String {
0 commit comments