From 32cdfea6d0f7f284a04bdf60200dcd3fd495dc70 Mon Sep 17 00:00:00 2001 From: benimautner Date: Thu, 28 Apr 2022 16:59:41 +0200 Subject: [PATCH] implemented login by webview of frontend --- android/app/src/main/AndroidManifest.xml | 3 +- lib/api/client.dart | 1 + lib/pages/user/login.dart | 33 +++++++++++++- lib/pages/user/login_webview.dart | 58 ++++++++++++++++++++++++ pubspec.yaml | 1 + 5 files changed, 94 insertions(+), 2 deletions(-) create mode 100644 lib/pages/user/login_webview.dart diff --git a/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml index 0920729..e4bd9e7 100644 --- a/android/app/src/main/AndroidManifest.xml +++ b/android/app/src/main/AndroidManifest.xml @@ -17,7 +17,8 @@ FlutterApplication and put your custom class here. --> + android:icon="@mipmap/ic_launcher" + android:usesCleartextTraffic="true"> _base; + String get token => _token; Client(this._token, String base, {this.authenticated = true}) : _base = base.endsWith('/api/v1') ? base : '$base/api/v1'; diff --git a/lib/pages/user/login.dart b/lib/pages/user/login.dart index dd14e97..d4ca116 100644 --- a/lib/pages/user/login.dart +++ b/lib/pages/user/login.dart @@ -1,10 +1,16 @@ +import 'dart:developer'; + import 'package:flutter/material.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:vikunja_app/api/user_implementation.dart'; import 'package:vikunja_app/global.dart'; +import 'package:vikunja_app/pages/user/login_webview.dart'; import 'package:vikunja_app/pages/user/register.dart'; import 'package:vikunja_app/theme/button.dart'; import 'package:vikunja_app/theme/buttonText.dart'; import 'package:vikunja_app/theme/constants.dart'; import 'package:vikunja_app/utils/validator.dart'; +import 'package:webview_flutter/webview_flutter.dart'; class LoginPage extends StatefulWidget { @override @@ -129,7 +135,19 @@ class _LoginPageState extends State { builder: (context) => RegisterPage())), child: VikunjaButtonText('Register'), )), - ], + Builder(builder: (context) => FancyButton( + onPressed: () { + if(_formKey.currentState.validate()) { + Navigator.push( + context, + MaterialPageRoute(builder: (context) => + LoginWithWebView(_serverController.text))).then((client) => _loginUserByClientToken(client)); + } else { + ScaffoldMessenger.of(context).showSnackBar(SnackBar(content: Text("Please enter your frontend url"))); + } + }, + child: VikunjaButtonText("Login with Frontend"))) + ], ), ), ), @@ -170,4 +188,17 @@ class _LoginPageState extends State { }); } } + + _loginUserByClientToken(Client client) async { + setState(() => _loading = true); + try { + var newUser = await UserAPIService(client).getCurrentUser(); + VikunjaGlobal.of(context).changeUser( + newUser, token: client.token, base: client.base); + } catch (e) { + log(e.toString()); + } + setState(() => _loading = false); + + } } diff --git a/lib/pages/user/login_webview.dart b/lib/pages/user/login_webview.dart new file mode 100644 index 0000000..5dc8906 --- /dev/null +++ b/lib/pages/user/login_webview.dart @@ -0,0 +1,58 @@ +import 'dart:convert'; +import 'dart:developer'; + +import 'package:flutter/material.dart'; +import 'package:vikunja_app/models/user.dart'; +import 'package:vikunja_app/api/client.dart'; +import 'package:webview_flutter/webview_flutter.dart'; + +class LoginWithWebView extends StatefulWidget { + String frontEndUrl; + + LoginWithWebView(this.frontEndUrl); + + @override + State createState() => LoginWithWebViewState(); +} + +class LoginWithWebViewState extends State { + + WebView webView; + WebViewController webViewController; + + @override + void initState() { + super.initState(); + webView = WebView( + initialUrl: widget.frontEndUrl, + javascriptMode: JavascriptMode.unrestricted, + onPageFinished: (value) => _handlePageFinished(value), + onWebViewCreated: (controller) => webViewController = controller, + ); + } + + @override + Widget build(BuildContext context) { + return Scaffold( + appBar: AppBar(), + body: webView + ); + } + + void _handlePageFinished(String value) { + log("handlePageFinished"); + if(webView != null) + webViewController.runJavascriptReturningResult("JSON.stringify(localStorage);").then((value) { + if(value != "null") { + value = value.replaceAll("\\", ""); + value = value.substring(1,value.length-1); + var json = jsonDecode(value); + if (json["API_URL"] != null && json["token"] != null) { + Client client = Client(json["token"], json["API_URL"]); + Navigator.pop(context, client); + } + } + }); + } + +} \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 3c6b890..08b7621 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -23,6 +23,7 @@ dependencies: json_serializable: 6.1.6 petitparser: 4.1.0 provider: 6.0.0 + webview_flutter: 3.0.2 dev_dependencies: flutter_test: