diff --git a/docker-compose.yaml b/docker-compose.yaml index 8fc9d634..3be0fe1f 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -56,6 +56,7 @@ services: environment: - APP_ENV=${APP_ENV:-development} - API_PROXY_TARGET=http://baron_backend:3000 + - USERFRONT_URL=${USERFRONT_URL} ports: - "${ADMIN_PORT:-5173}:5173" volumes: @@ -74,6 +75,7 @@ services: environment: - APP_ENV=${APP_ENV:-development} - API_PROXY_TARGET=http://baron_backend:3000 + - USERFRONT_URL=${USERFRONT_URL} ports: - "${DEVFRONT_PORT:-5174}:5173" volumes: diff --git a/userfront/lib/core/services/web_auth_integration_web.dart b/userfront/lib/core/services/web_auth_integration_web.dart index 454ff920..9edbfc2f 100644 --- a/userfront/lib/core/services/web_auth_integration_web.dart +++ b/userfront/lib/core/services/web_auth_integration_web.dart @@ -51,5 +51,9 @@ bool implIsPopup() { // Fallback: Check query parameters for integration source final uri = Uri.base; - return uri.queryParameters['source'] == 'adminfront'; + if (uri.queryParameters['source'] == 'adminfront') return true; + + // Manual parse fallback for cases where Uri.base might miss params due to hash routing + final search = html.window.location.search; + return search.contains('source=adminfront'); } diff --git a/userfront/lib/features/auth/presentation/login_screen.dart b/userfront/lib/features/auth/presentation/login_screen.dart index 4b9e3cbf..eccc033e 100644 --- a/userfront/lib/features/auth/presentation/login_screen.dart +++ b/userfront/lib/features/auth/presentation/login_screen.dart @@ -16,8 +16,9 @@ import '../../../core/services/web_window.dart'; class LoginScreen extends ConsumerStatefulWidget { final String? verificationToken; final String? loginChallenge; + final String? redirectUrl; - const LoginScreen({super.key, this.verificationToken, this.loginChallenge}); + const LoginScreen({super.key, this.verificationToken, this.loginChallenge, this.redirectUrl}); @override ConsumerState createState() => _LoginScreenState(); @@ -75,14 +76,17 @@ class _LoginScreenState extends ConsumerState _tabController = TabController(length: 3, vsync: this, initialIndex: 1); _tabController.addListener(_handleTabSelection); _drySendEnabled = _parseBoolParam(Uri.base.queryParameters['drySend']) && !AuthProxyService.isProdEnv; + _redirectUrl = widget.redirectUrl; WidgetsBinding.instance.addPostFrameCallback((_) async { final uri = Uri.base; - if (uri.queryParameters.containsKey('redirect_url')) { - _redirectUrl = uri.queryParameters['redirect_url']; - } else if (uri.queryParameters.containsKey('redirect_uri')) { - _redirectUrl = uri.queryParameters['redirect_uri']; + if (_redirectUrl == null) { + if (uri.queryParameters.containsKey('redirect_url')) { + _redirectUrl = uri.queryParameters['redirect_url']; + } else if (uri.queryParameters.containsKey('redirect_uri')) { + _redirectUrl = uri.queryParameters['redirect_uri']; + } } _loginChallenge = widget.loginChallenge ?? uri.queryParameters['login_challenge']; diff --git a/userfront/lib/main.dart b/userfront/lib/main.dart index 5c94c1b1..424149e3 100644 --- a/userfront/lib/main.dart +++ b/userfront/lib/main.dart @@ -94,15 +94,24 @@ final _router = GoRouter( path: '/signin', builder: (context, state) { final loginChallenge = state.uri.queryParameters['login_challenge']; - _routerLogger.info("Navigating to /signin with login_challenge: $loginChallenge"); - return LoginScreen(key: state.pageKey, loginChallenge: loginChallenge); + final redirectUrl = state.uri.queryParameters['redirect_uri'] ?? state.uri.queryParameters['redirect_url']; + _routerLogger.info("Navigating to /signin with login_challenge: $loginChallenge, redirect: $redirectUrl"); + return LoginScreen( + key: state.pageKey, + loginChallenge: loginChallenge, + redirectUrl: redirectUrl, + ); }, ), GoRoute( path: '/login', builder: (context, state) { - _routerLogger.info("Navigating to /login"); - return LoginScreen(key: state.pageKey); + final redirectUrl = state.uri.queryParameters['redirect_uri'] ?? state.uri.queryParameters['redirect_url']; + _routerLogger.info("Navigating to /login, redirect: $redirectUrl"); + return LoginScreen( + key: state.pageKey, + redirectUrl: redirectUrl, + ); }, ), GoRoute(