Firebase Authentication の iOS 導入手順【④メールアドレスとパスワードの更新編】【SwiftUI】

前回③メールアドレス・パスワード認証によるログイン・ログアウト編の続きです。

今回は、登録したメールアドレスとパスワードの変更方法についてです。

他の Firebase Authentication についての記事一覧は以下の通りです。

Firebase Authentication の iOS 導入手順【④メールアドレスとパスワードの更新編】【SwiftUI】

(1) メールアドレスの更新

メールアドレスの更新には、

Auth.auth().currentUser?.updateEmail(to: email)

を使用します。

Auth.auth().currentUser?.updateEmail(to: self.email) { error in }

(2) パスワードの更新

パスワードの更新には、

Auth.auth().currentUser?.updatePassword(to: password)

を使用します。

Auth.auth().currentUser?.updatePassword(to: self.password) { error in }

ユーザー登録時と同じく、パスワードは2回入力で確認を行った文字列を渡すようにしましょう

(3) 実装例

SwiftUI での簡易的な実装例を紹介します。

細かいバリデーションやコードの最適化は行っていませんのでご了承ください。

import SwiftUI
import FirebaseAuth

struct AuthTestEmailPasswordUpdateView: View {
    
    @State private var email = ""
    @State private var password = ""
    @State private var confirm = ""
    
    @State private var isShowEmailUpdateAlert = false
    @State private var isShowPasswordUpdateAlert = false
    @State private var isError = false
    @State private var errorMessage = ""
    
    var body: some View {
        HStack {
            Spacer().frame(width: 50)
            VStack {
                Text("新しいメールアドレス")
                TextField("mail@example.com", text: $email).textFieldStyle(RoundedBorderTextFieldStyle())
                Button(action: {
                    if self.email.isEmpty {
                        self.isShowEmailUpdateAlert = true
                        self.isError = true
                        self.errorMessage = "メールアドレスが入力されていません"
                    } else {
                        Auth.auth().currentUser?.updateEmail(to: self.email) { error in
                            self.isShowEmailUpdateAlert = true
                            if let error = error as NSError?, let errorCode = AuthErrorCode(rawValue: error.code) {
                                switch errorCode {
                                case .invalidEmail:
                                    self.errorMessage = "メールアドレスの形式が正しくありません"
                                case .requiresRecentLogin:
                                    self.errorMessage = "ログインしてください"
                                default:
                                    self.errorMessage = error.localizedDescription
                                }
                                self.isError = true
                            } else {
                                self.isError = false
                            }
                        }
                    }
                }) {
                    Text("メールアドレス変更")
                }
                .alert(isPresented: $isShowEmailUpdateAlert) {
                    if self.isError {
                        return Alert(title: Text(""), message: Text(self.errorMessage), dismissButton: .destructive(Text("OK")))
                    } else {
                        return Alert(title: Text(""), message: Text("メールアドレスが更新されました"), dismissButton: .default(Text("OK")))
                    }
                }
                Spacer().frame(height: 50)
                Text("新しいパスワード")
                SecureField("半角英数字", text: $password).textFieldStyle(RoundedBorderTextFieldStyle())
                Text("パスワード確認")
                SecureField("半角英数字", text: $confirm).textFieldStyle(RoundedBorderTextFieldStyle())
                Button(action: {
                    if self.password.isEmpty {
                        self.isShowPasswordUpdateAlert = true
                        self.isError = true
                        self.errorMessage = "パスワードが入力されていません"
                    } else if self.confirm.isEmpty {
                        self.isShowPasswordUpdateAlert = true
                        self.isError = true
                        self.errorMessage = "確認パスワードが入力されていません"
                    } else if self.password.compare(self.confirm) != .orderedSame {
                        self.isShowPasswordUpdateAlert = true
                        self.isError = true
                        self.errorMessage = "パスワードと確認パスワードが一致しません"
                    } else {
                        Auth.auth().currentUser?.updatePassword(to: self.password) { error in
                            self.isShowPasswordUpdateAlert = true
                            if let error = error as NSError?, let errorCode = AuthErrorCode(rawValue: error.code) {
                                switch errorCode {
                                case .weakPassword:
                                    self.errorMessage = "パスワードは6文字以上で入力してください"
                                case .requiresRecentLogin:
                                    self.errorMessage = "ログインしてください"
                                default:
                                    self.errorMessage = error.localizedDescription
                                }
                                self.isError = true
                            } else {
                                self.isError = false
                            }
                        }
                    }
                }) {
                    Text("パスワード変更")
                }
                .alert(isPresented: $isShowPasswordUpdateAlert) {
                    if self.isError {
                        return Alert(title: Text(""), message: Text(self.errorMessage), dismissButton: .destructive(Text("OK")))
                    } else {
                        return Alert(title: Text(""), message: Text("パスワードが更新されました"), dismissButton: .default(Text("OK")))
                    }
                }
            }
            Spacer().frame(width: 50)
        }
    }
}

なお、このサンプルではログインしていることが前提になっていますので注意してください

次回⑤メールアドレスの確認メール送信・パスワード再設定メール送信編に続きます。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です