您好,我是 firebase 新手,想确认我对 auth 函数的理解。(addStateDidChangeListener)
一点背景:
当应用程序首次启动时,首先调用应用程序委托,然后调用此 sceneDelegate 函数。现在,它将根据用户是否登录来显示一个屏幕。如果他们没有注册,它将向他们显示我的登录/注册屏幕(self.createHandleSignInOrSignUp())。
现在有2个问题:
他们注册或登录后,应用程序会跳回到里面的这段代码.addStateDidChangeListener。
这是因为身份验证状态发生了变化,对吗?
此外,当应用程序运行时,您可以注销,然后调用此代码块。
这是因为该函数在应用程序运行时始终“监听”身份验证状态更改?
下面的代码是我的 SceneDelegate.swift 文件的一部分以及我有疑问的函数。
谢谢
class SceneDelegate: UIResponder, UIWindowSceneDelegate {
var window: UIWindow?
func scene(_ scene: UIScene, willConnectTo session: UISceneSession, options connectionOptions: UIScene.ConnectionOptions) {
guard let windowScene = (scene as? UIWindowScene) else { return }
window = UIWindow(frame: windowScene.coordinateSpace.bounds)
window?.windowScene = windowScene
handle = Auth.auth().addStateDidChangeListener({ auth, user in
if (user != nil) {
self.window!.rootViewController = self.createTabBar()
}
else {
self.window!.rootViewController = self.createHandleSignInOrSignUp()
}
})
window?.makeKeyAndVisible() …Run Code Online (Sandbox Code Playgroud) 我正在使用 Firebase 身份验证将用户登录到我的网络应用程序和 Android 应用程序。
Web 应用程序的流程允许我从客户端登录用户,然后将 Firebase 令牌传递到我的服务器,在服务器上我使用 Firebase 进行验证,然后再将各种用户信息添加到我的数据库。
我现在正在为 Android 尝试同样的操作,但在获取令牌时遇到一些问题。这是登录代码:
// Initialize Firebase Auth
mAuth = FirebaseAuth.getInstance();
// ...
mAuth.createUserWithEmailAndPassword(email, password)
.addOnCompleteListener((MainActivity) context, new OnCompleteListener<AuthResult>() {
@Override
public void onComplete(@NonNull Task<AuthResult> task) {
if (task.isSuccessful()) {
// ***I want to get the token here***
FirebaseUser fbUser = task.getResult().getUser();
// send user details and token to server
} else {
// If sign in fails, display a message to the user.
}
}
}
});
Run Code Online (Sandbox Code Playgroud)
在其他地方,我看到在 Firebase …
我不知道我的应用程序是否可以在中国运行,也不知道如何测试它。我在某处读到有一个 firebase 中文域名 .cn 正在运行。如果还没有的话,是否有可能将当前项目转移到中文域并使其运行?
如果我创建一个新项目并为我的 Firebase 服务选择中国服务器,那么它会对世界其他地区产生任何其他不利后果吗?这个解决方案实际上会迫使所有开发人员将 Firebase 服务器设在中国,这样他们就不会错过中国用户群,我认为这对某些人来说可能是一个问题。
我可能没有最好的想法,但任何建议和解决方法将不胜感激。
firebase firebase-authentication great-firewall-of-china google-cloud-firestore
await FirebaseAuth.instance.verifyPhoneNumberawait FirebaseAuth.instance.verifyPhoneNumber从某种意义上说,在成功执行之前运行的代码无法正常工作。await并没有真正做好它的工作。
为了方便理解问题,我不会共享所有代码,仅共享相关代码。我有一个名为的视图CustRegView,我从用户那里获取电话号码并将其发送到名为 ViewModelCustRegViewModel,该视图应该根据其身份验证返回 true 或 false。
下面是视图的样子
class CustRegView extends StatelessWidget{
final TextEditingController _controller = TextEditingController();
@override
Widget build(BuildContext context) {
final deviceSize = MediaQuery.of(context).size;
return BaseView<CustRegViewModel>(
builder: (context, model, child) => Scaffold(
...<some code>
TextFeild( controller: _controller, ...<some code> )
...<some code>
FlatButton (
onPressed: () async {
var registerSuccess = await model.register( _controller.text, context);
if (registerSuccess) {
Navigator.pushNamed(context, 'newScreen');
} else {
UIHelper().showErrorButtomSheet(context, model.errorMessage);
} …Run Code Online (Sandbox Code Playgroud) 使用可调用函数,我的目的是只允许登录用户调用它。
export const sendMessage = functions.https.onCall(async (data, context) => {
Run Code Online (Sandbox Code Playgroud)
从context那里的参数中,我得到了身份验证令牌。但总的来说,我对 Firebase 还很陌生,我不想因为这里的误解而犯下严重错误。如果我注销了,context.auth就变成空——很容易。但我是否需要确保身份验证令牌是有效的,而不是通过调用“编造”verifyIdToken的?
如果不是,那么是否只是检查是否context.auth为 null 足以确保用户已登录?
我按照这篇博客文章在用户注册后向他们发送电子邮件验证,这是我在执行时遇到的问题sendEmailVerification()
未为类型“UserCredential”定义方法“sendEmailVerification”。尝试将名称更正为现有方法的名称,或定义名为“sendEmailVerification”的方法
但这篇博客文章的问题是,所使用的某些内容已被弃用,我设法解决了除此之外的大多数内容。
这是我的代码:-(您可以看到包名称的导入语句)
import 'dart:async';
import 'package:firebase_auth/firebase_auth.dart' as auth;
import 'package:cloud_firestore/cloud_firestore.dart';
class Auth {
final auth.FirebaseAuth _firebaseAuth = auth.FirebaseAuth.instance;
Future<String> signUp(String email, String password) async {
try {
final user = await _firebaseAuth
.createUserWithEmailAndPassword(email: email, password: password);
try {
await user.sendEmailVerification(); // <== The error happens here
return user;
} catch (e) {
print('Code was not sent!');
}
} catch (e) {
print('An error occurred');
}
}
}
Run Code Online (Sandbox Code Playgroud)
你能帮我解决这个问题吗?谢谢!
我正在将此代码迁移到最新版本的 firebase,目前我唯一遇到的问题是我的 auth.dart 文件中的这段代码。
@override
Stream<Users> get onAuthStateChanges {
return _firebaseAuth.onAuthStateChanges.map(_userFromFirebase);
}
Run Code Online (Sandbox Code Playgroud)
为了迁移到最新版本,我这样写:
@override
Stream<Users> get authStateChanges {
return _firebaseAuth.authStateChanges.map(_userFromFirebase);
}
Run Code Online (Sandbox Code Playgroud)
我不断收到此错误:
没有为类型“Function”定义方法“map”。
我似乎找不到任何有关如何正确编写它的文档。有人知道如何解决这个问题吗?
在此先感谢您的帮助
聚苯乙烯
如果您想知道为什么我要迁移此代码,我的模拟器不断抱怨 Firebase Core 插件丢失(我猜是由于 Google-services.json 文件)并且所有身份验证按钮都不起作用。单击后,我收到此“return firebase.google.cms”错误。模拟器工作正常,直到我最近对 Xcode 进行更新,现在它给了我这个奇怪的错误代码,并且不会完成 flutter 运行。所以我想如果我获取了最新版本的 firebase 并更新了代码,相应地,我可以再次使用我的模拟器和/或模拟器。然后我在 authStateChanges.map 代码中遇到了上述问题,我们就在这里。
这是我的完整 auth.dart 文件供您参考:
class Users {
final String uid;
Users({@required this.uid});
}
abstract class AuthBase {
Stream<Users> get authStateChanges;
Future<Users> currentUser();
Future<Users> signInAnonymously();
Future<Users> signInWithEmailAndPassword(String email, String password);
Future<Users> createUserWithEmailAndPassword(String email, String password);
Future<Users> signInWithGoogle();
Future<void> signOut();
}
class …Run Code Online (Sandbox Code Playgroud) 我正在使用 firebase 和 next.js 构建一个应用程序。我在 firebase 的身份验证流程上遇到了困难。一切进展顺利,直到我注意到一个错误/错误。如果我让计算机登录到应用程序一段时间,并且每当刷新页面时,似乎都会导致我被重定向回登录页面。我可以明白为什么刷新会触发我的重定向,因为可能没有足够的时间来及时检查 onAuthStateChange 以便const { user } = useAuth()运行,因此由于初始页面加载时(刷新后)没有用户。它将进入{ else }导致我此时重定向。但有趣的是,如果我只需单击我的仪表板(受保护的页面)链接,我仍然可以通过身份验证。没有重定向。以下是我的身份验证组件的代码:
AuthComp.js:
import { useRouter } from "next/router";
import { useEffect, useState } from "react";
import { useAuth } from "../../context/AuthContext";
function LoadingScreen() {
return <div className="fixed top-0 right-0 h-screen w-screen z-50 flex justify-center items-center">
<div className="animate-spin rounded-full h-32 w-32 border-t-2 border-b-2 border-gray-900"></div>
</div>
}
export function AuthComp(props) {
const [isAuthenticated, setIsAuthenticated] = useState(false)
const router = useRouter();
const { user …Run Code Online (Sandbox Code Playgroud) 当使用 signInWithEmailAndPassword() API 在 firebase 中进行身份验证时,我无法获取有效的“当前”用户。
auth.signInWithEmailAndPassword()
Run Code Online (Sandbox Code Playgroud)
我登录后,用户将被带到主页
我尝试获取用户的 UID,但没有返回有效的用户。该调用发生在异步函数中,如下所示:
currentUser = await auth.currentUser();
Run Code Online (Sandbox Code Playgroud)
当前用户为空。
有什么想法可能导致这种情况吗?
文档看起来像这样
matches: [
{uid: ___ , ...},
{uid: ___ , ...},
]
Run Code Online (Sandbox Code Playgroud)
如何检查请求此操作的用户的 uid 是否在匹配的 uid 之一中?我尝试过这个,但没有成功。
uid 输入get(/databases/$(database)/documents/users/$(request.auth.uid)).data.matches.uid
感谢您的帮助!
firebase firebase-security firebase-authentication google-cloud-firestore