diff --git a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt index 4c376dfc..bb96e554 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/plugins/AbsDatabase.kt @@ -126,8 +126,8 @@ class AbsDatabase : Plugin() { val userId = serverConfigPayload.userId val username = serverConfigPayload.username val serverVersion = serverConfigPayload.version - val accessToken = serverConfigPayload.token // New token - val refreshToken = serverConfigPayload.refreshToken // Refresh only sent on first connection + val accessToken = serverConfigPayload.token + val refreshToken = serverConfigPayload.refreshToken // Refresh only sent after login or refresh GlobalScope.launch(Dispatchers.IO) { if (serverConnectionConfig == null) { // New Server Connection diff --git a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt index c45a7e5a..c4caccb4 100644 --- a/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt +++ b/android/app/src/main/java/com/audiobookshelf/app/server/ApiHandler.kt @@ -404,7 +404,14 @@ class ApiHandler(var ctx:Context) { errorObj.put("error", "Authentication failed - please login again") callback(errorObj) - // TODO: Notify webview frontend + if (checkAbsDatabaseNotifyListenersInitted()) { + val tokenJsObject = JSObject() + tokenJsObject.put("error", "Token refresh failed") + absDatabaseNotifyListeners("onTokenRefreshFailure", tokenJsObject) + } else { + // Can happen if Webview is never run + Log.i(tag, "AbsDatabaseNotifyListeners is not initialized so cannot send token refresh failure notification") + } } catch (e: Exception) { Log.e(tag, "handleRefreshFailure: Error during failure handling", e) val errorObj = JSObject() diff --git a/plugins/db.js b/plugins/db.js index 7b7740e1..f41be58f 100644 --- a/plugins/db.js +++ b/plugins/db.js @@ -131,4 +131,14 @@ export default ({ app, store }, inject) => { console.log('[db] onTokenRefresh', data) store.commit('user/setAccessToken', data.accessToken) }) + + // Listen for token refresh failure events from native app + AbsDatabase.addListener('onTokenRefreshFailure', async (data) => { + console.log('[db] onTokenRefreshFailure', data) + // Clear store and redirect to login page + await store.dispatch('user/logout') + if (window.location.pathname !== '/connect') { + window.location.href = '/connect' + } + }) } diff --git a/plugins/nativeHttp.js b/plugins/nativeHttp.js index 49d3f3f1..815fb219 100644 --- a/plugins/nativeHttp.js +++ b/plugins/nativeHttp.js @@ -204,7 +204,7 @@ export default function ({ store, $db }, inject) { try { console.log('[nativeHttp] Handling refresh failure - logging out user') - // Logout from server and clear store + // Clear store await store.dispatch('user/logout') if (serverConnectionConfigId) {