exchangeCodeForSession method

Future<AuthSessionUrlResponse> exchangeCodeForSession(
  1. String authCode
)

Verifies the PKCE code verifier and retrieves a session.

Implementation

Future<AuthSessionUrlResponse> exchangeCodeForSession(String authCode) async {
  assert(
    _asyncStorage != null,
    'You need to provide asyncStorage to perform pkce flow.',
  );

  final codeVerifierRawString = await _asyncStorage!.getItem(
    key: '${Constants.defaultStorageKey}-code-verifier',
  );
  if (codeVerifierRawString == null) {
    throw AuthException('Code verifier could not be found in local storage.');
  }
  final codeVerifier = codeVerifierRawString.split('/').first;
  final eventName = codeVerifierRawString.split('/').last;
  final redirectType = AuthChangeEventExtended.fromString(eventName);

  final Map<String, dynamic> response = await _fetch.request(
    '$_url/token',
    RequestMethodType.post,
    options: GotrueRequestOptions(
      headers: _headers,
      body: {'auth_code': authCode, 'code_verifier': codeVerifier},
      query: {'grant_type': 'pkce'},
    ),
  );

  await _asyncStorage.removeItem(
    key: '${Constants.defaultStorageKey}-code-verifier',
  );

  final authSessionUrlResponse = AuthSessionUrlResponse(
    session: Session.fromJson(response)!,
    redirectType: redirectType?.name,
  );

  final session = authSessionUrlResponse.session;
  _saveSession(session);
  if (redirectType == AuthChangeEvent.passwordRecovery) {
    notifyAllSubscribers(AuthChangeEvent.passwordRecovery);
  } else {
    notifyAllSubscribers(AuthChangeEvent.signedIn);
  }

  return authSessionUrlResponse;
}