@@ -6,6 +6,7 @@ enum CalendarAuthError: Error, LocalizedError {
66 case invalidRedirect
77 case tokenExchangeFailed
88 case cancelled
9+ case stateMismatch
910
1011 var errorDescription : String ? {
1112 switch self {
@@ -17,10 +18,13 @@ enum CalendarAuthError: Error, LocalizedError {
1718 return " Could not exchange authorization code. "
1819 case . cancelled:
1920 return " Sign-in was cancelled. "
21+ case . stateMismatch:
22+ return " Sign-in response did not match the request. "
2023 }
2124 }
2225}
2326
27+
2428final class GoogleAuthService : NSObject {
2529 private var authContinuation : CheckedContinuation < OAuthToken , Error > ?
2630 private let redirectServer = RedirectServer ( )
@@ -67,10 +71,15 @@ final class GoogleAuthService: NSObject {
6771 authContinuation = continuation
6872 AuthRedirectHandler . shared. start { result in
6973 switch result {
70- case . success( let code) :
74+ case . success( let response) :
75+ guard response. state == state else {
76+ server. stop ( )
77+ continuation. resume ( throwing: CalendarAuthError . stateMismatch)
78+ return
79+ }
7180 Task {
7281 do {
73- let token = try await GoogleAuthService . exchangeCodeForToken ( code: code)
82+ let token = try await GoogleAuthService . exchangeCodeForToken ( code: response . code)
7483 server. stop ( )
7584 continuation. resume ( returning: token)
7685 } catch {
@@ -85,7 +94,7 @@ final class GoogleAuthService: NSObject {
8594 }
8695
8796 Task {
88- try ? await Task . sleep ( nanoseconds: 30_000_000_000 )
97+ try ? await Task . sleep ( nanoseconds: 60_000_000_000 )
8998 guard server. isRunning else { return }
9099 server. stop ( )
91100 continuation. resume ( throwing: CalendarAuthError . cancelled)
0 commit comments