javascript - 即使用户在注册流程中经过身份验证,如何修复 firebase "User is not authorized"错误?

标签 javascript firebase react-native firebase-storage react-native-firebase

我试图在使用 react-native-firebase 的 react-native 应用程序中一次调用中执行各种 firebase 操作。流程是这样的:

  • 在身份验证中创建用户
  • 将图像发送到存储
  • 将数据发送到 Firestore

  • 在图像存储阶段,imgRef.putFile()功能错误表明用户未获得授权。但是我使用 createUserWithEmailAndPassword() (完成后对用户进行身份验证),然后使用返回的凭据完成其余工作、图像存储和 Firestore 创建。
    firebase 存储规则设置为仅允许经过身份验证的用户。这是规则集:
    rules_version = '2';
    service firebase.storage {
      match /b/{bucket}/o {
        match /{allPaths=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    
    另外,我在身份验证方法中启用了匿名登录。
    这是直到错误点的初始操作:
    return (dispatch) => {
            dispatch({ type: types.REGISTER_USER });
            console.log('starting registration process...');
            firebase
                .firestore()
                .collection('users')
                .where('username', '==', username)
                .get()
                .then((querySnapshot) => {
                    console.log(querySnapshot);
                    if (querySnapshot.empty !== true) {
                        registrationFail(dispatch, 'Username already taken. Try again.');
                        console.log("Registrant's username already exists");
                    } else {
                        console.log('Registrants username is unique');
                        firebase
                            .auth()
                            .createUserWithEmailAndPassword(email, pass)
                            .then((userCredential) => {
                                uploadImg(dispatch, img, userCredential.user.uid)
    
    这是 uploadImg() 函数:
    const uploadImg = async (dispatch, uri, uid) => {
        console.log('Starting image upload...');
        dispatch({ type: types.UPLOAD_IMG, info: 'Uploading profile image...' });
        const uploadUri = Platform.OS === 'ios' ? uri.replace('file://', '') : uri;
        const imgRef = firebase.storage().ref('profile-images').child(uid);
        return imgRef
            .putFile(uploadUri, { contentType: 'image/png' })
            .then((success) => {
                console.log('profile image upload successful.')
                return imgRef;
            })
            .catch((err) => {
                console.log('profile image upload failed: ' + err)
                uploadImgFail(dispatch, err.message);
            });
    };
    
    同样,登录控制台的错误是:

    profile image upload failed: Error: User is not authorized to perform the desired action.


    记录firebase.auth().currentUser就在 uploading() 之前函数成功返回当前用户对象。
    这个安全规则问题也发生在 Firestore 上,尽管我对给定集合的安全规则集是:
    match /databases/{database}/documents {
        match /users/{uid} {
          // allow new user to check phone numbers
          allow read: if true
          allow update, create: if request.auth != null 
          allow delete: if request.auth.uid == uid
        }
     }
    
    这是我的注册流程的一部分。我收集输入,将相关数据发送到 redux 操作,创建用户,创建用户后,我将一些数据添加到 firestore 中的文档。这是没有意义的。我引用了文档,但它仍然不起作用。
    如何解决这个问题?

    最佳答案

    Firebase 似乎是一个问题,您必须 注销() 用户创建一次后才能登录。我遇到了同样的问题,这是我的解决方法:

         firebase.auth().signInWithEmailAndPassword(userEmail,userPass).catch((error) => {
                    /*console.log('Could not log in user');*/
                    console.log(error);
                    firebase.auth().createUserWithEmailAndPassword(userEmail,userPass).catch((error) => {
                        /*console.log('Could not create user');*/
                        console.log(error);
                    }).then(result => {
                            firebase.auth().signOut().then(() => {
                                firebase.auth().signInWithEmailAndPassword(userEmail,userPass).then(result => {
                                    /*console.log("here is you logged in user");*/
                                })
                            });
                        });
                    });
                });
    

    关于javascript - 即使用户在注册流程中经过身份验证,如何修复 firebase "User is not authorized"错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63587436/

    相关文章:

    azure - 将 React Native 应用程序连接到 Azure IoT 服务

    react-native - JS 线程似乎暂停了

    javascript - 在 ng-if 变为真后访问 DOM 元素

    javascript - 使用 javascript 检测方向变化

    javascript - 多个状态的 UI 路由器同一个 Controller

    ios - 打开动态链接时如何重定向到某个屏幕?

    javascript - 什么时候移除组件中的骨架屏幕?

    node.js - Firebase 存储从 Node.js 上传图像文件

    android - 我应该使用什么事件在 Firebase Analytics 上发送 "button pressed"事件

    ios - type error null is not an object (evaluating 'ShareDialog.canShow') 在 React Native FBSDK