2016-07-09 1 views
2

私はSwiftで書かれたiOSアプリを持っています。ユーザーは、新しいFirebase 3.2.1バージョンで電子メールとパスワードを使用してサインインするか、FacebookやGoogleでサインインすることができます。しかし、私はユーザーのパスワードをリセットする際に問題に遭遇しました。 Firebaseは、以下に示すように私が使用しているsendPasswordResetWithEmail関数を提供して、ユーザーがパスワードをリセットできるリンクを持つ電子メールを送信します。GoogleまたはFacebookにサインインしたアカウントのFirebaseパスワードリセットを電子メールで処理する方法

このsendPasswordResetWithEmail関数は、電子メールで提供されたリンクがGoogleまたはFacebookのパスワードをリセットしないため、ユーザーがGoogleまたはFacebookからのログインに使用した電子メールを入力するとエラーになるはずです。しかし、そうではありません。

GoogleまたはFacebookからサインインしたアカウントの電子メールを送信すると、Firebaseの代わりにプロバイダとしてGoogleに表示されますが、Firebaseの[認証]タブにある電子メールのリストに存在するため。したがって、ErrorCodeUserNotFoundエラーまたはその他のエラーは発生しません。代わりに、Firebaseは依然としてリセットされたパスワード電子メールを提供された電子メールに送信しているので、パスワードをリセットして私に成功メッセージを送ることができます。しかし、私のアプリで提供されているFacebookやGoogleのサインインボタンを使用しない限り、同じアカウントでログオンすることはできません。この場合、パスワードは古いパスワードのままです。

このシナリオをどのように処理すればよいですか?

これは私がfirebase.google.comサイトに記載されているように使用していますコードです:

FIRAuth.auth()?.sendPasswordResetWithEmail(email!) { error in 
      if error != nil { 
       // Display error message 
       if let errorCode = FIRAuthErrorCode(rawValue: error!.code) { 
        switch (errorCode) { 
          case .ErrorCodeUserNotFound: 
           self.displayAlertMessage(INVALID_EMAIL_3RDPARTY_ERROR_TITLE, message:"No account exists with this email address. Please try another email address."); 
           return 
          default: 
           self.displayAlertMessage(ACCOUNT_CREATION_DB_ERROR_TITLE, message: ACCOUNT_CREATION_DB_ERROR_MESSAGE); 
           return 
          } 
         } 

        } else { 
         // Password reset email sent. 
        }} 

注:私は、その後Firebaseデータベースの認証]タブに表示されていない電子メールアドレスを使用している場合ErrorCodeUserNotFoundエラーがスローされます。

答えて

1

あなたがすべきことは、メールでログインしていないユーザーのボタンを隠すことです。私はこれをproviderDataまたはproviderIDを使用して動作させようとしていますが、FacebookでサインインしたユーザーにはFacebookも与えません。私の唯一のアイデアは、フェッチできるユーザごとにサインアップタイプ(Email、Facebookなど)をキーとしてリアルタイムデータベースに追加することです。

+0

ありがとうDan!私はリアルタイムデータベースにそれを保存することなく、ユーザー認証からプロバイダを取得する方法があるかどうかを調べようとしていましたが、あなたもそれに問題があるようです。 – Jace

+0

問題ありません! UIDでユーザーをデータベースに追加する方法を理解できましたか? –

+0

はい、私はこれのようにしています:REF.child(uid).updateChildValues(user)私のユーザーはfunc getUserDictionary(user:User) - > Dictionary { let userDictionary:[String : "プロバイダ":user.provider as String !, "email":user.email as String !, "firstName":user.firstName as String !, "lastName":user.lastName as文字列! ] return userDictionary } – Jace

0

同じ問題があり、fetchProvidersForEmail()メソッドhereを使用しようとしています。

このようにして、電子メールを渡して、それがFacebookまたはGmailのプロバイダであるかどうかを判断し、ユーザーがリセットしようとするのを防ぐことができます。

関連する問題