getSessionFromUrl method

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

Gets the session data from a oauth2 callback URL

Implementation

Future<GotrueSessionResponse> 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) {
    return GotrueSessionResponse(error: GotrueError(errorDescription));
  }

  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'];

  if (accessToken == null) {
    return GotrueSessionResponse(
      error: GotrueError('No access_token detected.'),
    );
  }
  if (expiresIn == null) {
    return GotrueSessionResponse(
      error: GotrueError('No expires_in detected.'),
    );
  }
  if (refreshToken == null) {
    return GotrueSessionResponse(
      error: GotrueError('No refresh_token detected.'),
    );
  }
  if (tokenType == null) {
    return GotrueSessionResponse(
      error: GotrueError('No token_type detected.'),
    );
  }

  final response = await api.getUser(accessToken);
  if (response.error != null) {
    return GotrueSessionResponse(error: response.error);
  }

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

  if (storeSession == true) {
    _saveSession(session);
    _notifyAllSubscribers(AuthChangeEvent.signedIn);
    final type = url.queryParameters['type'];
    if (type == 'recovery') {
      _notifyAllSubscribers(AuthChangeEvent.passwordRecovery);
    }
  }

  return GotrueSessionResponse(data: session);
}