reactjs - 为什么我在我的 cordova 应用程序中收到此错误:“Firebase:错误(auth/redirect-cancelled-by-user)”
问题描述
我已按照https://firebase.google.com/docs/auth/web/cordova中的所有步骤操作,但是每当我运行应用程序时,我都会收到此错误“Firebase:错误(auth/redirect-cancelled-by-user) ”。我没有取消身份验证,所以我不知道我为什么会收到这个。
这是我的 JavaScript 代码:
import { getAuth, signInWithRedirect, getRedirectResult, GoogleAuthProvider } from "firebase/auth/cordova";
const GoogleAuthScript = (setAlertMsg) => {
const auth = getAuth();
signInWithRedirect(auth, new GoogleAuthProvider()).then(() => {
return getRedirectResult(auth);
}).then((result) => {
const credential = GoogleAuthProvider.credentialFromResult(result);
const token = credential.accessToken;
const user = result.user;
}).catch((error) => {
const errorCode = error.code;
const errorMessage = error.message;
setAlertMsg(errorMessage);
});
}
export default GoogleAuthScript;
这是我的 config.xml:
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.conquest.testapp" version="1.0.0" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name>app</name>
<description>
A sample Apache Cordova application that responds to the deviceready event.
</description>
<author email="dev@cordova.apache.org" href="http://cordova.io">
Apache Cordova Team
</author>
<content src="index.html" />
<access origin="*" />
<allow-intent href="http://*/*" />
<allow-intent href="https://*/*" />
<allow-intent href="tel:*" />
<allow-intent href="sms:*" />
<allow-intent href="mailto:*" />
<allow-intent href="geo:*" />
<platform name="android">
<allow-intent href="market:*" />
<preference name="AndroidLaunchMode" value="singleTask" />
<preference name="android-minSdkVersion" value="22" />
<preference name="AndroidXEnabled" value="true" />
<resource-file src="google-services.json" target="app/google-services.json" />
<framework src="src/android/plugin.gradle" custom="true" type="gradleReference"/>
<preference name="CordovaWebViewEngine" value="CDVUIWebViewEngine" />
<preference name="GradlePluginKotlinEnabled" value="true" />
<preference name="GradlePluginKotlinCodeStyle" value="official" />
<preference name="GradlePluginKotlinVersion" value="1.6.0-M1" />
</platform>
<platform name="ios">
<allow-intent href="itms:*" />
<allow-intent href="itms-apps:*" />
</platform>
<universal-links>
<host name="my-domain.page.link" scheme="https" />
<host name="my-domain.firebaseapp.com" scheme="https">
<path url="/__/auth/callback" event="authCalled" />
</host>
</universal-links>
</widget>
这是我的 index.html 代码,其中包含了一个相对链接标签:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="icon" href="%PUBLIC_URL%/favicon.ico" />
<link rel="alternate" href="android-app://com.conquest.test/https/quizstarapp.page.link/__/auth/callback" />
<meta name="viewport" content="user-scalable=no, initial-scale=1, maximum-scale=1, minimum-scale=1, width=device-width, shrink-to-fit=no" />
<meta name="theme-color" content="#000000" />
<meta name="description" content="Web site created using create-react-app"/>
<script type="text/javascript" charset="utf-8" src="cordova.js"></script>
<link rel="apple-touch-icon" href="%PUBLIC_URL%/logo192.png" />
<link rel="manifest" href="%PUBLIC_URL%/manifest.json" />
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Poppins&display=swap" rel="stylesheet">
<link href="https://fonts.googleapis.com/css?family=Material+Icons|Material+Icons+Outlined|Material+Icons+Two+Tone|Material+Icons+Round|Material+Icons+Sharp" rel="stylesheet">
<title>App</title>
</head>
<body>
<noscript>You need to enable JavaScript to run this app.</noscript>
<div id="root"></div>
</body>
</html>
最后,这是我的应用程序组件的代码,我从中调用登录函数:
import { useState, useEffect } from "react";
import { HashRouter } from "react-router-dom";
import { Box, ThemeProvider, Button, Alert } from "@mui/material";
import { DarkTheme } from "./theming/theme";
import { initializeApp } from "firebase/app";
import { getAnalytics } from "firebase/analytics";
import GoogleAuthScript from "./scripts/GoogleAuthScript";
import { getAuth, signInWithRedirect, getRedirectResult, cordovaPopupRedirectResolver, OAuthProvider, OAuthCredential, GoogleAuthProvider } from "firebase/auth/cordova";
const checkForUser = async () => {
const result = await getRedirectResult(getAuth()).then(async(result) => {
const credentials = new OAuthCredential(result);
const user = await credentials.providerId.user;
console.log(user);
});
}
const firebaseConfig = {
apiKey: "",
authDomain: "",
projectId: "",
storageBucket: "",
messagingSenderId: "",
appId: "",
measurementId: ""
};
const App = () => {
useEffect(() => {
const app = initializeApp(firebaseConfig);
const analytics = getAnalytics(app);
//checkForUser();
}, [firebaseConfig])
const [theme, setTheme] = useState(DarkTheme);
const [alertMsg, setAlertMsg] = useState("");
return(
<HashRouter>
<ThemeProvider theme={theme}>
<Box
sx={{
position:"absolute",
width:"100vw",
height:"auto",
minHeight:"100vh",
top:"0",
left:"0",
display:"flex",
backgroundColor:"background.default",
alignItems:"center",
justifyContent:"center",
}}
>
<Button
variant="contained"
onClick={() => {
GoogleAuthScript(setAlertMsg);
}}
>
Log in with Google
</Button>
<Alert
sx={{
position:"fixed",
bottom:"1rem",
left:"1rem",
}}
>
{alertMsg}
</Alert>
</Box>
</ThemeProvider>
</HashRouter>
);
}
export default App;
解决方案
推荐阅读
- python - 如何编写一个函数来平均数据帧列中每个数组中的每个第 n 个数字?
- php - 如何根据外部数组值优先级对多维PHP数组进行排序
- javascript - 在 Javascript 中使用 XPATH 从 WebElement 中检索值
- excel - 如何根据第一行和第一列中的值对一系列矩阵求和 - Excel VBA
- python - Python 3.8(刽子手游戏输入)
- applescript - 在 AppleScript 脚本中识别文件路径作为 Automator 工作流程的一部分
- cmd - 如何在命令提示符下关闭命令反馈
- c++ - 在 2D 矢量迭代中找到最小值错误
- php - PHP - 句子按 3 个单词分组,然后在组更改时获取第一次出现
- mysql - Athena 将日期和时间的字符串表示形式转换为时间戳或日期类型