mirror of
https://github.com/omnivore-app/omnivore.git
synced 2026-03-11 08:54:26 +00:00
send google token to server to exchange for omnivore token
This commit is contained in:
parent
77081290e5
commit
30806e4c1b
3 changed files with 57 additions and 107 deletions
|
|
@ -40,7 +40,7 @@ extension Authenticator {
|
|||
let encodedParams = (try? JSONEncoder().encode(params)) ?? Data()
|
||||
|
||||
return networker
|
||||
.createPendingUser(params: encodedParams)
|
||||
.createPendingUserDep(params: encodedParams)
|
||||
.tryMap { [weak self] in
|
||||
self?.pendingUserToken = $0.pendingUserToken
|
||||
return $0.pendingUserProfile
|
||||
|
|
|
|||
|
|
@ -1,4 +1,3 @@
|
|||
import Combine
|
||||
import Foundation
|
||||
import GoogleSignIn
|
||||
import Models
|
||||
|
|
@ -12,10 +11,40 @@ public enum GoogleAuthResponse {
|
|||
|
||||
extension Authenticator {
|
||||
public func handleGoogleAuth(presenting: PlatformViewController) async -> GoogleAuthResponse {
|
||||
let authToken = try? await googleSignIn(presenting: presenting)
|
||||
guard let authToken = authToken else { return .loginError(error: .unauthorized) }
|
||||
// TODO: sync with server
|
||||
return .existingOmnivoreUser
|
||||
let idToken = try? await googleSignIn(presenting: presenting)
|
||||
guard let idToken = idToken else { return .loginError(error: .unauthorized) }
|
||||
|
||||
do {
|
||||
let authPayload = try await networker.submitGoogleToken(idToken: idToken)
|
||||
try ValetKey.authCookieString.setValue(authPayload.commentedAuthCookieString)
|
||||
try ValetKey.authToken.setValue(authPayload.authToken)
|
||||
DispatchQueue.main.async {
|
||||
self.isLoggedIn = true
|
||||
}
|
||||
return .existingOmnivoreUser
|
||||
} catch {
|
||||
let loginError = (error as? LoginError) ?? .unknown
|
||||
|
||||
switch loginError {
|
||||
case .unauthorized, .unknown:
|
||||
return await createPendingUser(idToken: idToken)
|
||||
case .network:
|
||||
return .loginError(error: .network)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func createPendingUser(idToken: String) async -> GoogleAuthResponse {
|
||||
do {
|
||||
let params = CreatePendingAccountParams(token: idToken, provider: .google, fullName: nil)
|
||||
let encodedParams = (try? JSONEncoder().encode(params)) ?? Data()
|
||||
let pendingUserAuthPayload = try await networker.createPendingUser(params: encodedParams)
|
||||
pendingUserToken = pendingUserAuthPayload.pendingUserToken
|
||||
return .newOmnivoreUser
|
||||
} catch {
|
||||
let loginError = LoginError.make(serverError: (error as? ServerError) ?? .unknown)
|
||||
return .loginError(error: loginError)
|
||||
}
|
||||
}
|
||||
|
||||
func googleSignIn(presenting: PlatformViewController) async throws -> String {
|
||||
|
|
@ -42,103 +71,3 @@ extension Authenticator {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
// #if os(iOS)
|
||||
// import UIKit
|
||||
//
|
||||
// public extension Authenticator {
|
||||
// func handleGoogleAuthDep(presentingViewController: PlatformViewController?) -> AnyPublisher<Bool, LoginError> {
|
||||
// Future { [weak self] promise in
|
||||
// guard let self = self, let presenting = presentingViewController else { return }
|
||||
//
|
||||
// // swiftlint:disable:next line_length
|
||||
// self.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: self.googleAuthRequest(redirectURL: nil), presenting: presenting) { authState, authError in
|
||||
// self.resolveAuthResponse(promise: promise, authState: authState, authError: authError)
|
||||
// }
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
// }
|
||||
// #endif
|
||||
|
||||
// #if os(macOS)
|
||||
// import AppKit
|
||||
//
|
||||
// public extension Authenticator {
|
||||
// func handleGoogleAuthDep(presentingViewController _: PlatformViewController?) -> AnyPublisher<Bool, LoginError> {
|
||||
// authRedirectHandler = OIDRedirectHTTPHandler(
|
||||
// successURL: URL(string: "https://omnivore.app")!
|
||||
// )
|
||||
// let redirectURL = authRedirectHandler?.startHTTPListener(nil)
|
||||
// let authRequest = googleAuthRequest(redirectURL: redirectURL)
|
||||
//
|
||||
// return Future { [weak self] promise in
|
||||
// guard let self = self else { return }
|
||||
//
|
||||
// // swiftlint:disable:next line_length
|
||||
// self.authRedirectHandler?.currentAuthorizationFlow = OIDAuthState.authState(byPresenting: authRequest) { authState, authError in
|
||||
// NSRunningApplication.current.activate(options: [.activateAllWindows, .activateIgnoringOtherApps])
|
||||
// self.resolveAuthResponse(promise: promise, authState: authState, authError: authError)
|
||||
// }
|
||||
// }
|
||||
// .eraseToAnyPublisher()
|
||||
// }
|
||||
// }
|
||||
// #endif
|
||||
|
||||
// private extension Authenticator {
|
||||
// func resolveAuthResponse(
|
||||
// promise: @escaping (Result<Bool, LoginError>) -> Void,
|
||||
// authState: OIDAuthState?,
|
||||
// authError: Error?
|
||||
// ) {
|
||||
// if let idToken = authState?.lastTokenResponse?.idToken {
|
||||
// Task {
|
||||
// do {
|
||||
// let authPayload = try await networker.submitGoogleToken(idToken: idToken)
|
||||
// try ValetKey.authCookieString.setValue(authPayload.commentedAuthCookieString)
|
||||
// try ValetKey.authToken.setValue(authPayload.authToken)
|
||||
// DispatchQueue.main.async {
|
||||
// self.isLoggedIn = true
|
||||
// }
|
||||
// } catch {
|
||||
// if let error = error as? LoginError {
|
||||
// switch error {
|
||||
// case .unauthorized, .unknown:
|
||||
// self.resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError)
|
||||
// case .network:
|
||||
// promise(.failure(error))
|
||||
// }
|
||||
// self.resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError)
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
// } else {
|
||||
// resolveAuthResponseForAccountCreation(promise: promise, authState: authState, authError: authError)
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// func resolveAuthResponseForAccountCreation(
|
||||
// promise: @escaping (Result<Bool, LoginError>) -> Void,
|
||||
// authState: OIDAuthState?,
|
||||
// authError _: Error?
|
||||
// ) {
|
||||
// if let idToken = authState?.lastTokenResponse?.idToken {
|
||||
// let params = CreatePendingAccountParams(token: idToken, provider: .google, fullName: nil)
|
||||
// let encodedParams = (try? JSONEncoder().encode(params)) ?? Data()
|
||||
//
|
||||
// networker
|
||||
// .createPendingUser(params: encodedParams)
|
||||
// .sink { completion in
|
||||
// guard case let .failure(serverError) = completion else { return }
|
||||
// promise(.failure(LoginError.make(serverError: serverError)))
|
||||
// } receiveValue: { [weak self] in
|
||||
// self?.pendingUserToken = $0.pendingUserToken
|
||||
// promise(.success(true))
|
||||
// }
|
||||
// .store(in: &subscriptions)
|
||||
// } else {
|
||||
// promise(.failure(.unauthorized))
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
|
|
|
|||
|
|
@ -3,7 +3,7 @@ import Foundation
|
|||
import Models
|
||||
|
||||
extension Networker {
|
||||
func createPendingUser(params: Data) -> AnyPublisher<PendingUserAuthPayload, ServerError> {
|
||||
func createPendingUserDep(params: Data) -> AnyPublisher<PendingUserAuthPayload, ServerError> {
|
||||
let urlRequest = URLRequest.create(
|
||||
baseURL: appEnvironment.serverBaseURL,
|
||||
urlPath: "/api/mobile-auth/sign-up",
|
||||
|
|
@ -21,3 +21,24 @@ extension Networker {
|
|||
.eraseToAnyPublisher()
|
||||
}
|
||||
}
|
||||
|
||||
extension Networker {
|
||||
func createPendingUser(params: Data) async throws -> PendingUserAuthPayload {
|
||||
let urlRequest = URLRequest.create(
|
||||
baseURL: appEnvironment.serverBaseURL,
|
||||
urlPath: "/api/mobile-auth/sign-up",
|
||||
requestMethod: .post(params: params)
|
||||
)
|
||||
|
||||
let resource = ServerResource<PendingUserAuthPayload>(
|
||||
urlRequest: urlRequest,
|
||||
decode: PendingUserAuthPayload.decode
|
||||
)
|
||||
|
||||
do {
|
||||
return try await urlSession.performReq(resource: resource)
|
||||
} catch {
|
||||
throw (error as? ServerError) ?? .unknown
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue