diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt index 21c769a6..ed06f9bd 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/PigeonInterface.kt @@ -35,7 +35,7 @@ import com.onegini.mobile.sdk.flutter.useCases.GetRedirectUrlUseCase import com.onegini.mobile.sdk.flutter.useCases.GetRegisteredAuthenticatorsUseCase import com.onegini.mobile.sdk.flutter.useCases.GetUserProfilesUseCase import com.onegini.mobile.sdk.flutter.useCases.HandleMobileAuthWithOtpUseCase -import com.onegini.mobile.sdk.flutter.useCases.HandleRegisteredUrlUseCase +import com.onegini.mobile.sdk.flutter.useCases.HandleRegistrationCallbackUseCase import com.onegini.mobile.sdk.flutter.useCases.LogoutUseCase import com.onegini.mobile.sdk.flutter.useCases.OtpAcceptAuthenticationRequestUseCase import com.onegini.mobile.sdk.flutter.useCases.OtpDenyAuthenticationRequestUseCase @@ -102,7 +102,7 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { lateinit var getUserProfilesUseCase: GetUserProfilesUseCase @Inject - lateinit var handleRegisteredUrlUseCase: HandleRegisteredUrlUseCase + lateinit var handleRegistrationCallbackUseCase: HandleRegistrationCallbackUseCase @Inject lateinit var logoutUseCase: LogoutUseCase @@ -188,8 +188,8 @@ open class PigeonInterface : UserClientApi, ResourceMethodApi { registrationUseCase(identityProviderId, scopes, callback) } - override fun handleRegisteredUserUrl(url: String, signInType: Long, callback: (Result) -> Unit) { - callback(handleRegisteredUrlUseCase(url, signInType)) + override fun handleRegistrationCallback(url: String, callback: (Result) -> Unit) { + callback(handleRegistrationCallbackUseCase(url)) } override fun getIdentityProviders(callback: (Result>) -> Unit) { diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/activity/ActivityWebView.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/activity/ActivityWebView.kt deleted file mode 100644 index 89d952a4..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/activity/ActivityWebView.kt +++ /dev/null @@ -1,46 +0,0 @@ -package com.onegini.mobile.sdk.flutter.activity - -import android.annotation.SuppressLint -import android.app.Activity -import android.net.Uri -import android.os.Bundle -import android.webkit.WebResourceRequest -import android.webkit.WebView -import android.webkit.WebViewClient -import com.onegini.mobile.sdk.flutter.R -import com.onegini.mobile.sdk.flutter.handlers.BrowserRegistrationRequestHandler -import com.onegini.mobile.sdk.flutter.useCases.CancelBrowserRegistrationUseCase -import javax.inject.Inject - -class ActivityWebView : Activity() { - @Inject - lateinit var cancelBrowserRegistrationUseCase: CancelBrowserRegistrationUseCase - - @SuppressLint("SetJavaScriptEnabled") - override fun onCreate(savedInstanceState: Bundle?) { - super.onCreate(savedInstanceState) - setContentView(R.layout.layout_webview) - val redirectUrl = intent.getStringExtra("redirectUrl") - val redirectUri = Uri.parse(redirectUrl) - val myWebView: WebView = findViewById(R.id.webview) - myWebView.settings.javaScriptEnabled = true - myWebView.webViewClient = object : WebViewClient() { - override fun shouldOverrideUrlLoading(view: WebView?, request: WebResourceRequest?): Boolean { - val url = request?.url - if (url?.scheme == redirectUri.scheme) { - BrowserRegistrationRequestHandler.handleRegistrationCallback(url!!) - finish() - return true - } - return super.shouldOverrideUrlLoading(view, request) - } - } - val url = intent.getStringExtra("url") - if (url == null || url.isEmpty()) { - cancelBrowserRegistrationUseCase() - finish() - } else { - myWebView.loadUrl(url) - } - } -} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/BrowserRegistrationRequestHandler.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/BrowserRegistrationRequestHandler.kt index 8f18b97a..140a424b 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/BrowserRegistrationRequestHandler.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/handlers/BrowserRegistrationRequestHandler.kt @@ -3,29 +3,29 @@ package com.onegini.mobile.sdk.flutter.handlers import android.net.Uri import com.onegini.mobile.sdk.android.handlers.request.OneginiBrowserRegistrationRequestHandler import com.onegini.mobile.sdk.android.handlers.request.callback.OneginiBrowserRegistrationCallback +import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.* +import com.onegini.mobile.sdk.flutter.helpers.SdkError import com.onegini.mobile.sdk.flutter.pigeonPlugin.NativeCallFlutterApi import javax.inject.Inject import javax.inject.Singleton -// TODO Put functions into use cases; https://onewelcome.atlassian.net/browse/FP-35 @Singleton class BrowserRegistrationRequestHandler @Inject constructor(private val nativeApi: NativeCallFlutterApi) : OneginiBrowserRegistrationRequestHandler { + private var callback: OneginiBrowserRegistrationCallback? = null - companion object { - var callback: OneginiBrowserRegistrationCallback? = null + fun handleRegistrationCallback(uri: Uri): Result { + return callback?.let { + it.handleRegistrationCallback(uri) + Result.success(Unit) + } ?: Result.failure(SdkError(BROWSER_REGISTRATION_NOT_IN_PROGRESS).pigeonError()) + } - /** - * Finish registration action with result from web browser - * TODO: Move this to use-case after browser logic rework - * https://onewelcome.atlassian.net/browse/FP-35 - */ - fun handleRegistrationCallback(uri: Uri) { - if (callback != null) { - callback?.handleRegistrationCallback(uri) - callback = null - } - } + fun cancelRegistration(): Result { + return callback?.let { + it.denyRegistration() + Result.success(Unit) + } ?: Result.failure(SdkError(BROWSER_REGISTRATION_NOT_IN_PROGRESS).pigeonError()) } override fun startRegistration(uri: Uri, oneginiBrowserRegistrationCallback: OneginiBrowserRegistrationCallback) { diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.kt index d8c1cf88..79715bb8 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/pigeonPlugin/Pigeon.kt @@ -423,7 +423,7 @@ private object UserClientApiCodec : StandardMessageCodec() { interface UserClientApi { fun startApplication(securityControllerClassName: String?, configModelClassName: String?, customIdentityProviderConfigs: List?, connectionTimeout: Long?, readTimeout: Long?, callback: (Result) -> Unit) fun registerUser(identityProviderId: String?, scopes: List?, callback: (Result) -> Unit) - fun handleRegisteredUserUrl(url: String, signInType: Long, callback: (Result) -> Unit) + fun handleRegistrationCallback(url: String, callback: (Result) -> Unit) fun getIdentityProviders(callback: (Result>) -> Unit) fun deregisterUser(profileId: String, callback: (Result) -> Unit) fun getRegisteredAuthenticators(profileId: String, callback: (Result>) -> Unit) @@ -517,13 +517,12 @@ interface UserClientApi { } } run { - val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.handleRegisteredUserUrl", codec) + val channel = BasicMessageChannel(binaryMessenger, "dev.flutter.pigeon.UserClientApi.handleRegistrationCallback", codec) if (api != null) { channel.setMessageHandler { message, reply -> val args = message as List val urlArg = args[0] as String - val signInTypeArg = args[1].let { if (it is Int) it.toLong() else it as Long } - api.handleRegisteredUserUrl(urlArg, signInTypeArg) { result: Result -> + api.handleRegistrationCallback(urlArg) { result: Result -> val error = result.exceptionOrNull() if (error != null) { reply.reply(wrapError(error)) diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/CancelBrowserRegistrationUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/CancelBrowserRegistrationUseCase.kt index 8ae66654..22830202 100644 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/CancelBrowserRegistrationUseCase.kt +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/CancelBrowserRegistrationUseCase.kt @@ -1,19 +1,10 @@ package com.onegini.mobile.sdk.flutter.useCases import com.onegini.mobile.sdk.flutter.handlers.BrowserRegistrationRequestHandler -import com.onegini.mobile.sdk.flutter.helpers.SdkError -import com.onegini.mobile.sdk.flutter.OneWelcomeWrapperErrors.BROWSER_REGISTRATION_NOT_IN_PROGRESS import javax.inject.Inject -class CancelBrowserRegistrationUseCase @Inject constructor() { +class CancelBrowserRegistrationUseCase @Inject constructor(private val browserRegistrationRequestHandler: BrowserRegistrationRequestHandler) { operator fun invoke(): Result { - return when (val browserCallback = BrowserRegistrationRequestHandler.callback) { - null -> Result.failure(SdkError(BROWSER_REGISTRATION_NOT_IN_PROGRESS).pigeonError()) - else -> { - browserCallback.denyRegistration() - BrowserRegistrationRequestHandler.callback = null - Result.success(Unit) - } - } + return browserRegistrationRequestHandler.cancelRegistration() } } diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegisteredUrlUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegisteredUrlUseCase.kt deleted file mode 100644 index 926eb9d1..00000000 --- a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegisteredUrlUseCase.kt +++ /dev/null @@ -1,32 +0,0 @@ -package com.onegini.mobile.sdk.flutter.useCases - -import android.content.Context -import android.content.Intent -import android.net.Uri -import com.onegini.mobile.sdk.flutter.OneginiSDK -import com.onegini.mobile.sdk.flutter.activity.ActivityWebView -import javax.inject.Inject -import javax.inject.Singleton - -@Singleton -class HandleRegisteredUrlUseCase @Inject constructor(private val context: Context, private val oneginiSDK: OneginiSDK) { - operator fun invoke(url: String, signInType: Long): Result { - val intent = prepareIntentBasedOnType(signInType.toInt(), context, url) - context.startActivity(intent) - - return Result.success(Unit) - } - - private fun prepareIntentBasedOnType(type: Int?, context: Context, url: String): Intent { - val intent: Intent = if (type == null || type == 0) { - Intent(context, ActivityWebView::class.java).putExtra("url", url) - .putExtra("redirectUrl", oneginiSDK.oneginiClient.configModel.redirectUri) - } else { - val uri = Uri.parse(url) - Intent(Intent.ACTION_VIEW, uri) - } - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK) - intent.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY) - return intent - } -} diff --git a/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegistrationCallbackUseCase.kt b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegistrationCallbackUseCase.kt new file mode 100644 index 00000000..15fe29c7 --- /dev/null +++ b/android/src/main/kotlin/com/onegini/mobile/sdk/flutter/useCases/HandleRegistrationCallbackUseCase.kt @@ -0,0 +1,14 @@ +package com.onegini.mobile.sdk.flutter.useCases + +import com.onegini.mobile.sdk.flutter.facade.UriFacade +import com.onegini.mobile.sdk.flutter.handlers.BrowserRegistrationRequestHandler +import javax.inject.Inject +import javax.inject.Singleton + +@Singleton +class HandleRegistrationCallbackUseCase @Inject constructor(private val uriFacade: UriFacade, private val registrationRequestHandler: BrowserRegistrationRequestHandler) { + operator fun invoke(url: String): Result { + val uri = uriFacade.parse(url) + return registrationRequestHandler.handleRegistrationCallback(uri) + } +} diff --git a/example/android/app/src/main/AndroidManifest.xml b/example/android/app/src/main/AndroidManifest.xml index de8538fa..f2458af9 100644 --- a/example/android/app/src/main/AndroidManifest.xml +++ b/example/android/app/src/main/AndroidManifest.xml @@ -9,6 +9,16 @@ android:name="${applicationName}" android:icon="@mipmap/ic_launcher" android:label="onegini_example"> + + + + + + + + - - - - - - - - diff --git a/example/android/app/src/main/kotlin/com/onegini/mobile/onegini_example/MainActivity.kt b/example/android/app/src/main/kotlin/com/onegini/mobile/onegini_example/MainActivity.kt index ab0bdaae..0509e2be 100644 --- a/example/android/app/src/main/kotlin/com/onegini/mobile/onegini_example/MainActivity.kt +++ b/example/android/app/src/main/kotlin/com/onegini/mobile/onegini_example/MainActivity.kt @@ -1,17 +1,5 @@ package com.onegini.mobile.onegini_example -import android.content.Intent -import com.onegini.mobile.sdk.flutter.handlers.BrowserRegistrationRequestHandler import io.flutter.embedding.android.FlutterActivity -class MainActivity : FlutterActivity() { - - override fun onNewIntent(intent: Intent) { - super.onNewIntent(intent) - if (intent.data != null) { - // TODO: Move this logic to outside of the SDK - // https://onewelcome.atlassian.net/browse/FP-35 - BrowserRegistrationRequestHandler.handleRegistrationCallback(intent.data!!) - } - } -} +class MainActivity : FlutterActivity() diff --git a/example/ios/Podfile.lock b/example/ios/Podfile.lock index 1ccd1fcb..5e77b255 100644 --- a/example/ios/Podfile.lock +++ b/example/ios/Podfile.lock @@ -15,6 +15,8 @@ PODS: - AFNetworking/UIKit (4.0.1): - AFNetworking/NSURLSession - Flutter (1.0.0) + - flutter_web_auth_2 (1.1.1): + - Flutter - fluttertoast (0.0.2): - Flutter - Toast @@ -43,6 +45,7 @@ PODS: DEPENDENCIES: - Flutter (from `Flutter`) + - flutter_web_auth_2 (from `.symlinks/plugins/flutter_web_auth_2/ios`) - fluttertoast (from `.symlinks/plugins/fluttertoast/ios`) - onegini (from `.symlinks/plugins/onegini/ios`) - qr_code_scanner (from `.symlinks/plugins/qr_code_scanner/ios`) @@ -62,6 +65,8 @@ SPEC REPOS: EXTERNAL SOURCES: Flutter: :path: Flutter + flutter_web_auth_2: + :path: ".symlinks/plugins/flutter_web_auth_2/ios" fluttertoast: :path: ".symlinks/plugins/fluttertoast/ios" onegini: @@ -74,6 +79,7 @@ EXTERNAL SOURCES: SPEC CHECKSUMS: AFNetworking: 3bd23d814e976cd148d7d44c3ab78017b744cd58 Flutter: f04841e97a9d0b0a8025694d0796dd46242b2854 + flutter_web_auth_2: a1bc00762c408a8f80b72a538cd7ff5b601c3e71 fluttertoast: eb263d302cc92e04176c053d2385237e9f43fad0 MTBBarcodeScanner: f453b33c4b7dfe545d8c6484ed744d55671788cb onegini: bcef895403897119a1f340413bc75b8c1328624c diff --git a/example/ios/Runner/AppDelegate.swift b/example/ios/Runner/AppDelegate.swift index 76197c5d..ffd654bd 100644 --- a/example/ios/Runner/AppDelegate.swift +++ b/example/ios/Runner/AppDelegate.swift @@ -11,10 +11,4 @@ import OneginiSDKiOS GeneratedPluginRegistrant.register(with: self) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } - - override func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool { - let isOneginiUrlCallback: Bool = OneginiModuleSwift.sharedInstance.handleDeepLinkCallbackUrl(url) - debugPrint(isOneginiUrlCallback) - return true - } } diff --git a/example/lib/onegini_listener.dart b/example/lib/onegini_listener.dart index a217ef02..f7842e27 100644 --- a/example/lib/onegini_listener.dart +++ b/example/lib/onegini_listener.dart @@ -2,6 +2,8 @@ import 'package:flutter/material.dart'; import 'package:flutter/services.dart'; +import 'package:flutter_web_auth_2/flutter_web_auth_2.dart'; +import 'package:onegini/callbacks/onegini_registration_callback.dart'; import 'package:onegini/model/authentication_attempt.dart'; import 'package:onegini/model/onegini_event.dart'; import 'package:onegini/onegini.dart'; @@ -171,8 +173,17 @@ class OneginiListener extends OneginiEventListener { @override void handleRegisteredUrl(BuildContext buildContext, String url) async { - await Onegini.instance.userClient.handleRegisteredUserUrl(buildContext, url, - signInType: WebSignInType.insideApp); + try { + final result = await FlutterWebAuth2.authenticate( + url: url, callbackUrlScheme: "oneginiexample"); + print(result); + Onegini.instance.userClient + .handleRegistrationCallback(buildContext, result); + } catch (err) { + print(err); + showFlutterToast(err.toString()); + OneginiRegistrationCallback().cancelBrowserRegistration(); + } } @override diff --git a/example/pubspec.yaml b/example/pubspec.yaml index 0544d721..50980214 100644 --- a/example/pubspec.yaml +++ b/example/pubspec.yaml @@ -27,6 +27,7 @@ dependencies: fluttertoast: ^8.0.9 qr_code_scanner: ^1.0.1 url_launcher: ^6.0.3 + flutter_web_auth_2: ^2.1.2 dev_dependencies: flutter_test: diff --git a/ios/Classes/NativeBridge/Handlers/BrowserHandler.swift b/ios/Classes/NativeBridge/Handlers/BrowserHandler.swift deleted file mode 100644 index 624d2152..00000000 --- a/ios/Classes/NativeBridge/Handlers/BrowserHandler.swift +++ /dev/null @@ -1,86 +0,0 @@ -import AuthenticationServices -import OneginiSDKiOS - -protocol BrowserHandlerProtocol { - func handleUrl(_ url: URL, webSignInType: WebSignInType) -} - -protocol BrowserHandlerToRegisterHandlerProtocol { - func handleRedirectURL(url: URL) - func handleCancelFromBrowser() -} - -// MARK: - BrowserHandlerProtocol -@available(iOS 12.0, *) -class BrowserViewController: NSObject, BrowserHandlerProtocol { - var webAuthSession: ASWebAuthenticationSession? - - let registerHandler: BrowserHandlerToRegisterHandlerProtocol - - init(registerHandlerProtocol: BrowserHandlerToRegisterHandlerProtocol) { - self.registerHandler = registerHandlerProtocol - } - - func handleUrl(_ url: URL, webSignInType: WebSignInType) { - Logger.log("handleUrl url: \(url.absoluteString)", sender: self) - switch webSignInType { - case .safari: - openExternalBrowser(url: url) - default: - openInternalBrowser(url: url) - } - - } - - private func openExternalBrowser(url: URL) { - guard UIApplication.shared.canOpenURL(url) else { - Logger.log("can't open external browser url: \(url.absoluteString)", logType: .error) - self.cancelButtonPressed() - return - } - UIApplication.shared.open(url, options: [:]) { (value) in - Logger.log("opened external browser url: \(value)") - } - } - - private func openInternalBrowser(url: URL) { - let scheme = URL(string: ONGClient.sharedInstance().configModel.redirectURL)!.scheme - webAuthSession = ASWebAuthenticationSession(url: url, callbackURLScheme: scheme, completionHandler: { callbackURL, error in - Logger.log("webAuthSession completionHandler", sender: self) - guard error == nil, let successURL = callbackURL else { - self.cancelButtonPressed() - return - } - - self.handleSuccessUrl(url: successURL) - }) - - if #available(iOS 13.0, *) { - webAuthSession?.prefersEphemeralWebBrowserSession = true - webAuthSession?.presentationContextProvider = self - } - webAuthSession?.start() - } - - private func handleSuccessUrl(url: URL) { - Logger.log("handleSuccessUrl url: \(url)", sender: self) - registerHandler.handleRedirectURL(url: url) - } - - private func cancelButtonPressed() { - Logger.log("cancelButtonPressed", sender: self) - registerHandler.handleCancelFromBrowser() - } - -} - -// MARK: - ASWebAuthenticationPresentationContextProviding -@available(iOS 12.0, *) -extension BrowserViewController: ASWebAuthenticationPresentationContextProviding { - func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor { - Logger.log("presentationAnchor for session", sender: self) - - let anchor: ASPresentationAnchor = UIApplication.shared.keyWindow ?? ASPresentationAnchor() - return anchor - } -} diff --git a/ios/Classes/NativeBridge/Handlers/RegistrationHandler.swift b/ios/Classes/NativeBridge/Handlers/RegistrationHandler.swift index 07b2af0c..adad4769 100644 --- a/ios/Classes/NativeBridge/Handlers/RegistrationHandler.swift +++ b/ios/Classes/NativeBridge/Handlers/RegistrationHandler.swift @@ -1,50 +1,10 @@ import OneginiSDKiOS -enum WebSignInType: Int { - case insideApp - case safari - - init(rawValue: Int) { - switch rawValue { - case 1: self = .safari - default: self = .insideApp - } - } -} - -class RegistrationHandler: NSObject, BrowserHandlerToRegisterHandlerProtocol { +class RegistrationHandler { var createPinChallenge: CreatePinChallenge? var browserRegistrationChallenge: BrowserRegistrationChallenge? var customRegistrationChallenge: CustomRegistrationChallenge? - var browserConntroller: BrowserHandlerProtocol? - - func presentBrowserUserRegistrationView(registrationUserURL: URL, webSignInType: WebSignInType) { - guard let browserController = browserConntroller else { - browserConntroller = BrowserViewController(registerHandlerProtocol: self) - browserConntroller?.handleUrl(registrationUserURL, webSignInType: webSignInType) - return - } - - browserController.handleUrl(registrationUserURL, webSignInType: webSignInType) - } - - func handleRedirectURL(url: URL) { - Logger.log("handleRedirectURL url: \(url.absoluteString)", sender: self) - // FIXME: browserRegistrationChallenge is only set to nil when we finish or fail registration, so this will work but will need a refactor if the internal browser ever gets removed. - guard let browserRegistrationChallenge = browserRegistrationChallenge else { - return - } - browserRegistrationChallenge.sender.respond(with: url, to: browserRegistrationChallenge) - } - - func handleCancelFromBrowser() { - // FIXME: browserRegistrationChallenge is only set to nil when we finish or fail registration, so this will work but will need a refactor if the internal browser ever gets removed. - guard let browserRegistrationChallenge = browserRegistrationChallenge else { - return - } - browserRegistrationChallenge.sender.cancel(browserRegistrationChallenge) - } func handlePin(pin: String, completion: (Result) -> Void) { guard let createPinChallenge = createPinChallenge else { @@ -97,17 +57,14 @@ class RegistrationHandler: NSObject, BrowserHandlerToRegisterHandlerProtocol { SharedUserClient.instance.registerUserWith(identityProvider: identityProvider, scopes: scopes, delegate: delegate) } - func processRedirectURL(url: String, webSignInType: Int) -> Result { - let webSignInType = WebSignInType(rawValue: webSignInType) - guard let url = URL.init(string: url) else { - return .failure(FlutterError(.providedUrlIncorrect)) + func handleRegistrationCallback(url: String) -> Result { + guard let browserRegistrationChallenge = browserRegistrationChallenge else { + return .failure(FlutterError(.browserRegistrationNotInProgress)) } - - if webSignInType != .insideApp && !UIApplication.shared.canOpenURL(url) { + guard let url = URL.init(string: url) else { return .failure(FlutterError(.providedUrlIncorrect)) } - - presentBrowserUserRegistrationView(registrationUserURL: url, webSignInType: webSignInType) + browserRegistrationChallenge.sender.respond(with: url, to: browserRegistrationChallenge) return .success } diff --git a/ios/Classes/NativeBridge/ModuleExtensions/OneginiModuleSwift+Register.swift b/ios/Classes/NativeBridge/ModuleExtensions/OneginiModuleSwift+Register.swift index fe0adc97..30b45488 100644 --- a/ios/Classes/NativeBridge/ModuleExtensions/OneginiModuleSwift+Register.swift +++ b/ios/Classes/NativeBridge/ModuleExtensions/OneginiModuleSwift+Register.swift @@ -12,25 +12,8 @@ extension OneginiModuleSwift { bridgeConnector.toRegistrationHandler.registerUser(identityProviderId, scopes: scopes, completion: completion) } - func handleRegisteredProcessUrl(_ url: String, webSignInType: Int) -> Result { - return bridgeConnector.toRegistrationHandler.processRedirectURL(url: url, webSignInType: webSignInType) - } - - public func handleDeepLinkCallbackUrl(_ url: URL) -> Bool { - guard let schemeLibrary = URL.init(string: ONGClient.sharedInstance().configModel.redirectURL)?.scheme else { - // FIXME: We should propagate an error here to the caller, not through events. - return false - } - - guard let scheme = url.scheme, - scheme.compare(schemeLibrary, options: .caseInsensitive) == .orderedSame else { - let value = ["url_scheme": url.scheme, "library_scheme": schemeLibrary, "url": url.absoluteString] - // FIXME: We should propagate an error here to the caller, not through events. - return false - } - - bridgeConnector.toRegistrationHandler.handleRedirectURL(url: url) - return true + func handleRegistrationCallback(_ url: String) -> Result { + return bridgeConnector.toRegistrationHandler.handleRegistrationCallback(url: url) } func submitCustomRegistrationSuccess(_ data: String?, completion: @escaping (Result) -> Void) { diff --git a/ios/Classes/Pigeon.swift b/ios/Classes/Pigeon.swift index 8ee4b9ca..f2df138d 100644 --- a/ios/Classes/Pigeon.swift +++ b/ios/Classes/Pigeon.swift @@ -392,7 +392,7 @@ class UserClientApiCodec: FlutterStandardMessageCodec { protocol UserClientApi { func startApplication(securityControllerClassName: String?, configModelClassName: String?, customIdentityProviderConfigs: [OWCustomIdentityProvider]?, connectionTimeout: Int64?, readTimeout: Int64?, completion: @escaping (Result) -> Void) func registerUser(identityProviderId: String?, scopes: [String]?, completion: @escaping (Result) -> Void) - func handleRegisteredUserUrl(url: String, signInType: Int64, completion: @escaping (Result) -> Void) + func handleRegistrationCallback(url: String, completion: @escaping (Result) -> Void) func getIdentityProviders(completion: @escaping (Result<[OWIdentityProvider], Error>) -> Void) func deregisterUser(profileId: String, completion: @escaping (Result) -> Void) func getRegisteredAuthenticators(profileId: String, completion: @escaping (Result<[OWAuthenticator], Error>) -> Void) @@ -479,13 +479,12 @@ class UserClientApiSetup { } else { registerUserChannel.setMessageHandler(nil) } - let handleRegisteredUserUrlChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserClientApi.handleRegisteredUserUrl", binaryMessenger: binaryMessenger, codec: codec) + let handleRegistrationCallbackChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserClientApi.handleRegistrationCallback", binaryMessenger: binaryMessenger, codec: codec) if let api = api { - handleRegisteredUserUrlChannel.setMessageHandler { message, reply in + handleRegistrationCallbackChannel.setMessageHandler { message, reply in let args = message as! [Any] let urlArg = args[0] as! String - let signInTypeArg = (args[1] is Int) ? Int64(args[1] as! Int) : args[1] as! Int64 - api.handleRegisteredUserUrl(url: urlArg, signInType: signInTypeArg) { result in + api.handleRegistrationCallback(url: urlArg) { result in switch result { case .success: reply(wrapResult(nil)) @@ -495,7 +494,7 @@ class UserClientApiSetup { } } } else { - handleRegisteredUserUrlChannel.setMessageHandler(nil) + handleRegistrationCallbackChannel.setMessageHandler(nil) } let getIdentityProvidersChannel = FlutterBasicMessageChannel(name: "dev.flutter.pigeon.UserClientApi.getIdentityProviders", binaryMessenger: binaryMessenger, codec: codec) if let api = api { diff --git a/ios/Classes/SwiftOneginiPlugin.swift b/ios/Classes/SwiftOneginiPlugin.swift index 07b23f94..04ad993f 100644 --- a/ios/Classes/SwiftOneginiPlugin.swift +++ b/ios/Classes/SwiftOneginiPlugin.swift @@ -91,6 +91,10 @@ public class SwiftOneginiPlugin: NSObject, FlutterPlugin, UserClientApi, Resourc } } + func handleRegistrationCallback(url: String, completion: @escaping (Result) -> Void) { + completion(OneginiModuleSwift.sharedInstance.handleRegistrationCallback(url).mapError({$0})) + } + func enrollMobileAuthentication(completion: @escaping (Result) -> Void) { OneginiModuleSwift.sharedInstance.enrollMobileAuthentication { result in completion(result.mapError { $0 }) @@ -187,10 +191,6 @@ public class SwiftOneginiPlugin: NSObject, FlutterPlugin, UserClientApi, Resourc } } - func handleRegisteredUserUrl(url: String, signInType: Int64, completion: @escaping (Result) -> Void) { - completion(OneginiModuleSwift.sharedInstance.handleRegisteredProcessUrl(url, webSignInType: Int(signInType)).mapError({$0})) - } - func getIdentityProviders(completion: @escaping (Result<[OWIdentityProvider], Error>) -> Void) { completion(OneginiModuleSwift.sharedInstance.getIdentityProviders().mapError { $0 }) } diff --git a/lib/pigeon.dart b/lib/pigeon.dart index dda3df5f..bbd1f285 100644 --- a/lib/pigeon.dart +++ b/lib/pigeon.dart @@ -459,12 +459,12 @@ class UserClientApi { } } - Future handleRegisteredUserUrl(String arg_url, int arg_signInType) async { + Future handleRegistrationCallback(String arg_url) async { final BasicMessageChannel channel = BasicMessageChannel( - 'dev.flutter.pigeon.UserClientApi.handleRegisteredUserUrl', codec, + 'dev.flutter.pigeon.UserClientApi.handleRegistrationCallback', codec, binaryMessenger: _binaryMessenger); final List? replyList = - await channel.send([arg_url, arg_signInType]) as List?; + await channel.send([arg_url]) as List?; if (replyList == null) { throw PlatformException( code: 'channel-error', diff --git a/lib/user_client.dart b/lib/user_client.dart index b363e7b4..df798fee 100644 --- a/lib/user_client.dart +++ b/lib/user_client.dart @@ -25,10 +25,10 @@ class UserClient { } /// Start browser Registration logic - Future handleRegisteredUserUrl(BuildContext? context, String url, - {WebSignInType signInType = WebSignInType.insideApp}) async { + Future handleRegistrationCallback( + BuildContext? context, String url) async { Onegini.instance.setEventContext(context); - await api.handleRegisteredUserUrl(url, signInType.value); + await api.handleRegistrationCallback(url); } /// Returns a list of available identity providers. diff --git a/pigeons/onewelcome_pigeon_interface.dart b/pigeons/onewelcome_pigeon_interface.dart index a081f3f4..4b9da550 100644 --- a/pigeons/onewelcome_pigeon_interface.dart +++ b/pigeons/onewelcome_pigeon_interface.dart @@ -140,7 +140,7 @@ abstract class UserClientApi { String? identityProviderId, List? scopes); @async - void handleRegisteredUserUrl(String url, int signInType); + void handleRegistrationCallback(String url); @async List getIdentityProviders();