在Firebase / OAuth设置中,Expo React Native的 Google登录因「访问被阻止:授权错误」而失败
我正在使用Expo(EAS / expo-auth-session)开发一款React Native应用,并使用Firebase Authentication。
邮箱/密码登录运行得很完美,但 Google登录在Google提示的“Access Blocked: Authorization Error”屏幕时失败。
❗ 问题
当我触发Google登录时,认证流程会打开,但会立刻失败,显示如下:
Access Blocked: Authorization Error
Error: unauthorized_client / blocked request (varies)
应用从未进入Firebase认证成功的阶段。
当前设置(简化)
import * as Google from 'expo-auth-session/providers/google';
const [request, response, promptAsync] = Google.useAuthRequest({
clientId: WEB_CLIENT_ID,
scopes: ['profile', 'email'],
});
const WEB_CLIENT_ID = "xxxxx.apps.googleusercontent.com";
makeRedirectUri({ useProxy: true })
哪些可以工作
- Firebase邮箱/密码认证(所有功能均可用)
- 应用构建成功
- Firebase项目设置完成
- 后端集成
我已检查的内容
- Firebase已启用Google Sign-In
- 使用了网络客户端ID
- 已配置Expo重定向URI
- Firebase认证初始化正确
- 应用在Expo中可用且构建正常
在Firebase与 Expo配置方面,什么才是正确且对生产环境安全的Google Sign-In配置方式?
具体来说:
- 我应该使用Expo代理重定向还是原生重定向?
- 这个设置需要Android SHA-1吗?
- 仅使用Web客户端ID足够,还是需要Android OAuth客户端?
- 在该流程中,通常是什么原因会导致“Access Blocked: Authorization Error”?
如果有可用的Expo + Firebase Google Sign-In设置,欢迎提供一个干净、可直接参考的配置。
OAuth页面参考

解决方案
根本原因与修复(Expo + Firebase谷歌登录)
我在使用Expo(EAS)与Firebase Authentication开发的React Native应用中实现Google Sign-In时遇到了这个问题。起初看起来像是Firebase出错,但在仔细跟踪流程后,我发现其实从未进入Firebase。
问题
错误信息:
Access Blocked: Authorization Error / unauthorized_client
是在OAuth阶段、Firebase认证之前发生的。
Google账户选择器打开了,但重定向回应用的流程从未完成,因而:
response?.type === 'success'从未被触发- 未收到
idToken signInWithCredential()从未被调用
根本原因
问题的原因在于混用了两种不同的认证方式:
expo-auth-session(基于网页的OAuth流程,使用代理)@react-native-google-signin/google-signin(原生Google Sign-In)
这两种方式在一起使用时并不兼容。二者的不匹配会破坏重定向流程,导致Google因 unauthorized_client 阻挡请求。
附加问题(开发vs生产)
另一个重要因素是环境。
使用Expo Go或基于代理的认证(useProxy: true)时,Google OAuth可能失败,因为:
- Expo代理重定向URI在更严格的OAuth规则下并非完全受信任
- Firebase期望为原生流程配置正确的OAuth客户端
- 较新的Expo SDK更新降低了基于代理的认证在生产场景中的可靠性
这导致这样的情况:
- OAuth在 Google端完成
- 但应用从未收到响应
解决办法
解决方法是坚持使用一种认证方式并正确配置之。
选项1:Expo Auth Session(基于网页)
- 使用
expo-auth-session/providers/google - 使用Web Client ID
- 使用
makeRedirectUri({ useProxy: true }) - 在Google Cloud Console中配置重定向URI
这在测试时可用,但不推荐用于生产环境。
选项2:原生Google Sign-In(推荐)
- 使用
@react-native-google-signin/google-signin -
配置:
-
Android OAuth客户端
- 在Firebase / Google Cloud中配置SHA-1指纹
- 使用正确的
webClientId - 在此设置中不要使用Expo Auth Session
我做了哪些修改
- 移除了所有Expo Auth Session的逻辑
- 完全切换到原生Google Sign-In
- 正确配置OAuth客户端(包括SHA-1)
- 确保环境(Expo与 EAS构建)与认证设置相匹配
之后:
- 重定向正确工作
- 收到
idToken - Firebase
signInWithCredential()按预期工作
结论
如果没有到达Firebase,问题几乎总是在OAuth配置上,而不是Firebase本身。
要点如下:
- 不要混用基于网页的和原生Google Sign-In的方法
- 生产环境认证避免依赖Expo代理
- 确保OAuth客户端配置与平台和构建类型相匹配
一旦所有环节对齐,流程就能稳定工作。