generate method Null safety
override
generate and persist the OAuth2 refresh token from a single use auth code
Implementation
@override
Future<Token> generate() async {
final OAuthClient oAuthClient = OAuthClient(dio);
final tokenFile = File('${Util.userHome}/.yt/.refreshToken.json');
final tokenFileExits = tokenFile.existsSync();
if (tokenFileExits && refresh) tokenFile.deleteSync();
final tokenStore = <String, dynamic>{};
String? refreshToken;
if (tokenFileExits) {
tokenStore.addAll(json.decode(tokenFile.readAsStringSync()));
}
if (tokenStore.containsKey(oauthCredentials.identifier)) {
refreshToken = tokenStore[oauthCredentials.identifier];
} else {
try {
final token = await oAuthClient.getToken({
'client_id': oauthCredentials.identifier,
'client_secret': oauthCredentials.secret,
'redirect_uri': 'urn:ietf:wg:oauth:2.0:oob',
'grant_type': 'authorization_code'
});
if (token.refreshToken == null) {
throw Exception('Could not retrieve the refresh token');
}
refreshToken = token.refreshToken!;
} on DioError catch (err) {
throw AuthorizationException(err.response.toString(), err);
}
tokenStore[oauthCredentials.identifier] = refreshToken;
tokenFile.writeAsStringSync(json.encode(tokenStore));
}
try {
final token = await oAuthClient.getToken({
'client_id': oauthCredentials.identifier,
'client_secret': oauthCredentials.secret,
'refresh_token': refreshToken,
'grant_type': 'refresh_token'
});
return token;
} on DioError catch (err) {
throw Exception(err.response?.data);
}
}