pollForToken method

Future<String?> pollForToken(
  1. String deviceCode,
  2. int interval,
  3. String clientId,
  4. String tokenUrl,
  5. String scope,
)

Implementation

Future<String?> pollForToken(
    String deviceCode, int interval, String clientId, String tokenUrl, String scope) async {
  while (true) {
    await Future.delayed(Duration(seconds: interval));

    final response = await http.post(
      Uri.parse(tokenUrl), // Replace with your provider's token URL
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
      },
      body: {
        'client_id': clientId,
        'grant_type': 'urn:ietf:params:oauth:grant-type:device_code',
        'device_code': deviceCode,
        'scope': scope
      },
    );

    if (response.statusCode == 200) {
      final tokenResponse = json.decode(response.body);
      print('Access token: ${tokenResponse['access_token']}');

      Preferences.prefs?.setString("RefreshToken", tokenResponse['refresh_token']);
      print('Refresh token: ${tokenResponse['refresh_token']}');

      return tokenResponse['access_token'];
    } else {
      final errorResponse = json.decode(response.body);
      if (errorResponse['error'] == 'authorization_pending') {
        print('Authorization pending...');
        continue;
      } else if (errorResponse['error'] == 'authorization_declined') {
        print('Authorization declined by user');
        break;
      } else if (errorResponse['error'] == 'expired_token') {
        print('Device code expired');
        break;
      } else {
        print('Unknown error: ${errorResponse['error']}');
        break;
      }
    }
  }

  return null;
}