Use Safari for OIDC account URL. (#1591)

* Handle RP-Initiated Logout URL.

Safari is only used on devices, the simulator doesn't work properly.
This commit is contained in:
Doug
2023-08-30 09:22:22 +01:00
committed by GitHub
parent 2db748018a
commit 3af8be7dfd
6 changed files with 29 additions and 15 deletions

View File

@@ -397,19 +397,25 @@ class AppCoordinator: AppCoordinatorProtocol, AuthenticationCoordinatorDelegate,
}
Task {
// first log out from the server
_ = await userSession.clientProxy.logout()
// First log out from the server
let accountLogoutURL = await userSession.clientProxy.logout()
// regardless of the result, clear user data
// Regardless of the result, clear user data
userSessionStore.logout(userSession: userSession)
tearDownUserSession()
// reset analytics
// Reset analytics
ServiceLocator.shared.analytics.optOut()
ServiceLocator.shared.analytics.resetConsentState()
stateMachine.processEvent(.completedSigningOut(isSoft: isSoft))
// Handle OIDC's RP-Initiated Logout if needed. Don't fallback to an ASWebAuthenticationSession
// as it looks weird to show an alert to the user asking them to sign in to their provider.
if let accountLogoutURL, UIApplication.shared.canOpenURL(accountLogoutURL) {
await UIApplication.shared.open(accountLogoutURL)
}
hideLoadingIndicator()
}
}

View File

@@ -88,12 +88,19 @@ final class SettingsScreenCoordinator: CoordinatorProtocol {
return
}
// Safari never works in the simulator, use a Web Authentication Session instead.
accountSettingsPresenter = OIDCAccountSettingsPresenter(accountURL: accountURL, presentationAnchor: window)
accountSettingsPresenter?.start()
#if targetEnvironment(simulator)
let canOpenURL = false // Safari can't access the cookie on the iOS 16 simulator 🤷
#else
let canOpenURL = UIApplication.shared.canOpenURL(accountURL)
#endif
// Safari isn't working with the shared browser session 😕
// UIApplication.shared.open(accountURL)
if canOpenURL {
UIApplication.shared.open(accountURL)
} else {
// Fall back to an ASWebAuthenticationSession to handle the URL inside the app.
accountSettingsPresenter = OIDCAccountSettingsPresenter(accountURL: accountURL, presentationAnchor: window)
accountSettingsPresenter?.start()
}
}
private func presentAnalyticsScreen() {

View File

@@ -306,13 +306,13 @@ class ClientProxy: ClientProxyProtocol {
}
}
func logout() async {
func logout() async -> URL? {
await Task.dispatch(on: clientQueue) {
do {
// We aren't currently handling the RP initiated sign out URL.
_ = try self.client.logout()
return try self.client.logout().flatMap(URL.init(string:))
} catch {
MXLog.error("Failed logging out with error: \(error)")
return nil
}
}
}

View File

@@ -107,7 +107,7 @@ protocol ClientProxyProtocol: AnyObject, MediaLoaderProtocol {
func sessionVerificationControllerProxy() async -> Result<SessionVerificationControllerProxyProtocol, ClientProxyError>
func logout() async
func logout() async -> URL?
func setPusher(with configuration: PusherConfiguration) async throws

View File

@@ -116,8 +116,8 @@ class MockClientProxy: ClientProxyProtocol {
}
}
func logout() async {
// no-op
func logout() async -> URL? {
nil
}
var setPusherErrorToThrow: Error?

View File

@@ -0,0 +1 @@
Use Safari for OIDC account management.