You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Android client stuck on "Waiting for browser" after successful Login Flow v2 approval (Android 16) #16323
Install the latest stable Nextcloud Android app from Google Play.
Launch the app and log in successfully to one Nextcloud account.
In the app, choose "Add account" to add a second account.
Enter the Nextcloud server URL.
Continue with the browser-based login (Login Flow v2).
Approve the login in the browser (on-device or on a PC browser).
Browser displays "Account connected".
Switch back to the Android Nextcloud app.
The app remains indefinitely on "Waiting for browser".
Expected behaviour
After approving Login Flow v2 in the browser, the Android app should:
Poll the /login/v2/poll endpoint
Retrieve the generated credentials (app password)
Complete account setup automatically
Actual behaviour
The browser login completes successfully and displays "Account connected".
However, the Android app remains indefinitely on "Waiting for browser" and never completes login.
This occurs for:
Normal browser login
Login approval performed on a PC browser
Login attempted using a device/app password
The app appears to wait for a browser callback that never occurs, and does not proceed after successful server-side flow completion.
I’m running into a persistent authentication problem with the Nextcloud Android client and hope someone here has seen this before.
Setup:
Nextcloud Server: version 32.0.5 (upgraded from a previous installation; new instance)
Android Nextcloud app: 3.35.2
Same domain name as before, but new Nextcloud installation and new user accounts
Windows desktop client works without any issues
Problem:
After setting up the new Nextcloud instance under the same domain, I can log in via the web interface and via the Windows client without problems.
On Android (both phone and tablet), authentication does not complete:
The app redirects me to the browser
The browser login is successful (“access granted”)
After returning to the app, it asks again to grant access
After that, the Android client spins indefinitely
No successful authentication ever happens
This happens:
with the normal admin/user password
with newly generated app passwords
So far, the Android client never finishes authentication, even though the browser confirms success.
Question:
Has anyone experienced a similar issue after reinstalling Nextcloud under the same domain?
Is there a known fix or workaround to get the Android client (which previously worked fine on phone and tablet) working again?
Update from my side, like @rechner I'm running GrapheneOS. I successfully logged in by temporarily activating Exploit protection compatibility mode with an app key. Once logged I disabled the setting and the app still works.
same issue here, I can't login anymore to nextcloud app and thus can't use some other apps that requires nextcloud to be logged in. QA apk does not exist (http 404), so it's not possible to provide debug logs. Tried on v 34.0.1, 34.1.0, as well as dev 20260803, on all version app hungs on "finish login process in browser".
While trying with QR code (I have 2FA enabled), after scanning QR, app is immediately being closed and login process starts from scratch, even though in nextcloud server -> security -> sessions I see that all retries have created new tokens (both via QR and flow login).
@alperozturk96
Now it does not stuck on "please finish", but keeps asking for new grants in endless loop
08-06 10:13:07.431 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onCreate (recreated=false)
08-06 10:13:07.598 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:13:07.614 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:13:10.333 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:13:18.004 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:13:18.645 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:13:18.650 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:13:18.697 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:13:44.133 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:13:44.148 26974 26974 D AuthenticatorActivity: LoginFlowV2 | credentials polled successfully, continuing with account setup
08-06 10:13:44.160 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Browser returned via Auth Tab (resultCode=0, hasUri=false)
08-06 10:13:44.585 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:13:44.841 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:13:44.843 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:13:44.876 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:13:52.879 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:13:52.888 26974 26974 D AuthenticatorActivity: LoginFlowV2 | credentials polled successfully, continuing with account setup
08-06 10:13:52.904 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Browser returned via Auth Tab (resultCode=0, hasUri=false)
08-06 10:13:53.336 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:13:53.537 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:13:53.539 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:13:53.563 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:14:00.562 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:14:00.569 26974 26974 D AuthenticatorActivity: LoginFlowV2 | credentials polled successfully, continuing with account setup
08-06 10:14:00.582 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Browser returned via Auth Tab (resultCode=0, hasUri=false)
08-06 10:14:00.956 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:14:01.166 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:14:01.168 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:14:01.195 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:16:05.180 26974 26974 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:16:05.195 26974 26974 D AuthenticatorActivity: LoginFlowV2 | credentials polled successfully, continuing with account setup
but I also grep "AuthenticatorActivity:", and there might be one additional, interesting line. After successfully polling credentials, app return "Access failed: Operation finished with HTTP status code 200 (fail)"
$ ./adb logcat | grep "AuthenticatorActivity:"
08-06 10:19:44.319 31075 31075 D AuthenticatorActivity: onCreate(Bundle) starting
08-06 10:19:44.320 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onCreate (recreated=false)
08-06 10:19:44.482 31075 31075 D AuthenticatorActivity: onStart() starting
08-06 10:19:44.482 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:19:44.484 31075 31075 D AuthenticatorActivity: onResume() starting
08-06 10:19:44.499 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:19:44.499 31075 31075 D AuthenticatorActivity: onPause() ending
08-06 10:19:45.321 31075 31075 D AuthenticatorActivity: onStop() ending
08-06 10:19:45.324 31075 31075 D AuthenticatorActivity: onSaveInstanceState(Bundle) starting
08-06 10:19:48.702 31075 31075 D AuthenticatorActivity: onStart() starting
08-06 10:19:48.703 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:19:48.706 31075 31075 D AuthenticatorActivity: onResume() starting
08-06 10:19:56.526 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:19:57.274 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:19:57.279 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:19:57.324 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:19:57.324 31075 31075 D AuthenticatorActivity: onPause() ending
08-06 10:19:58.106 31075 31075 D AuthenticatorActivity: onStop() ending
08-06 10:19:58.110 31075 31075 D AuthenticatorActivity: onSaveInstanceState(Bundle) starting
08-06 10:20:05.510 31075 31075 D AuthenticatorActivity: onStart() starting
08-06 10:20:05.511 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onStart
08-06 10:20:05.519 31075 31075 D AuthenticatorActivity: LoginFlowV2 | credentials polled successfully, continuing with account setup
08-06 10:20:05.533 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Browser returned via Auth Tab (resultCode=0, hasUri=false)
08-06 10:20:05.534 31075 31075 D AuthenticatorActivity: onResume() starting
08-06 10:20:06.079 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 1: POST /login/v2 -> https://example.com/index.php/login/v2
08-06 10:20:06.081 31075 31075 D AuthenticatorActivity: Access failed: Operation finished with HTTP status code 200 (fail)
08-06 10:20:06.261 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 4: 'Waiting for browser' UI shown
08-06 10:20:06.262 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Step 5: launching browser via Auth Tab (scheme=nc)
08-06 10:20:06.280 31075 31075 D AuthenticatorActivity: LoginFlowV2 | Lifecycle onPause
08-06 10:20:06.280 31075 31075 D AuthenticatorActivity: onPause() ending
08-06 10:20:06.971 31075 31075 D AuthenticatorActivity: onStop() ending
08-06 10:20:06.975 31075 31075 D AuthenticatorActivity: onSaveInstanceState(Bundle) starting
I think I found the issue. I dig up a little bit, and finally I managed to create account (only in QA app, fix will not work in prod version of app so the changes from QA needs to be applied to prod as well. Seems that issue, why app gets "Access failed" in QA app is, that app send following request to server
Thus to finish adding account succesfully, workaround was to force adding that header on server side (lighttpd in my case), although most likely it should be better to set header directly in app.
@alperozturk96 With header removed from lighttpd config, that new QA version still loops asking for permissions with "Access failed: Operation finished with HTTP status code 200 (fail)", log is the same as previously
edit. claude says, that instead of getMethod.addRequestHeader(CONTENT_TYPE, JSON_UTF8_ENCODED) there should be getMethod.addRequestHeader(ACCEPT, JSON_UTF8_ENCODED). Content_type determines the data type you want to send, and accept determines data type you expect to get, and that is the culprit of problem, to say to server that app expects data in json format.
Had the same problem. I was using Firefox then tried switching to Chrome and it logged me in smoothly! Edge works too. weird!
Do you remember, what was the default web browser when you are using Firefox? Android System WebView or Firefox? Also could you please share OS and device details?
Had the same problem. I was using Firefox then tried switching to Chrome and it logged me in smoothly! Edge works too. weird!
Do you remember, what was the default web browser when you are using Firefox? Android System WebView or Firefox? Also could you please share OS and device details?
It was a Firefox window not android system Webview.
I am experiencing a very similar issue with Nextcloud Talk for Android, which may be related to the same browser-to-app callback/Login Flow problem described here.
My setup:
Motorola Moto G82 5G
Android 13
Nextcloud Talk 25.0.0
Nextcloud Android app is already installed and successfully connected to the same Nextcloud instance
Google Play Services: not available
UnifiedPush / Sunup 1.4.1
Brave or Chrome Brower
When I try to connect the Talk app to my existing Nextcloud instance, both non-QR login methods fail:
1. Login using server URL, username and password
I enter the server address and credentials in Talk.
The browser opens for verification.
Authentication completes successfully.
The browser shows: "Verification successful. You can now close this window and return to the app."
I return to the Talk app.
Talk is back at the login screen again.
This results in an endless login loop.
2. Importing the already verified Nextcloud account
The Nextcloud Android app is already connected and verified successfully on the same device.
However, importing/using this existing account in Talk results in the same behaviour.
After successful browser verification, Talk returns to the login screen instead of completing the account setup.
Interestingly, QR code login works without any problems. If I display the QR code on my PC and scan it with the Talk app, the Talk account is connected successfully.
This makes me suspect that the actual authentication is working, but the result of the browser-based Login Flow is not being handed back to the Talk app correctly.
The fact that:
browser authentication succeeds,
the existing Nextcloud account is already working on the device,
QR-code login works,
but both browser-based login methods end up back at the login screen
seems particularly relevant to the issue described here.
Could this be the same underlying browser → Android app callback/Login Flow problem, or could the Talk Android app be affected by the same issue?
I would be happy to provide additional logs or other debugging information if needed.
I am seeing this issue with a newly deployed server in podman through an npm proxy. Creating an app password and scanning the QR code works correctly as a work around
Activity
abditus-tect commentedon Jan 29, 2026
Hello everyone,
I’m running into a persistent authentication problem with the Nextcloud Android client and hope someone here has seen this before.
Setup:
Nextcloud Server: version 32.0.5 (upgraded from a previous installation; new instance)
Android Nextcloud app: 3.35.2
Same domain name as before, but new Nextcloud installation and new user accounts
Windows desktop client works without any issues
Problem:
After setting up the new Nextcloud instance under the same domain, I can log in via the web interface and via the Windows client without problems.
On Android (both phone and tablet), authentication does not complete:
The app redirects me to the browser
The browser login is successful (“access granted”)
After returning to the app, it asks again to grant access
After that, the Android client spins indefinitely
No successful authentication ever happens
This happens:
with the normal admin/user password
with newly generated app passwords
So far, the Android client never finishes authentication, even though the browser confirms success.
Question:
Has anyone experienced a similar issue after reinstalling Nextcloud under the same domain?
Is there a known fix or workaround to get the Android client (which previously worked fine on phone and tablet) working again?
Any hints would be appreciated.
Thank you.
Lion62 commentedon Jan 30, 2026
Same issue here
rechner commentedon Mar 14, 2026
Also seeing this issue, v33.0.0 app with Nextcloud 33.0.0 on Pixel 10 with GrapheneOS Android 16, installed from F-droid.
jberggg commentedon Apr 23, 2026
For me, regular login flow (with Openid) and QR code login (app password) doesn't work. I'm using version 33.1.0 of the app.
jberggg commentedon May 27, 2026
Update from my side, like @rechner I'm running GrapheneOS. I successfully logged in by temporarily activating
Exploit protection compatibility modewith an app key. Once logged I disabled the setting and the app still works.alperozturk96 commentedon Jul 21, 2026
@thereisnotime Hey,
We couldn't able to reproduce this issue. Could you please install the QA APK once it's generated and share the logs?
#17360
You can extract the logs via following adb command:
adb logcat | grep LoginFlowV2adi2k5 commentedon Aug 5, 2026
same issue here, I can't login anymore to nextcloud app and thus can't use some other apps that requires nextcloud to be logged in. QA apk does not exist (http 404), so it's not possible to provide debug logs. Tried on v 34.0.1, 34.1.0, as well as dev 20260803, on all version app hungs on "finish login process in browser".
While trying with QR code (I have 2FA enabled), after scanning QR, app is immediately being closed and login process starts from scratch, even though in nextcloud server -> security -> sessions I see that all retries have created new tokens (both via QR and flow login).
alperozturk96 commentedon Aug 5, 2026
@adi2k5 I updated the PR. It will generate QA APK.
adi2k5 commentedon Aug 5, 2026
Here's the log from QA app:
The flow was following:
alperozturk96 commentedon Aug 6, 2026
@adi2k5 Thank you for the report. I updated the PR.
Could you please test again with last generated QA APK?
#17360
adi2k5 commentedon Aug 6, 2026
@alperozturk96
Now it does not stuck on "please finish", but keeps asking for new grants in endless loop
but I also grep "AuthenticatorActivity:", and there might be one additional, interesting line. After successfully polling credentials, app return "Access failed: Operation finished with HTTP status code 200 (fail)"
adi2k5 commentedon Aug 6, 2026
I think I found the issue. I dig up a little bit, and finally I managed to create account (only in QA app, fix will not work in prod version of app so the changes from QA needs to be applied to prod as well. Seems that issue, why app gets "Access failed" in QA app is, that app send following request to server
and it expects answer in json format, but ocs send xml instead, as app does not explicitely set up Accept: application/json header for OCS requests.
This can be confirmed with following requests (https://docs.nextcloud.com/server/stable/developer_manual/client_apis/OCS/ocs-api-overview.html#testing-requests-with-curl)
Thus to finish adding account succesfully, workaround was to force adding that header on server side (lighttpd in my case), although most likely it should be better to set header directly in app.
That finally solved the issue and QA app was able to finish adding account.
alperozturk96 commentedon Aug 6, 2026
@adi2k5 I updated the PR again and add the "content-type" header to the
GetUserInfoRemoteOperation.Could you please try again?
#17360
adi2k5 commentedon Aug 6, 2026
@alperozturk96 With header removed from lighttpd config, that new QA version still loops asking for permissions with "Access failed: Operation finished with HTTP status code 200 (fail)", log is the same as previously
edit. claude says, that instead of getMethod.addRequestHeader(CONTENT_TYPE, JSON_UTF8_ENCODED) there should be getMethod.addRequestHeader(ACCEPT, JSON_UTF8_ENCODED). Content_type determines the data type you want to send, and accept determines data type you expect to get, and that is the culprit of problem, to say to server that app expects data in json format.
alperozturk96 commentedon Aug 10, 2026
@adi2k5 is it possible to share test account thus we can try?
mahfujarr commentedon Sep 8, 2026
Had the same problem. I was using Firefox then tried switching to Chrome and it logged me in smoothly! Edge works too. weird!
alperozturk96 commentedon Sep 8, 2026
Do you remember, what was the default web browser when you are using Firefox? Android System WebView or Firefox? Also could you please share OS and device details?
mahfujarr commentedon Sep 8, 2026
It was a Firefox window not android system Webview.
Device Details
Manufacturer: realme
Model: realme P4 5G (RMX5110)
Product: RMX5110IN
Board: RM6878
SoC: MediaTek Dimensity 7400 (MT6878T)
CPU: 4× Cortex-A78 @ 2.6 GHz + 4× Cortex-A55 @ 2.0 GHz
CPU architecture: arm64-v8a
Process: 4 nm
RAM: 8 GB (7457 MB reported)
Android version: 16
API level: 36
Build: RMX5110_16.0.5.1200(EX01)
Build ID: BP2A.250605.015
Security patch: 2026-08-01
Kernel: 6.1.157-android14-11-o-g27a80b5f4580
Rooted: No
Build type: user / release-keys
ART: 2.1.0
Java runtime: Android Runtime 0.9
ABI: arm64-v8a
manafx2025 commentedon Sep 18, 2026
I am experiencing a very similar issue with Nextcloud Talk for Android, which may be related to the same browser-to-app callback/Login Flow problem described here.
My setup:
When I try to connect the Talk app to my existing Nextcloud instance, both non-QR login methods fail:
1. Login using server URL, username and password
I enter the server address and credentials in Talk.
The browser opens for verification.
Authentication completes successfully.
The browser shows: "Verification successful. You can now close this window and return to the app."
I return to the Talk app.
Talk is back at the login screen again.
This results in an endless login loop.
2. Importing the already verified Nextcloud account
The Nextcloud Android app is already connected and verified successfully on the same device.
However, importing/using this existing account in Talk results in the same behaviour.
After successful browser verification, Talk returns to the login screen instead of completing the account setup.
Interestingly, QR code login works without any problems. If I display the QR code on my PC and scan it with the Talk app, the Talk account is connected successfully.
This makes me suspect that the actual authentication is working, but the result of the browser-based Login Flow is not being handed back to the Talk app correctly.
The fact that:
browser authentication succeeds,
the existing Nextcloud account is already working on the device,
QR-code login works,
but both browser-based login methods end up back at the login screen
seems particularly relevant to the issue described here.
Could this be the same underlying browser → Android app callback/Login Flow problem, or could the Talk Android app be affected by the same issue?
I would be happy to provide additional logs or other debugging information if needed.
mmcnutt commentedon Oct 10, 2026
I am seeing this issue with a newly deployed server in podman through an npm proxy. Creating an app password and scanning the QR code works correctly as a work around
alperozturk96 commentedon Oct 14, 2026
Hey,
Could you please install the QA APK and share the logs so that we can investigate and, if possible, identify the root cause of the issue?
#17824