Expo(EAS)集成Firebase谷歌登录报‘Access Blocked’错误及配置咨询
❗问题详情
使用**Expo(EAS / expo-auth-session)**结合Firebase Authentication开发React Native应用,邮箱/密码登录功能正常,但谷歌登录触发后立即失败,跳转至谷歌错误页面:
Access Blocked: Authorization Error
Error: unauthorized_client / blocked request(提示内容可能略有差异)
应用无法完成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邮箱/密码认证(全功能正常)
- EAS构建成功
- Firebase项目基础配置完成
- 后端集成无异常
已排查项
- Firebase控制台已启用谷歌登录方式
- 代码中使用了Web客户端ID
- 已配置Expo重定向URI
- Firebase认证初始化逻辑正确
- Expo开发环境及EAS构建后的应用其他功能正常
咨询问题
请提供Expo(EAS构建)与Firebase集成时,谷歌登录的生产环境标准配置方案,并解答以下具体问题:
- 应该使用Expo代理还是原生重定向?
- 该配置是否需要Android SHA-1指纹?
- 仅使用Web Client ID是否足够,还是必须创建Android OAuth客户端?
- 「Access Blocked: Authorization Error」错误的常见触发原因是什么?
同时希望提供一份可直接运行的Expo + Firebase谷歌登录参考代码配置。
OAuth配置页面参考截图:
解决方案
一、错误核心原因
「unauthorized_client / blocked request」的常见触发点:
- OAuth客户端未正确配置允许的重定向URI
- 生产环境使用了仅适用于开发的Expo代理,且未配置原生客户端
- 缺少对应平台(Android/iOS)的OAuth客户端及SHA-1指纹(Android)
二、生产环境标准配置方案
1. 平台客户端配置(必须)
- Android:
- 在Firebase控制台获取EAS构建生成的SHA-1指纹(不要用本地调试指纹)
- 在与Firebase绑定的Google Cloud Console中创建Android OAuth客户端ID,包名与Expo
app.json中的android.package一致,填入SHA-1指纹
- iOS:
- 在Google Cloud Console创建iOS OAuth客户端ID,Bundle ID与Expo
app.json中的ios.bundleIdentifier一致
- 在Google Cloud Console创建iOS OAuth客户端ID,Bundle ID与Expo
- Web客户端ID:仅用于Expo开发环境,生产环境优先使用平台专属客户端
2. 重定向URI选择
- 开发环境:使用Expo代理(
makeRedirectUri({ useProxy: true })),无需额外配置 - 生产环境:使用原生重定向,禁用Expo代理,配置方式:
同时在makeRedirectUri({ useProxy: false, native: `${YOUR_APP_SCHEME}:/oauthredirect`, })app.json中配置scheme:
最后将该原生重定向URI添加到对应平台OAuth客户端的「已授权重定向URI」列表中{ "expo": { "scheme": "yourappscheme", "android": { "package": "com.your.package" }, "ios": { "bundleIdentifier": "com.your.bundle" } } }
3. 可运行参考代码
import * as Google from 'expo-auth-session/providers/google'; import { firebase } from '@react-native-firebase/auth'; import Constants from 'expo-constants'; import { Platform } from 'react-native'; // 替换为你的客户端ID const WEB_CLIENT_ID = "xxxxx.apps.googleusercontent.com"; const ANDROID_OAUTH_CLIENT_ID = "xxxxx-android.apps.googleusercontent.com"; const IOS_OAUTH_CLIENT_ID = "xxxxx-ios.apps.googleusercontent.com"; // 根据环境切换客户端ID const isProduction = !__DEV__; const CLIENT_ID = isProduction ? Platform.select({ android: ANDROID_OAUTH_CLIENT_ID, ios: IOS_OAUTH_CLIENT_ID, default: WEB_CLIENT_ID, }) : WEB_CLIENT_ID; const [request, response, promptAsync] = Google.useAuthRequest({ clientId: CLIENT_ID, scopes: ['profile', 'email'], redirectUri: makeRedirectUri({ useProxy: __DEV__, native: `${Constants.expoConfig.scheme}:/oauthredirect`, }), }); // 处理登录回调 useEffect(() => { if (response?.type === 'success') { const { authentication } = response; const credential = firebase.auth.GoogleAuthProvider.credential(authentication.idToken); firebase.auth().signInWithCredential(credential) .then(userCredential => { // 登录成功逻辑:获取用户信息、跳转主页等 const user = userCredential.user; }) .catch(error => { // 错误处理:提示用户、记录日志等 console.error('谷歌登录失败:', error); }); } }, [response]);
三、关键问题解答
- Expo代理 vs 原生重定向:开发环境用Expo代理(简化配置),生产环境必须用原生重定向(符合谷歌OAuth生产规范,避免被拦截)
- Android SHA-1需求:必须配置,谷歌会验证Android应用的签名指纹,缺失会直接触发unauthorized_client错误
- 客户端ID选择:生产环境需使用对应平台的OAuth客户端ID(Android/iOS),仅Web Client ID无法满足生产环境的平台验证要求
- 错误常见原因:
- 重定向URI未添加到OAuth客户端的授权列表
- 生产环境使用了Expo代理且未配置原生客户端
- Android应用未配置正确的SHA-1指纹
- 客户端ID与当前运行平台不匹配
内容的提问来源于stack exchange,提问作者Syed Laeeq Ahmed
相关产品推荐
相关产品推荐

