loginWithOidc static method

Future<LoginSession> loginWithOidc({
  1. required OidcProviderType type,
  2. required String authorizationUrl,
})

Implementation

static Future<LoginSession> loginWithOidc({
  required OidcProviderType type,
  required String authorizationUrl,
}) async {
  // validate redirect url
  if (_redirectUrl.isEmpty) {
    throw Exception("redirect url is empty");
  } else if ((kIsWeb && Uri.tryParse(_redirectUrl) == null)) {
    throw Exception("redirect url is invalid");
  }
  await HeraExtenstion.redirect(Uri.parse(authorizationUrl));
  if (kIsWeb) {
    return LoginSession()..loginStatus = LoginStatus.NOT_AUTHENTICATED;
  }
  final Completer<Uri> completer = Completer<Uri>();
  _sub = linkStream.listen((String? uri) async {
    if (uri.toString().startsWith(_redirectUrl)) {
      if (Platform.isIOS || Platform.isAndroid || Platform.isFuchsia) {
        await closeInAppWebView();
      }
      completer.complete(Uri.parse(uri!));
    }
  });
  Uri responseUrl = await completer.future;
  _sub?.cancel();
  HeraRequest req = HeraRequest()..namespace = _namespace;
  req.oidcProvider = OidcProvider()..type = type;
  String? accessToken = responseUrl.queryParameters["access_token"];
  String? refreshToken = responseUrl.queryParameters["access_token"];
  String? userId = responseUrl.queryParameters["user_id"];
  if ((accessToken ?? "") == "" || (refreshToken ?? "") == "") {
    throw Exception(
        "user id, access or refresh token is null. Contact info@nuntio.io");
  }
  if (userId == "") {
    throw Exception("user is null. Contact info@nuntio.io");
  }
  var response = await _heraClient
      .get(HeraRequest(authToken: AuthToken(userToken: accessToken)));
  _setCurrentUser(response.user);
  _setAccessToken(accessToken!);
  _setRefreshToken(refreshToken!);
  onAuthenticated();
  return LoginSession()..loginStatus = LoginStatus.AUTHENTICATED;
}