android icon indicating copy to clipboard operation
android copied to clipboard

How to use with Cloudflared + Zero Trust?

Open fl0om opened this issue 9 months ago • 4 comments

I'm running gotify on my local network and I want to be able to get notifications when not at home. I've tried setting up a cloudflared tunnel using Cloudflare Zero Trust using a custom hostname: https://gotify.mydomain.com - but it seems gotify can not access the hostname. If I go to a browser to access the same hostname I can authenticate and access gotify. Is it possible to access gotify using Cloudflared and Zero Trust?

fl0om avatar Apr 10 '25 07:04 fl0om

Please provide the logs of both gotify/server and gotify/android after trying to connect.

jmattheis avatar Apr 10 '25 10:04 jmattheis

Logs from android:

2025-04-10 13:21:58.473 INFO: Entering LogsActivitySee https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1754) at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1550) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:676) at com.google.gson.stream.JsonReader.peek(JsonReader.java:507) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:500) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:246) at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:156) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012)2025-04-10 13:21:56.987 ERROR: Error while api call: com.github.gotify.api.ApiException: Request failed. at com.github.gotify.api.Callback$RetrofitCallback.onFailure(Callback.kt:40) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onFailure$1$retrofit2-DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:96) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:222) at android.os.Looper.loop(Looper.java:314) at android.app.ActivityThread.main(ActivityThread.java:8716) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 1 column 1 path $2025-04-10 13:20:25.917 INFO: Entering LogsActivitySee https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1754) at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1550) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:676) at com.google.gson.stream.JsonReader.peek(JsonReader.java:507) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:500) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:246) at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:156) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012)2025-04-10 13:19:26.374 ERROR: Error while api call: com.github.gotify.api.ApiException: Request failed. at com.github.gotify.api.Callback$RetrofitCallback.onFailure(Callback.kt:40) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onFailure$1$retrofit2-DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:96) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:222) at android.os.Looper.loop(Looper.java:314) at android.app.ActivityThread.main(ActivityThread.java:8716) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 1 column 1 path $See https://github.com/google/gson/blob/main/Troubleshooting.md#malformed-json at com.google.gson.stream.JsonReader.syntaxError(JsonReader.java:1754) at com.google.gson.stream.JsonReader.checkLenient(JsonReader.java:1550) at com.google.gson.stream.JsonReader.doPeek(JsonReader.java:676) at com.google.gson.stream.JsonReader.peek(JsonReader.java:507) at com.google.gson.internal.bind.ReflectiveTypeAdapterFactory$Adapter.read(ReflectiveTypeAdapterFactory.java:500) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:39) at retrofit2.converter.gson.GsonResponseBodyConverter.convert(GsonResponseBodyConverter.java:27) at retrofit2.OkHttpCall.parseResponse(OkHttpCall.java:246) at retrofit2.OkHttpCall$1.onResponse(OkHttpCall.java:156) at okhttp3.internal.connection.RealCall$AsyncCall.run(RealCall.kt:519) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:644) at java.lang.Thread.run(Thread.java:1012)2025-04-10 13:19:20.880 ERROR: Error while api call: com.github.gotify.api.ApiException: Request failed. at com.github.gotify.api.Callback$RetrofitCallback.onFailure(Callback.kt:40) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1.lambda$onFailure$1$retrofit2-DefaultCallAdapterFactory$ExecutorCallbackCall$1(DefaultCallAdapterFactory.java:96) at retrofit2.DefaultCallAdapterFactory$ExecutorCallbackCall$1$$ExternalSyntheticLambda1.run(D8$$SyntheticClass:0) at android.os.Handler.handleCallback(Handler.java:958) at android.os.Handler.dispatchMessage(Handler.java:99) at android.os.Looper.loopOnce(Looper.java:222) at android.os.Looper.loop(Looper.java:314) at android.app.ActivityThread.main(ActivityThread.java:8716) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:565) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1081)Caused by: com.google.gson.stream.MalformedJsonException: Use JsonReader.setStrictness(Strictness.LENIENT) to accept malformed JSON at line 1 column 1 path $2025-04-10

Image

No relevant logs from server as it doesn't get accessed.

My guess is that Cloudflare gives the Zero Trust loginscreen to gotify. Not sure if there is a way to handle this in gotify.

fl0om avatar Apr 10 '25 11:04 fl0om

gotify/android doesn't support external login screens.

jmattheis avatar Apr 12 '25 12:04 jmattheis

Any way to support custom headers? It is possible in Cloudflare to use a service token, instead of a login, that can be feed through a custom header.

simmons777 avatar May 01 '25 18:05 simmons777