redirect_uri_mismatch. Error 10. DEVELOPER_ERROR. Google sign-in on mobile fails in ways that make no sense until you understand OAuth client types, SHA-1 fingerprints, and Play App Signing. Here is the mental model that makes all of it click.
Almost everyone who wires up Google sign-in on mobile hits the same wall: it works perfectly in the browser, then fails on a real Android device with a cryptic DEVELOPER_ERROR or Error 10, or on the web with redirect_uri_mismatch. The error messages are useless because the actual problem is conceptual — Google's OAuth setup assumes you understand client types, fingerprints, and signing keys, and nobody explains them in order.
This post gives you that mental model. Once you see how the pieces fit, every Google sign-in error becomes a quick diagnosis instead of an afternoon of guessing.
The first misconception: people create one OAuth client and try to use it everywhere. Google issues different client types, and each platform must use the right one.
Mixing these up is the root cause of most failures. A redirect URI belongs on the web client, not the Android one. A SHA-1 belongs on the Android client, not the web one.
On Android, Google does not trust a package name alone — anyone could claim it. It trusts the combination of your package name and the SHA-1 fingerprint of the certificate that signed the APK. If the fingerprint registered in Google Cloud does not match the one that signed the build on the device, you get DEVELOPER_ERROR and no further explanation.
The trap is that you have more than one signing key:
redirect_uri_mismatchmeans the exact callback URL your app sent does not appear in the web client's list of authorized redirect URIs. "Exact" is literal: scheme, host, port, path, and trailing slash all count. http vs https, localhost vs 127.0.0.1, and a stray slash are all enough to fail.
On Expo and other native frameworks that use a web-style flow, your redirect is often a custom scheme or a proxy URL. Whatever it is, it has to be registered verbatim. Log the redirect URI your app actually generates and paste that — do not type it from memory.
Two more things catch teams late:
None of this is your product. It is OAuth bookkeeping that every team rediscovers the hard way. Kembo hosts Google sign-in so the fingerprint and redirect dance happens once, on our side, and verifies the resulting tokens correctly before handing you a clean signed-in user.
Google sign-in stops being mysterious once you hold one idea: the platform you are on determines the client type, the client type determines what identifies you (SHA-1 on Android, redirect URI on web, bundle ID on iOS), and the backend verifies against the right audience. Every error maps to one of those four things.
If you would rather not hold any of it in your head, start a free Kembo project and let the OAuth plumbing be ours. Next week: what happens after sign-in — sessions, refresh tokens, and secure storage.