diff --git a/packages/gotrue/lib/src/gotrue_client.dart b/packages/gotrue/lib/src/gotrue_client.dart index 44981749..39bc29a6 100644 --- a/packages/gotrue/lib/src/gotrue_client.dart +++ b/packages/gotrue/lib/src/gotrue_client.dart @@ -607,19 +607,16 @@ class GoTrueClient { } /// Returns a new session, regardless of expiry status. - /// Takes in an optional current session. If not passed in, then refreshSession() will attempt to retrieve it from getSession(). - /// If the current session's refresh token is invalid, an error will be thrown. + /// Takes in an optional [refreshToken]. If not provided, then refreshSession() will attempt to retrieve it from the current session. + /// If no refresh token is available (neither provided nor in current session), an error will be thrown. Future refreshSession([String? refreshToken]) async { - if (currentSession?.accessToken == null) { - _log.warning("Can't refresh session, no current session found."); - throw AuthSessionMissingException(); - } _log.info('Refresh session'); final currentSessionRefreshToken = refreshToken ?? _currentSession?.refreshToken; if (currentSessionRefreshToken == null) { + _log.warning("Can't refresh session, no refresh token found."); throw AuthSessionMissingException(); } diff --git a/packages/gotrue/test/client_test.dart b/packages/gotrue/test/client_test.dart index a1abc8b4..a6c0e1d9 100644 --- a/packages/gotrue/test/client_test.dart +++ b/packages/gotrue/test/client_test.dart @@ -291,6 +291,30 @@ void main() { } }); + test('Refresh session with refreshToken when no current session exists', + () async { + await client.signInWithPassword(email: email1, password: password); + + final refreshToken = client.currentSession?.refreshToken ?? ''; + expect(refreshToken, isNotEmpty); + + final newClient = GoTrueClient( + url: gotrueUrl, + headers: { + 'apikey': anonToken, + }, + ); + + expect(newClient.currentSession, isNull); + + // This should work even though there's no current session, + // because we're providing a refreshToken parameter + final response = await newClient.refreshSession(refreshToken); + expect(response.session, isNotNull); + expect(response.session?.accessToken, isNotEmpty); + expect(newClient.currentSession?.accessToken, isNotEmpty); + }); + test('Update user', () async { await client.signInWithPassword(email: email1, password: password);