在Firebase / OAuth设置中,Expo React Native的 Google登录因「访问被阻止:授权错误」而失败

移动开发 2026-07-09

我正在使用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页面参考
This image is from the oath, cloud.google

解决方案

根本原因与修复(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客户端配置与平台和构建类型相匹配

一旦所有环节对齐,流程就能稳定工作。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章