exchangeAccessToken method

  1. @override
Future<SocialSignInResultInterface> exchangeAccessToken(
  1. String authorizationCode
)
override

To exchange an authorization code for an access token

Implementation

@override
Future<SocialSignInResultInterface> exchangeAccessToken(
    String authorizationCode) async {
  try {
    final response = await http.post(
      Uri.parse(_accessTokenUrl),
      headers: {
        'Accept': 'application/json',
        'Content-Type': 'application/json',
      },
      body: jsonEncode({
        'client_id': clientId,
        'client_secret': clientSecret,
        'code': authorizationCode,
        'redirect_uri': redirectUrl,
      }),
    );

    if (response.statusCode == 200) {
      final body = jsonDecode(response.body) as Map<String, dynamic>;

      if (body.containsKey('access_token')) {
        // Get user data with the access token
        final userResponse = await http.get(
          Uri.parse(_userDataUrl),
          headers: {
            'Accept': 'application/json',
            'Authorization': 'token ${body['access_token']}',
          },
        );

        if (userResponse.statusCode == 200) {
          return GitHubSignInResult(
            SignInResultStatus.ok,
            accessToken: body['access_token'],
            state: stateCode,
          );
        }
      }
      throw handleResponseBodyFail(body);
    }
    throw handleUnSuccessCodeFail(response);
  } catch (e) {
    return GitHubSignInResult(
      SignInResultStatus.failed,
      errorMessage: e.toString(),
    );
  }
}