From 2c24c4bb5a8c1eae3fd8bdcea82c8fcae43d1233 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Thu, 21 Dec 2023 23:20:25 +0100 Subject: [PATCH 1/8] feat: add support for sync openUrl --- auth0_flutter/lib/auth0_flutter_web.dart | 5 +++++ auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart | 6 ++++-- auth0_flutter/lib/src/web/js_interop.dart | 8 ++++++-- .../lib/src/auth0_flutter_web_platform.dart | 1 + .../lib/src/login_options.dart | 3 +++ 5 files changed, 19 insertions(+), 4 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index cd9e5085..1ed0f926 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -1,4 +1,5 @@ import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; + import 'src/version.dart'; export 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart' @@ -101,6 +102,8 @@ class Auth0Web { /// * Arbitrary [parameters] can be specified and then picked up in a custom /// Auth0 [Action](https://auth0.com/docs/customize/actions) or /// [Rule](https://auth0.com/docs/customize/rules). + /// * [openUrl] Used to control the redirect and not rely on the SDK to do the + /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future loginWithRedirect( {final String? audience, final String? redirectUrl, @@ -108,6 +111,7 @@ class Auth0Web { final String? invitationUrl, final int? maxAge, final Set? scopes, + final void Function(String url)? openUrl, final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.loginWithRedirect(LoginOptions( audience: audience, @@ -115,6 +119,7 @@ class Auth0Web { organizationId: organizationId, invitationUrl: invitationUrl, scopes: scopes ?? {}, + openUrl: openUrl, idTokenValidationConfig: IdTokenValidationConfig(maxAge: maxAge), parameters: parameters)); diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index bb94f974..2d5b858a 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -61,8 +61,10 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); - final loginOptions = - interop.RedirectLoginOptions(authorizationParams: authParams); + final loginOptions = interop.RedirectLoginOptions( + authorizationParams: authParams, + openUrl: options?.openUrl, + ); return client.loginWithRedirect(loginOptions); } diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index 9367eef1..a95502f8 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -44,10 +44,14 @@ class AuthorizationParams { @anonymous class RedirectLoginOptions { external AuthorizationParams? get authorizationParams; + external void Function(String url)? openUrl; external String? get fragment; - external factory RedirectLoginOptions( - {final AuthorizationParams authorizationParams, final String fragment}); + external factory RedirectLoginOptions({ + final AuthorizationParams authorizationParams, + final String fragment, + final void Function(String url)? openUrl, + }); } @JS() diff --git a/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart b/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart index 3d7fb656..dad07a52 100644 --- a/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart +++ b/auth0_flutter_platform_interface/lib/src/auth0_flutter_web_platform.dart @@ -1,4 +1,5 @@ import 'package:plugin_platform_interface/plugin_platform_interface.dart'; + import '../auth0_flutter_platform_interface.dart'; class StubAuth0FlutterWeb extends Auth0FlutterWebPlatform {} diff --git a/auth0_flutter_platform_interface/lib/src/login_options.dart b/auth0_flutter_platform_interface/lib/src/login_options.dart index ad8a9421..ee44e5a6 100644 --- a/auth0_flutter_platform_interface/lib/src/login_options.dart +++ b/auth0_flutter_platform_interface/lib/src/login_options.dart @@ -8,6 +8,7 @@ class LoginOptions implements RequestOptions { final String? redirectUrl; final String? organizationId; final String? invitationUrl; + final void Function(String url)? openUrl; final Map parameters; LoginOptions( @@ -17,6 +18,7 @@ class LoginOptions implements RequestOptions { this.redirectUrl, this.organizationId, this.invitationUrl, + this.openUrl, this.parameters = const {}}); @override @@ -29,6 +31,7 @@ class LoginOptions implements RequestOptions { 'redirectUrl': redirectUrl, 'organizationId': organizationId, 'invitationUrl': invitationUrl, + 'openUrl': openUrl, 'parameters': parameters, }; } From 4901c531c08dfa91a836e42de81213397595d0f7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 00:17:08 +0100 Subject: [PATCH 2/8] feat: allow async openUrl --- auth0_flutter/lib/auth0_flutter_web.dart | 2 +- auth0_flutter/lib/src/web/js_interop.dart | 4 ++-- auth0_flutter_platform_interface/lib/src/login_options.dart | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 1ed0f926..46b1c7e9 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -111,7 +111,7 @@ class Auth0Web { final String? invitationUrl, final int? maxAge, final Set? scopes, - final void Function(String url)? openUrl, + final Future Function(String url)? openUrl, final Map parameters = const {}}) => Auth0FlutterWebPlatform.instance.loginWithRedirect(LoginOptions( audience: audience, diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index a95502f8..de4e0f7d 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -44,13 +44,13 @@ class AuthorizationParams { @anonymous class RedirectLoginOptions { external AuthorizationParams? get authorizationParams; - external void Function(String url)? openUrl; + external Future Function(String url)? openUrl; external String? get fragment; external factory RedirectLoginOptions({ final AuthorizationParams authorizationParams, final String fragment, - final void Function(String url)? openUrl, + final Future Function(String url)? openUrl, }); } diff --git a/auth0_flutter_platform_interface/lib/src/login_options.dart b/auth0_flutter_platform_interface/lib/src/login_options.dart index ee44e5a6..665b4408 100644 --- a/auth0_flutter_platform_interface/lib/src/login_options.dart +++ b/auth0_flutter_platform_interface/lib/src/login_options.dart @@ -8,7 +8,7 @@ class LoginOptions implements RequestOptions { final String? redirectUrl; final String? organizationId; final String? invitationUrl; - final void Function(String url)? openUrl; + final Future Function(String url)? openUrl; final Map parameters; LoginOptions( From ac6f01b4e1e8df883fbbf9bc76131dd659fbd426 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 01:07:01 +0100 Subject: [PATCH 3/8] feat: add openUrl to web logout --- auth0_flutter/lib/auth0_flutter_web.dart | 13 ++++++++++--- .../lib/src/web/auth0_flutter_plugin_real.dart | 4 ++-- .../web/extensions/logout_options.extension.dart | 9 ++++++--- auth0_flutter/lib/src/web/js_interop.dart | 8 ++++++-- .../lib/src/web/logout_options.dart | 3 ++- 5 files changed, 26 insertions(+), 11 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 46b1c7e9..bc78777c 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -195,9 +195,16 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). - Future logout({final bool? federated, final String? returnToUrl}) => - Auth0FlutterWebPlatform.instance - .logout(LogoutOptions(federated: federated, returnTo: returnToUrl)); + Future logout({ + final bool? federated, + final String? returnToUrl, + final Future Function(String url)? openUrl, + }) => + Auth0FlutterWebPlatform.instance.logout(LogoutOptions( + federated: federated, + returnTo: returnToUrl, + openUrl: openUrl, + )); /// Retrieves a set of credentials for the user. /// diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 2d5b858a..00f158a2 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -61,10 +61,10 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); - final loginOptions = interop.RedirectLoginOptions( + final loginOptions = JsInteropUtils.stripNulls(interop.RedirectLoginOptions( authorizationParams: authParams, openUrl: options?.openUrl, - ); + )); return client.loginWithRedirect(loginOptions); } diff --git a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart index c87132d2..ac4ee224 100644 --- a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart +++ b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart @@ -4,7 +4,10 @@ import '../js_interop.dart' as interop; import '../js_interop_utils.dart'; extension LogoutOptionsExtension on LogoutOptions { - interop.LogoutOptions toClientLogoutOptions() => interop.LogoutOptions( - logoutParams: JsInteropUtils.stripNulls( - interop.LogoutParams(federated: federated, returnTo: returnTo))); + interop.LogoutOptions toClientLogoutOptions() => + JsInteropUtils.stripNulls(interop.LogoutOptions( + openUrl: openUrl, + logoutParams: JsInteropUtils.stripNulls( + interop.LogoutParams(federated: federated, returnTo: returnTo)), + )); } diff --git a/auth0_flutter/lib/src/web/js_interop.dart b/auth0_flutter/lib/src/web/js_interop.dart index de4e0f7d..e4e7429c 100644 --- a/auth0_flutter/lib/src/web/js_interop.dart +++ b/auth0_flutter/lib/src/web/js_interop.dart @@ -154,8 +154,12 @@ class LogoutParams { @anonymous class LogoutOptions { external LogoutParams? get logoutParams; + external Future Function(String url)? openUrl; - external factory LogoutOptions({final LogoutParams? logoutParams}); + external factory LogoutOptions({ + final LogoutParams? logoutParams, + final Future Function(String url)? openUrl, + }); } @JS() @@ -188,5 +192,5 @@ class Auth0Client { external Future getTokenSilently( [final GetTokenSilentlyOptions? options]); external Future isAuthenticated(); - external Future logout([final LogoutOptions? logoutParams]); + external Future logout([final LogoutOptions? logoutOptions]); } diff --git a/auth0_flutter_platform_interface/lib/src/web/logout_options.dart b/auth0_flutter_platform_interface/lib/src/web/logout_options.dart index a41c0a9a..caf6e592 100644 --- a/auth0_flutter_platform_interface/lib/src/web/logout_options.dart +++ b/auth0_flutter_platform_interface/lib/src/web/logout_options.dart @@ -1,6 +1,7 @@ class LogoutOptions { final String? returnTo; final bool? federated; + final Future Function(String url)? openUrl; - LogoutOptions({this.returnTo, this.federated}); + LogoutOptions({this.returnTo, this.federated, this.openUrl}); } From 82b0dcae6a62606eaa609925977414bfddf5e672 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 01:46:17 +0100 Subject: [PATCH 4/8] feat: use allowInterop on the input function to prevent client errors allowInterop can be used multiple times on the same function without adverse effects, so it is ok if the user also passes a function that has already been "interoped" --- auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart index 00f158a2..66bbfa27 100644 --- a/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart +++ b/auth0_flutter/lib/src/web/auth0_flutter_plugin_real.dart @@ -3,6 +3,7 @@ import 'dart:html'; import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; import 'package:flutter_web_plugins/flutter_web_plugins.dart'; +import 'package:js/js.dart'; import 'auth0_flutter_web_platform_proxy.dart'; import 'extensions/client_options_extensions.dart'; @@ -61,9 +62,11 @@ class Auth0FlutterPlugin extends Auth0FlutterWebPlatform { : null), options?.parameters ?? {})); + final openUrl = options?.openUrl; + final loginOptions = JsInteropUtils.stripNulls(interop.RedirectLoginOptions( authorizationParams: authParams, - openUrl: options?.openUrl, + openUrl: openUrl != null ? allowInterop(openUrl) : null, )); return client.loginWithRedirect(loginOptions); From 391a9d2eef17caac5fd54d94b1f8b28d225ad6b7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:12:52 +0100 Subject: [PATCH 5/8] feat: add allowInterop to logout openUrl --- .../lib/src/web/extensions/logout_options.extension.dart | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart index ac4ee224..02d21dfc 100644 --- a/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart +++ b/auth0_flutter/lib/src/web/extensions/logout_options.extension.dart @@ -1,3 +1,5 @@ +import 'dart:js'; + import 'package:auth0_flutter_platform_interface/auth0_flutter_platform_interface.dart'; import '../js_interop.dart' as interop; @@ -6,7 +8,7 @@ import '../js_interop_utils.dart'; extension LogoutOptionsExtension on LogoutOptions { interop.LogoutOptions toClientLogoutOptions() => JsInteropUtils.stripNulls(interop.LogoutOptions( - openUrl: openUrl, + openUrl: openUrl != null ? allowInterop(openUrl!) : null, logoutParams: JsInteropUtils.stripNulls( interop.LogoutParams(federated: federated, returnTo: returnTo)), )); From 38d94decb4d4c9f5288d2acf876c6c9d6bc71881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:12:58 +0100 Subject: [PATCH 6/8] test: added unit test to verify openUrl is passed to correctly --- .../test/web/auth0_flutter_web_test.dart | 42 ++++++++++++++++++- .../web/auth0_flutter_web_test.mocks.dart | 32 +++++++++++++- 2 files changed, 72 insertions(+), 2 deletions(-) diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.dart b/auth0_flutter/test/web/auth0_flutter_web_test.dart index e224276e..c322f6e6 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.dart @@ -12,9 +12,14 @@ import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:mockito/annotations.dart'; import 'package:mockito/mockito.dart'; + import 'auth0_flutter_web_test.mocks.dart'; -@GenerateMocks([Auth0FlutterWebClientProxy]) +abstract class OpenUrl { + Future call(final String url) async {} +} + +@GenerateMocks([Auth0FlutterWebClientProxy, OpenUrl]) void main() { final auth0 = Auth0Web('test-domain', 'test-client-id'); final mockClientProxy = MockAuth0FlutterWebClientProxy(); @@ -140,6 +145,25 @@ void main() { expect(params.screen_hint, 'signup'); }); + test('loginWithRedirect supports openUrl', () async { + when(mockClientProxy.isAuthenticated()) + .thenAnswer((final _) => Future.value(false)); + + final openUrlMock = MockOpenUrl(); + await auth0.loginWithRedirect(openUrl: openUrlMock); + + final openUrl = verify(mockClientProxy.loginWithRedirect(captureAny)) + .captured + .first + .openUrl; + + expect(openUrl, isNotNull); + + await openUrl('http://open.url'); + + verify(openUrlMock('http://open.url')).called(1); + }); + test('loginWithRedirect strips options that are null', () async { when(mockClientProxy.isAuthenticated()) .thenAnswer((final _) => Future.value(false)); @@ -236,6 +260,22 @@ void main() { expect(params.returnTo, 'http://returnto.url'); }); + test('logout support openUrl', () async { + when(mockClientProxy.logout(any)).thenAnswer((final _) => Future.value()); + final openUrlMock = MockOpenUrl(); + + await auth0.logout(openUrl: openUrlMock); + + final openUrl = + verify(mockClientProxy.logout(captureAny)).captured.first.openUrl; + + expect(openUrl, isNotNull); + + await openUrl('http://open.url'); + + verify(openUrlMock('http://open.url')).called(1); + }); + test('loginWithPopup is called and succeeds', () async { when(mockClientProxy.loginWithPopup(any, any)) .thenAnswer((final _) => Future.value()); diff --git a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart index e5aadd54..2affab28 100644 --- a/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart +++ b/auth0_flutter/test/web/auth0_flutter_web_test.mocks.dart @@ -1,4 +1,4 @@ -// Mocks generated by Mockito 5.4.0 from annotations +// Mocks generated by Mockito 5.4.4 from annotations // in auth0_flutter/test/web/auth0_flutter_web_test.dart. // Do not manually edit this file. @@ -10,10 +10,14 @@ import 'package:auth0_flutter/src/web/auth0_flutter_web_platform_proxy.dart' import 'package:auth0_flutter/src/web/js_interop.dart' as _i2; import 'package:mockito/mockito.dart' as _i1; +import 'auth0_flutter_web_test.dart' as _i5; + // ignore_for_file: type=lint // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters // ignore_for_file: comment_references +// ignore_for_file: deprecated_member_use +// ignore_for_file: deprecated_member_use_from_same_package // ignore_for_file: implementation_imports // ignore_for_file: invalid_use_of_visible_for_testing_member // ignore_for_file: prefer_const_constructors @@ -59,6 +63,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock Invocation.getter(#client), ), ) as _i2.Auth0Client); + @override _i4.Future loginWithRedirect(_i2.RedirectLoginOptions? options) => (super.noSuchMethod( @@ -69,6 +74,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future loginWithPopup([ _i2.PopupLoginOptions? options, @@ -85,6 +91,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future checkSession() => (super.noSuchMethod( Invocation.method( @@ -94,6 +101,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future<_i2.WebCredentials> getTokenSilently( [_i2.GetTokenSilentlyOptions? options]) => @@ -110,6 +118,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock ), )), ) as _i4.Future<_i2.WebCredentials>); + @override _i4.Future handleRedirectCallback() => (super.noSuchMethod( Invocation.method( @@ -119,6 +128,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValue: _i4.Future.value(), returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); + @override _i4.Future isAuthenticated() => (super.noSuchMethod( Invocation.method( @@ -127,6 +137,7 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock ), returnValue: _i4.Future.value(false), ) as _i4.Future); + @override _i4.Future logout(_i2.LogoutOptions? options) => (super.noSuchMethod( Invocation.method( @@ -137,3 +148,22 @@ class MockAuth0FlutterWebClientProxy extends _i1.Mock returnValueForMissingStub: _i4.Future.value(), ) as _i4.Future); } + +/// A class which mocks [OpenUrl]. +/// +/// See the documentation for Mockito's code generation for more information. +class MockOpenUrl extends _i1.Mock implements _i5.OpenUrl { + MockOpenUrl() { + _i1.throwOnMissingStub(this); + } + + @override + _i4.Future call(String? url) => (super.noSuchMethod( + Invocation.method( + #call, + [url], + ), + returnValue: _i4.Future.value(), + returnValueForMissingStub: _i4.Future.value(), + ) as _i4.Future); +} From 9c21fc968cf7f86c279a37d50aa6a566eae56be5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:17:02 +0100 Subject: [PATCH 7/8] doc: add missing logout openurl doc --- auth0_flutter/lib/auth0_flutter_web.dart | 1 + 1 file changed, 1 insertion(+) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index bc78777c..10a4e15b 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -195,6 +195,7 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). + /// * You can use [openUrl] to control the redirect and not rely on the SDK. Future logout({ final bool? federated, final String? returnToUrl, From 2abd3d96b908e0c7c2c1c11f773f20c15d57a376 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jos=C3=A9=20Quintas?= Date: Fri, 22 Dec 2023 13:19:36 +0100 Subject: [PATCH 8/8] doc: mention version on openurl doc --- auth0_flutter/lib/auth0_flutter_web.dart | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/auth0_flutter/lib/auth0_flutter_web.dart b/auth0_flutter/lib/auth0_flutter_web.dart index 10a4e15b..c0e9d435 100644 --- a/auth0_flutter/lib/auth0_flutter_web.dart +++ b/auth0_flutter/lib/auth0_flutter_web.dart @@ -102,7 +102,7 @@ class Auth0Web { /// * Arbitrary [parameters] can be specified and then picked up in a custom /// Auth0 [Action](https://auth0.com/docs/customize/actions) or /// [Rule](https://auth0.com/docs/customize/rules). - /// * [openUrl] Used to control the redirect and not rely on the SDK to do the + /// * Use [openUrl] to control the redirect and not rely on the SDK to do the /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future loginWithRedirect( {final String? audience, @@ -195,7 +195,8 @@ class Auth0Web { /// * Use [federated] to log the user out of their identity provider /// (such as Google) as well as Auth0. Only applicable if the user /// authenticated using an identity provider. [Read more about how federated logout works at Auth0](https://auth0.com/docs/logout/guides/logout-idps). - /// * You can use [openUrl] to control the redirect and not rely on the SDK. + /// * Use [openUrl] to control the redirect and not rely on the SDK to do the + /// actual redirect. Required *auth0-spa-js* `2.0.1` or later. Future logout({ final bool? federated, final String? returnToUrl,