token method

Future<String> token()

Implementation

Future<String> token() async {
  int now = (DateTime.now().millisecondsSinceEpoch / 1000).round();

  if ((expiresV > now) && (tokenV != null)) {
    return tokenV!;
  }
  // grab token

  if (!storageLoadCompleted) {
    var e = await storage.read(key: "expires");
    print("loading token, expire = $e");
    if (e != null) {
      int exp = int.parse(e);
      if (exp > now) {
        // token is still valid (in theory)
        tokenV = await storage.read(key: "access_token");
        if (tokenV != null) {
          expiresV = exp;
          storageLoadCompleted = true;
          return tokenV!;
        }
      }
    }
  }

  // need a new token
  String? ref = await storage.read(key: "refresh_token");
  if ((ref == null) || (ref == "")) {
    // user is not logged in or we don't have a refresh_token, need to have user login again
    if (tokenV != "") {
      tokenV = "";
      expiresV = 0;
	      notifyListeners(); // change in state → not logged in anymore
    }
    throw new AtOnlineLoginException("no token available");
  }

  print("token expired, refreshing");

  // perform refresh
  var req = <String, dynamic>{
    "grant_type": "refresh_token",
    "client_id": appId,
    "refresh_token": ref,
  };
  var res = await this
      .req("OAuth2:token", method: "POST", body: req, skipDecode: true);

  print("got new token, storing");

  await storeToken(res);

  print("token stored");

  return res["access_token"].toString();
}