Google 登录可在开发版本中工作,但不能在预览版本中工作

2023-12-10

我正在构建一个带有 expo 和 React Native 的应用程序。我通过 firebase 使用 Google 登录。当我运行 iOS 开发版本时,登录功能完美运行。但是,当我运行 iOS 预览版本时,出现以下错误:“访问被阻止:此应用程序的请求无效,您无法登录,因为此应用程序发送了无效请求。您可以稍后重试,或联系开发人员以解决问题这个问题。错误 400:redirect_uri_mismatch”。

当我单击“错误详细信息”时,它只显示“错误 400:redirect_uri_mismatch”。

我的 Apple 标识符是 com.username.appname,我的捆绑包 ID 在 iOS 版 Google Console Client ID 和 firebase 应用程序上都是 com.username.appname。

我尝试插入设备并在发生错误时观察控制台,但我没有看到任何相关的内容。有人经历过这个错误吗?或者当“developmentClient”为 false 时是否有一些变量会发生变化,这可能会提供有关为什么会发生此错误的线索?

Screenshot of error message

Screenshot of error details

"dependencies": {
    "@react-native-async-storage/async-storage": "~1.17.11",
    "@react-navigation/native": "^6.1.2",
    "@react-navigation/native-stack": "^6.9.8",
    "expo": "^48.0.11",
    "expo-auth-session": "~4.0.3",
    "expo-dev-client": "~2.2.1",
    "expo-image-picker": "~14.1.1",
    "expo-linear-gradient": "~12.1.2",
    "expo-random": "~13.1.1",
    "expo-splash-screen": "~0.18.1",
    "expo-status-bar": "~1.4.4",
    "expo-web-browser": "^12.1.1",
    "firebase": "^9.16.0",
    "nativewind": "^2.0.11",
    "react": "18.2.0",
    "react-native": "0.71.6",
    "react-native-dotenv": "^3.4.7",
    "react-native-safe-area-context": "^4.5.1",
    "react-native-safearea-height": "^1.0.5",
    "react-native-screens": "^3.20.0"
  },
  "devDependencies": {
    "@babel/core": "^7.20.12",
    "tailwindcss": "^3.2.4"
  },
//LoginScreen.js
import React, { useEffect } from 'react';
import * as Google from 'expo-auth-session/providers/google';
import { IOS_CLIENT_ID, EXPO_CLIENT_ID, ANDROID_CLIENT_ID } from '@env';
import { makeRedirectUri } from 'expo-auth-session';
import {
  GoogleAuthProvider,
  signInWithCredential,
} from '@firebase/auth';
import { auth } from '../firebase';


const LoginScreen = () => {

  const [request, response, promptAsync] = Google.useAuthRequest({
    iosClientId: IOS_CLIENT_ID,
    expoClientId: EXPO_CLIENT_ID,
    adroidClientID: ANDROID_CLIENT_ID,
    redirectUri: makeRedirectUri({ scheme: 'com.username.appname' }),
  });

  useEffect(() => {
    if (response?.type == 'success') {
      const idToken = response['authentication']['idToken'];
      const accessToken = response['authentication']['accessToken'];
      const credential = GoogleAuthProvider.credential(idToken, accessToken);
      signInWithCredential(auth, credential);
    }
  }, [response]);

  const signInWithGoogle = () => {
    promptAsync();
  };

//eas.json
{
  "cli": {
    "version": ">= 2.7.1"
  },
  "build": {
    "development": {
      "developmentClient": true,
      "distribution": "internal"
    },
    "preview": {
      "distribution": "internal"
    },
    "production": {}
  },
  "submit": {
    "production": {}
  }
}
//app.json
{
  "expo": {
    "name": "appname",
    "slug": "appname",
    "scheme": "com.username.appname",
    "version": "1.0.0",
    "orientation": "portrait",
    "icon": "./assets/icon.png",
    "userInterfaceStyle": "light",
    "plugins": [
      [
        "expo-image-picker",
        {
          "photosPermission": "Allow access to photos to add photos.",
          "cameraPermission": "Allow access to camera to take photos."
        }
      ]
    ],
    "splash": {
      "image": "./assets/splashscreen.png",
      "resizeMode": "contain",
      "backgroundColor": "#000000"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "ios": {
      "supportsTablet": true,
      "bundleIdentifier": "com.username.appname"
    },
    "android": {
      "adaptiveIcon": {
        "foregroundImage": "./assets/adaptive-icon.png",
        "backgroundColor": "#FFFFFF"
      },
      "package": "com.username.appname"
    },
    "web": {
      "favicon": "./assets/favicon.png"
    },
    "extra": {
      "eas": {
        "projectId": "1aaaa111-aa11-1aaa-aaaa-1a11aa1a11a1"
      }
    }

  }
}

//firebase.js
import { initializeApp } from 'firebase/app';
import { getAnalytics } from 'firebase/analytics';
import { getFirestore } from 'firebase/firestore';
import { getStorage } from 'firebase/storage';
import {
  firebaseConfig_apiKey,
  firebaseConfig_authDomain,
  firebaseConfig_projectId,
  firebaseConfig_storageBucket,
  firebaseConfig_messagingSenderId,
  firebaseConfig_appId,
  firebaseConfig_measurementId,
} from '@env';
import {
  initializeAuth,
  getReactNativePersistence,
} from 'firebase/auth/react-native';
import AsyncStorage from '@react-native-async-storage/async-storage';

const firebaseConfig = {
  apiKey: firebaseConfig_apiKey,
  authDomain: firebaseConfig_authDomain,
  projectId: firebaseConfig_projectId,
  storageBucket: firebaseConfig_storageBucket,
  messagingSenderId: firebaseConfig_messagingSenderId,
  appId: firebaseConfig_appId,
  measurementId: firebaseConfig_measurementId,
};

// Initialize Firebase
const app = initializeApp(firebaseConfig);
const auth = initializeAuth(app, {
  persistence: getReactNativePersistence(AsyncStorage),
});
const storage = getStorage(app);

const db = getFirestore();

export { auth, db, storage };

enter image description here image showing ios client


回答我自己的问题......经过几天的尝试不同的事情我解决了这个问题。我改变的两件事是

  1. 在 app.json 中我添加了“privacy”:“unlisted”。我认为这可能不是问题的原因。
  2. 我在开发过程中的某个时刻更改了项目名称,因此我的 expo 项目名称不再与我的包 ID 一致。我使用新名称创建了一个新的 expo 项目,将我的秘密添加到 expo 项目中,重新配置构建,创建了一个新的“预览”构建,瞧!它在开发版本和预览版本中都能顺利运行。

我希望有一天这可以帮助别人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Google 登录可在开发版本中工作,但不能在预览版本中工作 的相关文章

  • 找不到 com.google.gms:google-services:4.1.0 [重复]

    这个问题在这里已经有答案了 Bitrise 构建失败并出现以下错误 配置根项目 src 时出现问题 无法解析配置 classpath 的所有文件 找不到 com google gms google services 4 1 0 在以下位置进
  • 从 JavaScript 中 Firebase 数据库的查询结果中获取特定子项的值

    我在 Firebase 上有这个示例数据库 样本数据库 我有一个index html 其中有这两个输入文本 div class login form h2 Login Form h2 div
  • 将 firebase 框架添加到 ios 项目时出现链接器错误

    我一直在尝试将 firebase 框架添加到我的 ios 应用程序中 我按照这里的说明进行操作 https www firebase com docs ios quickstart html https www firebase com d
  • 云函数定时器

    我需要创建一个云函数来启动一个计时器 该计时器在 X 分钟后调用另一个云函数 它应该重复此 N 次 除非在达到 N 之前被告知停止 这可能吗 我一直在读到您只能使用外部 cron 作业或应用程序引擎来设置计时器 有可能以这种方式做我想做的事
  • firestore快照监听器生命周期和定价之间有什么关系?

    在我的活动中 我有一个字符串列表 这些字符串表示我想要附加快照侦听器的 Firestore 文档 我使用 Acivity ModelView 存储库结构 在活动的 onCreate 中 我向 ViewModelProvider 询问适当的
  • 接收新推送的子项的通知

    I m push ing 到 firebase 参考中 我希望听众能够上网 然后仅收到新消息的通知 push ed 孩子们 因此 如果节点已经包含 5 个子节点 并且客户端希望收到新子节点的通知 并且推送了 2 个子节点 则客户端应该只收到
  • 如何验证最终用户经过身份验证的令牌(使用 Firebase 身份验证)来调用 google cloud run 端点?

    请帮助使用 firebase 身份验证在云运行中进行最终用户身份验证 简短的介绍 我从 firebase 函数提交 Authorization Bearer idToken 标头 并使用电子邮件 密码 firebase 用户进行身份验证的
  • 编辑模板身份验证 Firebase

    您好 我使用 Firebase 启动了一个新应用程序 然后执行身份验证方法 但我需要编辑电子邮件地址验证和更改电子邮件地址的模板 这两个选项无法编辑 但重置密码后可以编辑模板 字段 消息 该消息仅在选项 电子邮件地址验证和更改电子邮件地址
  • 防止 Firebase 中的待处理写入事务不起作用

    我的目标是在单击按钮时将名称插入 Cloud Firestore 中 但如果用户未连接到互联网 我不希望保存处于挂起状态 我不喜欢 Firebase 保存待处理写入的行为 即使互联网连接已恢复 我研究发现Firebase 开发人员建议使用事
  • Cloud Firestore 安全规则使用的语言名称是什么?

    我想知道用于 Cloud Firestore 安全规则的语法名称 如下所述https firebase google com docs firestore security get started authuser 0 https fire
  • 如何取消配置 flutterfire?

    我们在 CLI 中使用以下命令将 flutter 应用程序与 firebase 连接 flutterfire configure 如文档中所述 https firebase flutter dev docs overview https f
  • 如何查询和过滤 Firebase 实时数据库 [重复]

    这个问题在这里已经有答案了 我想从数据库中获取所有人员 其中名字和姓氏由用户输入给出 到目前为止 这是我的代码 admin database ref persons orderByChild Firstname equalTo firstN
  • Firebase如何获取用户详细信息?

    我在我的应用程序中使用 Firebase 身份验证 并使用电子邮件和密码注册用户 当用户使用自己的帐户登录时 我也想获取其他用户的详细信息 与登录用户分开 我怎样才能得到这些信息 电子邮件 显示名称和 ID 特定于身份验证系统 等值可从Fi
  • 删除整个数据库太容易了

    有没有办法保护数据库不被删除 我的意思是单击根节点旁边的 x 非常容易 这会破坏整个应用程序并造成巨大的混乱 如何应对这种脆弱性 EDIT 假设我有两个 Firebase 帐户 一个用于测试 另一个用于启动的应用程序 我经常登录和退出以使用
  • 在 Firebase 中为 TextView Swift 保存字体和大小的方法是什么

    我想在 Firebase 中保存 Swift 中 TextView 的字体 大小和对齐方式 这样我就可以在另一个视图中调用它 我只能将颜色保存在 Firebase 中 这是显示我是如何做到的的代码 IBAction func SendBtn
  • 如何在不使用 Firebase 控制台的情况下发送 Firebase 云消息通知?

    我从新的 Google 通知服务开始 Firebase Cloud Messaging 感谢这段代码https github com firebase quickstart android tree master messaging htt
  • ListView 和快照 - 错误 - 错误状态:DocumentSnapshotPlatform 中不存在字段[重复]

    这个问题在这里已经有答案了 我对快照和 ListView 有一个小问题 到目前为止 它运行得很好 但自从我更新了 flutter 和 Dart 后 我 收到了一个错误 构建 StreamBuilder gt 时抛出以下 StateError
  • 了解应用程序在后台时何时收到 Firebase 消息

    我知道这个标题有同样的问题 但不幸的是它没有得到正确的回答 它被接受了 here https stackoverflow com questions 37711082 how to handle notification when app
  • 如何仅从 Firestore 获取最新更新的数据?

    在 Firestore 上发现任何更改时始终获取整个文档 如何只获取最近更新的数据 这是我的数据 我需要在第一次加载时在聊天中按对象顺序 例如 2018 09 17 30 40 msg和sendby 并且如果数据更新则仅获取新的msg和se
  • firebase匿名身份验证绑定到设备

    我正在开发一个用于公共信息的应用程序 所以不需要注册 但是 我想提供一些个性化服务 为了做到这一点 我需要将用户活动存储在服务器上 有没有办法允许用户匿名登录 但它与设备绑定 因此在用户删除或注销然后再次登录的情况下 他们仍然具有从 fir

随机推荐