Implement native web auth

This commit is contained in:
Igor Kulikov
2021-06-17 10:29:52 +03:00
parent 8b3a175ead
commit 33562eae89
12 changed files with 236 additions and 13 deletions

View File

@@ -1,8 +1,8 @@
import 'dart:convert';
import 'dart:typed_data';
import 'package:flutter_web_auth/flutter_web_auth.dart';
import 'package:thingsboard_app/constants/app_constants.dart';
import 'package:thingsboard_app/core/auth/web/tb_web_auth.dart';
import 'package:thingsboard_app/core/context/tb_context.dart';
import 'package:dart_jsonwebtoken/dart_jsonwebtoken.dart';
import 'package:crypto/crypto.dart';
@@ -49,9 +49,9 @@ class TbOAuth2Client {
params['pkg'] = pkgName;
params['appToken'] = appToken;
url = url.replace(queryParameters: params);
final result = await FlutterWebAuth.authenticate(
final result = await TbWebAuth.authenticate(
url: url.toString(),
callbackUrlScheme: ThingsboardAppConstants.thingsboardOAuth2CallbackUrlScheme);
callbackUrlScheme: ThingsboardAppConstants.thingsboardOAuth2CallbackUrlScheme, saveHistory: false);
final resultUri = Uri.parse(result);
final error = resultUri.queryParameters['error'];
if (error != null) {

View File

@@ -0,0 +1,40 @@
import 'dart:async';
import 'package:flutter/cupertino.dart';
import 'package:flutter/services.dart' show MethodChannel;
class _OnAppLifecycleResumeObserver extends WidgetsBindingObserver {
final Function onResumed;
_OnAppLifecycleResumeObserver(this.onResumed);
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
onResumed();
}
}
}
class TbWebAuth {
static const MethodChannel _channel = const MethodChannel('tb_web_auth');
static final _OnAppLifecycleResumeObserver _resumedObserver = _OnAppLifecycleResumeObserver(() {
_cleanUpDanglingCalls();
});
static Future<String> authenticate({required String url, required String callbackUrlScheme, bool? saveHistory}) async {
WidgetsBinding.instance?.removeObserver(_resumedObserver); // safety measure so we never add this observer twice
WidgetsBinding.instance?.addObserver(_resumedObserver);
return await _channel.invokeMethod('authenticate', <String, dynamic>{
'url': url,
'callbackUrlScheme': callbackUrlScheme,
'saveHistory': saveHistory,
}) as String;
}
static Future<void> _cleanUpDanglingCalls() async {
await _channel.invokeMethod('cleanUpDanglingCalls');
WidgetsBinding.instance?.removeObserver(_resumedObserver);
}
}