2017-01-18 3 views
2

私はSwift iOSアプリにFirebase Authを使用しています。 Firebase Auth UIを「ドロップイン」認証システムとして使用することをお勧めしますが、初期ログインのみを処理します。私は現在、ユーザーが電子メールやパスワードなどのプロファイルを変更できるようにする作業を進めています。Firebase Auth UIはどのように再認証を処理しますか?

これらの変更を行うためのドキュメントは、特定の変更が最近ログインしたことをユーザに要求いくつかの場所で言及

https://firebase.google.com/docs/auth/ios/manage-users#get_the_currently_signed-in_userを参照してください):

を一部のセキュリティに敏感なアクション-ようなアカウントの削除など、設定プライマリ電子メールアドレス、およびパスワードの変更 - は、ユーザーが最近サインインしたことを要求します。これらの操作のいずれかを実行し、ユーザーが長時間前にサインインした場合、アクションはFIRAuthErrorCodeCredentialTooOldエラーで失敗します。

まず、APIのどこにでもFIRAuthErrorCodeCredentialTooOldエラーはありません。

第二に、ドキュメントは、このサンプルコードで、この問題を解決するためにreauthenticate(with:)を使用することを提案:

let user = FIRAuth.auth()?.currentUser 
var credential: FIRAuthCredential 

// Prompt the user to re-provide their sign-in credentials 

user?.reauthenticate(with: credential) { error in 
    if let error = error { 
    // An error happened. 
    } else { 
    // User re-authenticated. 
    } 
} 

問題がある、私はFirebase認証UIを使用するので、私は、ユーザーの資格情報を取得するためのカスタムUIを持っていません。

このエラーが発生したときにログインに使用したのと同じFirebase Auth UIを提示することで再認証できます。しかし、これが正当な方法であるのか、それがまったく問題ないのか、それとも将来的にはうまくいくのかどうかはわかりません。 Firebase AuthのUIコードベースを確認したところ、どこでもreauthenticate()への呼び出しはありません。このエラーが発生した場合には、ドキュメンテーションは特にこのメソッドを呼び出すので、混乱します。

複数のプロバイダを含む再認証を実行するためにUI全体を構築する必要がある場合、Firebase Auth UIを使用するポイントは何ですか?

答えて

1

エラーコードに関しては、ドキュメントの更新が必要です。エラーコードはFIRAuthErrorCode.errorCodeRequiresRecentLoginとなりました。

あなたは直面しているUIの問題として、UIAlertControllerに、ユーザーが再認証のためにパスワードを入力するために使用できるテキストフィールドを提示してみませんか?ビューコントローラ全体を作成するよりもはるかにシンプルで(ユーザーにとって使いやすい)ことは確かです。ここで

はそんなに手間を経由せずにユーザーを再認証する方法の非常に簡単サンプルです:

// initialize the UIAlertController for password confirmation 
let alert = UIAlertController(title: "", message: "Please, enter your password:", preferredStyle: UIAlertControllerStyle.alert) 
// add text field to the alert controller 
alert.addTextField(configurationHandler: { (textField) in 
    textField.placeholder = "Password" 
    textField.autocapitalizationType = .none 
    textField.autocorrectionType = .no 
    textField.isSecureTextEntry = true 
}) 
// delete button action 
alert.addAction(UIAlertAction(title: "Delete account", style: UIAlertActionStyle.destructive, handler: {action in 
    // retrieve textfield 
    let txtFld = alert.textFields![0] 
    // init the credentials (assuming you're using email/password authentication 
    let credential = FIREmailPasswordAuthProvider.credential(withEmail: (FIRAuth.auth()?.currentUser?.email)!, password: txtFld.text!) 
    FIRAuth.auth()?.currentUser?.reauthenticate(with: credential, completion: { (error) in 
     if error != nil { 
      // handle error - incorrect password entered is a possibility 
      return 
     } 

     // reauthentication succeeded! 
    }) 
})) 
// cancel reauthentication 
alert.addAction(UIAlertAction(title: "Cancel", style: UIAlertActionStyle.cancel, handler: {action in })) 

// finally, present the alert controller 
self.present(alert, animated: true, completion: nil) 

ユーザーの電子メールを変更したり、自分のアカウントを削除する必要があるとき(パスワードのリセットはしていませんまったくログインする必要があります)、上記のスニペットを使用して、パスワードを再入力できるアラートコントローラをポップアップするだけです。

編集:上記のコードは現在のユーザーのメールを強制的にアンラップするので、その段階でユーザーがログインしていることを確認するか、アプリがクラッシュすることに注意してください。

+0

もちろん、ユーザーがFacebookやGoogleなどのプロバイダにログインしている場合はどうなりますか?このエラーは電子メールログインを使用している場合にのみ発生することを示すものではありません。 –

+0

その場合は、まずユーザーにログイン方法を入力する必要があります。警告コントローラだけでなく、適切なView Controllerが必要になるでしょう。 – ThunderStruct

+1

ありがとうございました。ですから、私の元々の質問は残っています。この再認証のためにFirebase Auth UIをもう一度使うことはできますか?どこでも再認証を呼び出すわけではありません。しかし、もう一度ログインしても大丈夫なら、それはうまくいくはずですか? Firebaseチームの説明が役立ちます。 –

関連する問題