getSessionFromUrl method

Future<AuthSessionUrlResponse> getSessionFromUrl(
  1. Uri originUrl, {
  2. bool storeSession = true,
})

Gets the session data from a magic link or oauth2 callback URL

Implementation

Future<AuthSessionUrlResponse> getSessionFromUrl(
  Uri originUrl, {
  bool storeSession = true,
}) async {
  var url = originUrl;
  if (originUrl.hasQuery) {
    final decoded = originUrl.toString().replaceAll('#', '&');
    url = Uri.parse(decoded);
  } else {
    final decoded = originUrl.toString().replaceAll('#', '?');
    url = Uri.parse(decoded);
  }

  final errorDescription = url.queryParameters['error_description'];
  if (errorDescription != null) {
    throw AuthException(errorDescription);
  }

  if (_flowType == AuthFlowType.pkce) {
    final authCode = originUrl.queryParameters['code'];
    if (authCode == null) {
      throw AuthPKCEGrantCodeExchangeError(
          'No code detected in query parameters.');
    }
    return await exchangeCodeForSession(authCode);
  }

  final accessToken = url.queryParameters['access_token'];
  final expiresIn = url.queryParameters['expires_in'];
  final refreshToken = url.queryParameters['refresh_token'];
  final tokenType = url.queryParameters['token_type'];
  final providerToken = url.queryParameters['provider_token'];
  final providerRefreshToken = url.queryParameters['provider_refresh_token'];

  if (accessToken == null) {
    throw AuthException('No access_token detected.');
  }
  if (expiresIn == null) {
    throw AuthException('No expires_in detected.');
  }
  if (refreshToken == null) {
    throw AuthException('No refresh_token detected.');
  }
  if (tokenType == null) {
    throw AuthException('No token_type detected.');
  }

  final user = (await getUser(accessToken)).user;
  if (user == null) {
    throw AuthException('No user found.');
  }

  final session = Session(
    providerToken: providerToken,
    providerRefreshToken: providerRefreshToken,
    accessToken: accessToken,
    expiresIn: int.parse(expiresIn),
    refreshToken: refreshToken,
    tokenType: tokenType,
    user: user,
  );

  final redirectType = url.queryParameters['type'];

  if (storeSession == true) {
    _saveSession(session);
    if (redirectType == 'recovery') {
      notifyAllSubscribers(AuthChangeEvent.passwordRecovery);
    } else {
      notifyAllSubscribers(AuthChangeEvent.signedIn);
    }
  }

  return AuthSessionUrlResponse(session: session, redirectType: redirectType);
}