authorize static method

Future<FitbitCredentials?> authorize({
  1. required String clientID,
  2. required String clientSecret,
  3. required String redirectUri,
  4. required String callbackUrlScheme,
  5. List<FitbitAuthScope> scopeList = const [FitbitAuthScope.ACTIVITY, FitbitAuthScope.CARDIO_FITNESS, FitbitAuthScope.HEART_RATE, FitbitAuthScope.LOCATION, FitbitAuthScope.NUTRITION, FitbitAuthScope.OXYGEN_SATURATION, FitbitAuthScope.PROFILE, FitbitAuthScope.RESPIRATORY_RATE, FitbitAuthScope.SETTINGS, FitbitAuthScope.SLEEP, FitbitAuthScope.SOCIAL, FitbitAuthScope.TEMPERATURE],
  6. int expiresIn = 28800,
})

Method that implements the OAuth 2.0 protocol and gets the access and refresh tokens from Fitbit APIs.

Implementation

static Future<FitbitCredentials?> authorize(
    {required String clientID,
    required String clientSecret,
    required String redirectUri,
    required String callbackUrlScheme,
    List<FitbitAuthScope> scopeList = const [FitbitAuthScope.ACTIVITY, FitbitAuthScope.CARDIO_FITNESS, FitbitAuthScope.HEART_RATE, FitbitAuthScope.LOCATION, FitbitAuthScope.NUTRITION, FitbitAuthScope.OXYGEN_SATURATION, FitbitAuthScope.PROFILE, FitbitAuthScope.RESPIRATORY_RATE, FitbitAuthScope.SETTINGS, FitbitAuthScope.SLEEP, FitbitAuthScope.SOCIAL, FitbitAuthScope.TEMPERATURE],
    int expiresIn = 28800
      }) async {
  // Instantiate Dio and its Response
  Dio dio = Dio();
  Response response;

  FitbitCredentials? fitbitCredentials;

  // Generate the fitbit url
  final fitbitAuthorizeFormUrl = FitbitAuthAPIURL.authorizeForm(
      redirectUri: redirectUri, clientID: clientID, scopeList: scopeList, expiresIn: expiresIn);

  // Perform authentication
  try {
    final result = await FlutterWebAuth.authenticate(
        url: fitbitAuthorizeFormUrl.url,
        callbackUrlScheme: callbackUrlScheme);
    //Get the auth code
    final code = Uri.parse(result).queryParameters['code'];

    // Generate the fitbit url
    final fitbitAuthorizeUrl = FitbitAuthAPIURL.authorize(
        redirectUri: redirectUri,
        code: code,
        clientID: clientID,
        clientSecret: clientSecret);

    response = await dio.post(
      fitbitAuthorizeUrl.url,
      data: fitbitAuthorizeUrl.data,
      options: Options(
        contentType: Headers.formUrlEncodedContentType,
        headers: {
          'Authorization': fitbitAuthorizeUrl.authorizationHeader,
        },
      ),
    );

    // Debugging
    final logger = Logger();
    logger.i('$response');

    // Save authorization tokens

    final accessToken = response.data['access_token'] as String;
    final refreshToken = response.data['refresh_token'] as String;
    final userID = response.data['user_id'] as String;

    fitbitCredentials = FitbitCredentials(
        userID: userID,
        fitbitAccessToken: accessToken,
        fitbitRefreshToken: refreshToken);
  } catch (e) {
    print(e);
  } // catch

  return fitbitCredentials;
}