exchangeCode method

Future<OAuthTokens> exchangeCode({
  1. required String code,
  2. required String codeVerifier,
  3. required String state,
  4. String? redirectUri,
})

Exchange authorization code for tokens.

Implementation

Future<OAuthTokens> exchangeCode({
  required String code,
  required String codeVerifier,
  required String state,
  String? redirectUri,
}) async {
  final response = await _httpClient.post(
    Uri.parse(config.tokenUrl),
    headers: {'Content-Type': 'application/x-www-form-urlencoded'},
    body: {
      'grant_type': 'authorization_code',
      'code': code,
      'redirect_uri': redirectUri ?? config.redirectUrl,
      'client_id': config.clientId,
      'code_verifier': codeVerifier,
      'state': state,
    },
  );

  if (response.statusCode != 200) {
    throw OAuthException(
      'Token exchange failed (${response.statusCode}): ${response.body}',
    );
  }

  return _parseTokenResponse(response.body);
}