implemented login by webview of frontend

This commit is contained in:
benimautner 2022-04-28 16:59:41 +02:00
parent 8681a3267e
commit 32cdfea6d0
5 changed files with 94 additions and 2 deletions

View File

@ -17,7 +17,8 @@
FlutterApplication and put your custom class here. -->
<application
android:label="Vikunja"
android:icon="@mipmap/ic_launcher">
android:icon="@mipmap/ic_launcher"
android:usesCleartextTraffic="true">
<activity
android:name=".MainActivity"
android:launchMode="singleTop"

View File

@ -13,6 +13,7 @@ class Client {
bool authenticated;
String get base => _base;
String get token => _token;
Client(this._token, String base, {this.authenticated = true})
: _base = base.endsWith('/api/v1') ? base : '$base/api/v1';

View File

@ -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<LoginPage> {
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<LoginPage> {
});
}
}
_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);
}
}

View File

@ -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<StatefulWidget> createState() => LoginWithWebViewState();
}
class LoginWithWebViewState extends State<LoginWithWebView> {
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);
}
}
});
}
}

View File

@ -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: