当前位置: 首页 > 知识库问答 >
问题:

在读取最初用于验证用户到Firebase 3.0的提供程序(即Google、Facebook、Firebase)时出现权限问题

逄岳
2023-03-14
    null

火场规则:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "user": {
      "uid": {
        "$provider": {
          ".read": true,
          ".write": "auth != null"
        }
      }
    }
  }
}

ViewController代码:

import UIKit
import Firebase

class ResetPasswordTableViewController: UITableViewController, UITextFieldDelegate {

    @IBOutlet weak var emailTextField: UITextField!

    override func viewDidLoad() {
        super.viewDidLoad()

        //Hide navigation bar
        self.navigationController?.navigationBarHidden = true

        //Text fields delegates
        self.emailTextField.delegate = self
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }

    //--------------------------------------------------------
    // MARK: Hide status bar
    //--------------------------------------------------------
    override func prefersStatusBarHidden() -> Bool {
        return true
    }

    @IBAction func resetPasswordButtonTapped(sender: AnyObject?) {

        //Set user fields
        let email = emailTextField.text

        // Check for empty fields
        if (email!.isEmpty)
        {
            // Display error message
            displayAlertMessage(REQUIRED_FIELDS_ERROR_TITTLE, message: REQUIRED_FIELDS_ERROR_MESSAGE)

            return;
        }

        // Validate email address
        if !(UserAccountValidator.validateEmailTextField(email!)) { //if invalid email format
            // Display error message
            self.displayAlertMessage(REENTER_EMAIL_ERROR_TITLE, message: REENTER_EMAIL_ERROR_TITLE)
            return
        }

        // Get the current user's provider, only those users who were authenticated with Firebase as the provider should be sent a reset password email
        let authProvider = getAuthProvider(email!)
        if (!authProvider.isEmpty && authProvider == "Firebase") {
            FIRAuth.auth()?.sendPasswordResetWithEmail(email!) { error in
                // Back to main thread
                NSOperationQueue.mainQueue().addOperationWithBlock {
                    if  error != nil {
                        if let errorCode = FIRAuthErrorCode(rawValue: error!.code) {
                            switch (errorCode) {
                            case .ErrorCodeUserNotFound:
                                self.displayAlertMessage(EMAIL_NOTFOUND_3RDPARTY_ERROR_TITLE, message: EMAIL_NOTFOUND_3RDPARTY_ERROR_MESSAGE);
                                return
                            default:
                                self.displayAlertMessage(ACCOUNT_CREATION_DB_ERROR_TITLE, message: ACCOUNT_CREATION_DB_ERROR_MESSAGE);
                                return
                            }
                        }
                    } else {
                        // Present reset password success view
                        self.performSegueWithIdentifier("resetPasswordSuccessView", sender: self)
                    }
                }
            }
        } else {
            // Display error message
            displayAlertMessage("Authentication Provider Mismatch", message: "It looks like you originally signed in with this email using Google or Facebook. Please reset your password with the appropriate provider and then come back and sign in with your new password.")
        }
    }

    //--------------------------------------------------------
    // MARK: Local Methods
    //--------------------------------------------------------
    func getAuthProvider(email: String) -> String {
        //Retrieve Authentication Provider for a given UID
        var authProvider: String = ""
        FIRDatabase.database().reference().child("user").queryEqualToValue(email).observeSingleEventOfType(.Value, withBlock: { (snapshot) in
            // Get user value
            authProvider = snapshot.value!["provider"] as! String
        }) { (error) in
            print(error.localizedDescription)
        }
        return authProvider
    }

    //--------------------------------------
    // MARK: - Display Error Message Methods
    //--------------------------------------
    func displayAlertMessage(title:String,message:String)
    {
        let alertMessage = UIAlertController(title: title, message: message, preferredStyle:UIAlertControllerStyle.Alert);

        let okAction = UIAlertAction(title:"OK", style: .Default, handler:nil);

        alertMessage.addAction(okAction);

        self.presentViewController(alertMessage, animated: true, completion: nil);

    }
}

共有1个答案

宗鸿博
2023-03-14

如果我减少你的问题,下面的代码:

FIRDatabase.database().reference().child("user").queryEqualToValue(email).observeSingleEventOfType(.Value, withBlock: { (snapshot) in

无法使用以下规则读取未经身份验证的用户:

{
  "rules": {
    ".read": "auth != null",
    ".write": "auth != null",
    "user": {
      "uid": {
        "$provider": {
          ".read": true,
          ".write": "auth != null"
        }
      }
    }
  }
}

两件事:

    null
 类似资料:
  • 在我的Angular 2应用程序中,我希望允许用户通过电子邮件/密码、谷歌和Facebook提供商进行连接。 在第一次登录时,我了解到一个用户条目是在firebase数据库中创建的。例如。如果用户使用另一个提供程序登录,我理解firebase将阻止此操作,特别是如果电子邮件已经被使用并且在规则中设置为unique。 所以我的问题是:如果我们检测到电子邮件是相同的,那么我们如何能够自动的,对用户来说

  • X1.5.0新增 sp_auth_check($uid,$name=null,$relation='or') 功能: 用户权限验证 参数: $uid: 当前登录用户或者管理员的id $name:需要验证的规则列表,支持逗号分隔的权限规则或索引数组,默认为当前url $relation:如果为 'or' 表示满足任一条规则即通过验证;如果为 'and'则表示需满足所有规则才能通过验证 返回: 类型

  • 我想看看我的应用程序是否可以在即时应用程序中完成。我的应用程序是基于从我的船上获取NFC发送的温度。 不幸的是,android开发者网站的常见问题表示,只有以下几个权限可用。 https://developer.android.com/topic/instant-apps/faqs.html 这意味着NFC权限是不可能的? 提前感谢您的回答

  • 我遇到了问题,我尝试在我的comsumer应用程序中实现内容提供程序: 这是我从App A(提供商)获得的Android清单: 这是我从App B(消费者)获得的Android清单: 应用程序A得我得提供商: process:com.erlanggakmoekasan.favoritemovies,pid:27146 java.lang.runtimeException:无法启动活动Compone

  • 本文向大家介绍MySQL验证用户权限的方法,包括了MySQL验证用户权限的方法的使用技巧和注意事项,需要的朋友参考一下 知识归纳 因为MySQL是使用User和Host两个字段来确定用户身份的,这样就带来一个问题,就是一个客户端到底属于哪个host。 如果一个客户端同时匹配几个Host,对用户的确定将按照下面的优先级来排 基本观点越精确的匹配越优先 Host列上,越是确定的Host越优先,[loc