token method
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();
}