TypeError: Network request failed on sign up / sign in on Android
Bug report
- [x] I confirm this is a bug with Supabase, not with my own application.
- [x] I confirm I have searched the Docs, GitHub Discussions, and Discord.
Describe the bug
Signing in or up on Android emulator locally results in TypeError: Network request failed. This error only shows up on the Android emulator and not the iOS one
To Reproduce
Minimal reproducible example: https://github.com/maxwowo/sbrepro
Environment:
- Java:
openjdk 11.0.19 2023-04-18 LTS - Node:
v16.20.2
- Clone repo
supabase startyarn installyarn android- Click on either
Sign uporSign in
Expected behavior
Should sign up or sign in without error
Screenshots
https://github.com/supabase/supabase-js/assets/40416283/b85f24b7-3c1f-4f0a-ad56-484ce0fd4964
System information
- OS: macOS Sonoma 14.0
- Browser (if applies) N/A
- Version of supabase-js:
2.38.1 - Version of Node.js:
v16.20.2
Additional context
Add any other context about the problem here.
Started happening to me too once locally running supabase, since last year i changed nothing but only running supabase locally instead of having it hosted online and it keeps giving me network request failed aswell.
+1 on this. I also get the Network request failed on Android Emulator and additionally, the session is not available after login. No such issues with ios simulator
Here some debug logging from auth
export const supabase = createClient<Database>(config.supabaseUrl, config.supabaseAnonKey, {
auth: {
storage: AsyncStorage,
autoRefreshToken: true,
persistSession: true,
detectSessionInUrl: false,
debug: true
}
})
ERROR [TypeError: Network request failed]
LOG {"error": null, "isLoading": false, "session": null}
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.628Z #_autoRefreshTokenTick() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.630Z #_acquireLock begin 0
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.631Z #_acquireLock lock acquired for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.631Z #_useSession begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.631Z #__loadSession() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.632Z #getSession() session from storage null
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.633Z #__loadSession() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.634Z #_autoRefreshTokenTick() no session
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.634Z #_useSession end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.634Z #_autoRefreshTokenTick() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.634Z #_acquireLock lock released for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:27.635Z #_acquireLock end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.646Z #_autoRefreshTokenTick() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.647Z #_acquireLock begin 0
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.647Z #_acquireLock lock acquired for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.648Z #_useSession begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.648Z #__loadSession() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.650Z #getSession() session from storage null
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.650Z #__loadSession() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.651Z #_autoRefreshTokenTick() no session
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.653Z #_useSession end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.654Z #_autoRefreshTokenTick() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.654Z #_acquireLock lock released for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:46:57.655Z #_acquireLock end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.662Z #_autoRefreshTokenTick() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.663Z #_acquireLock begin 0
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.664Z #_acquireLock lock acquired for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.664Z #_useSession begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.664Z #__loadSession() begin
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.664Z #getSession() session from storage null
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #__loadSession() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #_autoRefreshTokenTick() no session
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #_useSession end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #_autoRefreshTokenTick() end
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #_acquireLock lock released for storage key sb-localhost-auth-token
LOG GoTrueClient@0 (2.56.0) 2023-10-19T12:47:27.665Z #_acquireLock end
Tried downgrading to "@supabase/supabase-js": "2.33.2" but the issue is still there. I wonder if it's related to Sonoma
Will make a PlayStore build to see if this is only local and report back
I've since then switched to developing with Supabase Cloud. No such problems whatsoever. Haven't exceeded the limits on the free tier either so far. Would suggest the same if you've been blocked by this for a while
I'm running into this on Android Emulator and iOS on Expo Go. Anyone get around this other than using Supabase Cloud?
My problem was in supabase api url - instead of default I replaced it with http://10.0.2.2:54321 as your emulator does not work with http://127.0.0.1:54321.
The reason is that 10.0.2.2 points to your actual machine instead of some loopback service.
@caseydierking try this and let me know if it works for you
@carodej Unfortunately it did not work. Out of curiosity, I wondered if it was because of an http/https issue. So I tunneled it through ngrok and it worked. That is not a great long term solution though.
@caseydierking this solved it for me:
- app.config.ts
extra: {
...
plugins: [
...
[
'expo-build-properties',
{
android: {
usesCleartextTraffic: true
}
}
]
],
EXPO_PUBLIC_SUPABASE_URL=http://192.168.1.110:54321
@atanaskanchev That worked. Thanks!
My problem was in supabase api url - instead of default I replaced it with
http://10.0.2.2:54321as your emulator does not work withhttp://127.0.0.1:54321.The reason is that 10.0.2.2 points to your actual machine instead of some loopback service.
@caseydierking try this and let me know if it works for you
This worked. Thank you!
changing the supabaseUrl from http://127.0.0.1:54321 to http://10.0.2.2:54321 worked for me.
How did you change your url?
changing the supabaseUrl from http://127.0.0.1:54321/ to http://10.0.2.2:54321/ worked for me.
I tried this, and the only thing that changed was I got the network error after 2 minutes of wait time.
But I got it working by tunneling it through Cloudflare, by which I got a HTTPS URL, not a permanent solution but fulfills the need for the moment.
cloudflared tunnel --url http://127.0.0.1:54321
Here's my solution:
import Constants from "expo-constants";
// Types on this are wrong. This exists, and `host` does not.
const origin = (
Constants?.expoConfig as unknown as { hostUri?: string }
)?.hostUri
?.split(":")
.shift();
if (!origin) throw new Error("Could not determine origin");
const supabaseUrl = `http://${origin}:54321`;
This is very similar to what is typically needed to connect to local Firebase projects.
As a sanity check, I'd recommend logging hostUri, and try going to hostUri:54323 in your phone's browser. That should show the Supabase dashboard.
FWIW, this should apply for both ios and android. This is JS issue, not a native issue
Changing the supabaseUrl from http://127.0.0.1:54321/ to http://10.0.2.2:54321/ fixed it for Android, but then iOS got the Network request failed error. So seems like you need to either use conditional logic that checks the platform, like Platform.select(...) and return the appropriate url, or read the expoConfig.hostUri as mentioned by @JacobJaffe.
I went with the expoConfig approach. Also, it looks like they fixed the types on that so no need for casting to unknown.
Here's my solution:
import Constants from "expo-constants"; // Types on this are wrong. This exists, and `host` does not. const origin = ( Constants?.expoConfig as unknown as { hostUri?: string } )?.hostUri ?.split(":") .shift(); if (!origin) throw new Error("Could not determine origin"); const supabaseUrl = `http://${origin}:54321`;This is very similar to what is typically needed to connect to local Firebase projects.
As a sanity check, I'd recommend logging
hostUri, and try going tohostUri:54323in your phone's browser. That should show the Supabase dashboard.FWIW, this should apply for both ios and android. This is JS issue, not a native issue
Thank you! This worked 🔥