Expo 项目如何在开发和 Google Play 发布环境中配置 Google OAuth?
结论
建议使用自己的 development build 调试 Google 登录,再用 Google Play 分发的测试版本验证生产配置。获取 SHA-1 不需要 Android Studio,可以通过 EAS 凭据工具、Java 的 keytool 或 Google Play Console 查看相应信息。
Client ID 的用途取决于登录实现,不能简单地认为“Expo Go 使用 Web Client ID,上架后换成 Android Client ID”。Android 原生登录也可能需要同时配置 Android OAuth 客户端和 Web Client ID。
为什么不应继续以 Expo Go 作为登录测试环境?
Expo Go 是运行项目的通用原生容器,加载 JavaScript 不会把项目变成 Web 应用。
根据当前 Expo 文档,Expo Go 无法自定义应用的 URL scheme,因此不能用于标准 OAuth/OpenID Connect 回调流程的本地开发测试。需要添加原生代码的 Google 登录库也无法在 Expo Go 中运行,应使用 development build。Expo OAuth 文档、Google 登录接入指南
如果现有代码来自使用 auth.expo.io 的旧教程,需要迁移到 development build。Expo 已不建议继续使用这种代理登录方式。Expo 迁移说明
真正运行在浏览器中的 Expo Web 项目,应按 Web 应用配置对应的 OAuth 流程。
第一步:创建自己的开发构建
没有 Android Studio 时,可以使用 EAS 云端构建,再把生成的 APK 安装到 Android 真机上。云端编译不要求本机安装 Android 原生构建工具。Expo development build 指南
先安装开发客户端并配置 EAS:
npx expo install expo-dev-client
npx eas-cli@latest login
npx eas-cli@latest build:configure
确认应用配置中的 android.package 是计划使用的包名,例如下面的配置片段:
{
"expo": {
"android": {
"package": "com.example.myapp"
}
}
}
com.example.myapp 是占位示例,需要换成自己的包名。
在 eas.json 中配置开发和生产构建。如果已有配置,合并相应字段即可:
{
"build": {
"development": {
"developmentClient": true,
"distribution": "internal"
},
"production": {}
}
}
选择 Google 登录库后,先按该库的文档安装依赖、加入 config plugin,再进行构建。Expo 的 Google 登录指南列出了可用的原生库,具体 API 和兼容要求以所选库为准。
npx eas-cli@latest build --platform android --profile development
安装生成的开发 APK 后,启动开发服务器:
npx expo start --dev-client
然后打开自己的开发客户端连接项目。新增原生登录库或修改原生配置后,需要重新构建客户端。
第二步:获取实际签名证书的 SHA-1
SHA-1 是签名证书的指纹,不是 Expo 项目本身的固定属性。应确认正在测试的安装包由哪张证书签名。
EAS 构建的安装包
运行:
npx eas-cli@latest credentials --platform android
选择对应的构建 profile,查看 Android keystore 信息及其 SHA-1。如需进一步检查,也可以按交互菜单下载凭据和 keystore。Google 登录库配置指南、EAS 凭据说明
下载 keystore 后,可以使用 JDK 自带的 keytool:
keytool -list -v -keystore ./your-keystore.jks -alias YOUR_KEY_ALIAS
将路径和 alias 替换成实际值,按提示输入密码,然后读取输出中的 SHA1。这个操作需要 Java 工具,不需要 Android Studio。Google 证书指纹说明
不要默认 development 和 production profile 一定使用相同证书,也不要随意用本机默认 debug keystore 的指纹代替 EAS 构建证书的指纹。
从 Google Play 安装的版本
启用 Play App Signing 后,Google Play 会使用应用签名密钥为分发给用户的 APK 签名。这个密钥可能与 EAS 使用的上传密钥不同。
在 Google Play Console 中找到应用的 Play App Signing/应用完整性页面,查看 App signing key certificate 的 SHA-1。如果只登记 Upload key certificate 的指纹,可能出现直接安装 APK 时登录正常、从商店安装后失败的情况。若存在多个适用的应用签名证书,应登记相应指纹。Google Play 签名说明
第三步:区分 Android Client ID 和 Web Client ID
以 @react-native-google-signin/google-signin 的原生接入方式为例:
| 配置 | 主要用途 |
|---|---|
| Android OAuth Client ID | 登记 Android 包名和签名证书 SHA-1,识别获准使用登录服务的应用 |
| Web Client ID | 在需要 ID token 或服务端授权等场景中,按库要求作为 webClientId 配置 |
在 Google Cloud Console 中,为实际使用的每组“包名 + SHA-1”创建对应的 Android OAuth 客户端。如果开发包使用了不同包名,也必须用开发包的实际包名登记。
对于这个原生库,Android Client ID 通常用于控制台登记,不需要手动传给 JavaScript 登录调用。webClientId 应填写类型为 Web application 的客户端 ID。两种客户端应属于对应的同一个 Google Cloud 项目。客户端配置指南
下面仅演示该库的初始化配置:
import { GoogleSignin } from '@react-native-google-signin/google-signin';
GoogleSignin.configure({
webClientId: 'YOUR_WEB_CLIENT_ID.apps.googleusercontent.com',
});
这里使用 Web Client ID,并不意味着 Android 应用按网页运行,也不能代替控制台中的 Android 包名和 SHA-1 登记。完整登录调用、结果处理和 config plugin 配置,应继续按所安装版本的库文档完成。
如果选择 expo-auth-session 等浏览器授权方案,应另外核对 Google 对客户端类型和 redirect URI 的要求,不能直接套用原生库的参数。
发布前如何验证?
分别测试直接安装的开发 APK 和从 Google Play 内部测试轨道安装的版本。两者可能使用不同签名,开发包测试成功不能覆盖商店版本。
遇到“开发正常,上架后失败”时,优先检查:
- Google Cloud 登记的包名是否与实际安装包一致。
- 是否登记了 Google Play 的应用签名证书 SHA-1。
webClientId是否属于正确项目,且客户端类型正确。- 修改原生库或构建配置后,是否重新安装了新的构建。
- 若采用浏览器授权流程,实际 redirect URI 是否符合对应客户端的要求。
问题没有提供 Expo SDK 版本、登录库和报错信息,因此无法直接确定现有代码需要修改的具体参数。可以先完成 development build 和签名登记,再针对所选登录方案调试。
备注:内容仅供参考。
