【问题标题】:Firebase Database Authentication SwiftFirebase 数据库身份验证 Swift
【发布时间】:2019-04-19 15:28:38
【问题描述】:

我实现了通过 Firebase 进行身份验证的登录和注册视图。那么我怎样才能对我的数据库进行身份验证呢?我更改了规则并输入:

{
  "rules": {
    "users": {
      "$uid": {
        ".write": "$uid === auth.uid"
      }
    }
  }
}

我还编写了获取用户 UID 的代码,但我如何才能告诉我的数据库我已通过身份验证?

PS:我需要 Swift 中的示例。

【问题讨论】:

  • 我已经检查过了。事实是,当我登录时,我会收到 UID,而有了这个 UID,我怎么能告诉我的数据库我可以拥有正确的权限?
  • 我很难理解你的问题。您共享的规则验证用户只能编写自己的节点。对应的代码有什么问题?
  • 基本上我想从我的数据库中读取,然后我在上面设置了规则。但是当我尝试这样做时,我收到消息:失败:控制台上的权限被拒绝。对于阅读,我正在使用: let ref = Database.database().reference() ref.child("utenti").observe(.value) { (snap) in .....
  • 这个问题很不清楚,上面的评论增加了混乱。你是说你想即时改变规则吗?就像我想从我的数据库中读取数据,然后之后我在上面设置了规则?你为什么想这么做?您能否提供一个用例或一些代码来演示您正在尝试做什么?请花点时间查看How do I ask a good question?How to create a Minimal, Complete, and Verifiable example

标签: swift firebase firebase-realtime-database firebase-security


【解决方案1】:

斯威夫特 5 仅用于身份验证,然后使用您自己的代码进行扩展

 let credential = PhoneAuthProvider.provider().credential(
        withVerificationID: FireBaseverficationID,
        verificationCode: "your device code")

 let defaults = UserDefaults(suiteName: "group.Company.AppName")
 let encodedData = NSKeyedArchiver.archivedData(withRootObject: credential)
    defaults?.set(encodedData, forKey: "firebasecredential")

在此之后,在您的扩展文件中解码此默认值并使用凭据进行登录

let decoded = UserDefaults(suiteName: "group.Company.AppName")?.object(forKey: "firebasecredential") as! Data
    let credential = NSKeyedUnarchiver.unarchiveObject(with: decoded) as! PhoneAuthCredential

//MARK: - If user already login with credential
    let userid = Auth.auth().currentUser
    if userid == nil{
        Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
            if error != nil {

                return
            }
            else
            {
                //MARK:- Your desire code After Login
            }
        }
    }else{
        //MARK:- Your desire code if User already Login
    }

【讨论】:

    【解决方案2】:

    尝试以下格式:

    云火库

      service cloud.firestore {
      match /databases/{database}/documents {
        match /{document=**} {
          allow read, write: if request.auth != null;
        }
      }
    }
    

    实时数据库

    //检查auth uid是否等于数据库节点uid

    // 也就是说,用户只能访问自己的数据

    {
      "rules": {
        "users": {
           "$uid": {
             ".read": "$uid === auth.uid",
             ".write": "$uid === auth.uid"
           }
         }
       }
    }
    

    【讨论】:

    • 实时数据库,按你说的设置,让所有人都能访问数据库……
    • 有一个更新可以确保用户只能访问他们自己的数据。这只是一个随机的例子,如果你能告诉我更多关于你希望你的规则是什么样的细节,那么我就能更准确。
    • 是的!我用登录做了一个主视图,我希望这个用户的 UID 能够访问数据库。我怎样才能做到这一点?因为有了上面的规则,每个人都可以读写。
    • 查看更新后的代码,确保特定用户可以访问自己的数据,而不是所有数据
    • 还有 Swift 方面?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2020-09-24
    • 2017-12-26
    • 2017-03-22
    • 1970-01-01
    • 1970-01-01
    • 2018-08-21
    相关资源
    最近更新 更多