メール/パスワードユーザーの管理 - Swift SDK
項目一覧
Atlas App Services アプリでメール/パスワード プロバイダーを有効にしている場合は、クライアント コードから新しいアカウントを登録し、メールアドレスを確認して、ユーザーのパスワードをリセットできます。
バージョン10.16.0での変更: メール/パスワード ユーザー API では、 async/await サポートが追加されます。 このページのコード例は async/await 構文に更新されました。 古い構文の例については、「完了ハンドラーを使用したメール/パスワード ユーザーの例 」を参照してください。
新しいユーザー アカウントの登録
RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; RLMEmailPasswordAuth *client = [app emailPasswordAuth]; NSString *email = @"skroob2@example.com"; NSString *password = @"password12345"; [client registerUserWithEmail:email password:password completion:^(NSError *error) { if (error != nil) { NSLog(@"Failed to register: %@", [error localizedDescription]); return; } // Registering just registers. You can now log in. NSLog(@"Successfully registered user."); }];
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "skroob@example.com" let password = "password12345" do { try await client.registerUser(email: email, password: password) // Registering just registers. You can now log in. print("Successfully registered user.") } catch { print("Failed to register: \(error.localizedDescription)") }
新しいユーザーのメールアドレスの確認
RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; RLMEmailPasswordAuth *client = [app emailPasswordAuth]; // Token and tokenId are query parameters in the confirmation // link sent in the confirmation email. NSString *token = @"someToken"; NSString *tokenId = @"someTokenId"; [client confirmUser:token tokenId:tokenId completion:^(NSError *error) { if (error != nil) { NSLog(@"User confirmation failed: %@", [error localizedDescription]); return; } // User confirmed NSLog(@"Successfully confirmed user."); }];
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth // Token and tokenId are query parameters in the confirmation // link sent in the confirmation email. let token = "someToken" let tokenId = "someTokenId" do { try await client.confirmUser(token, tokenId: tokenId) // User email address confirmed. print("Successfully confirmed user.") } catch { print("User confirmation failed: \(error.localizedDescription)") }
ユーザー確認方法の再試行
SDK は、ユーザー確認のメールを再送信したり、カスタム確認方法を再試行したりする方法を提供します。
ユーザー確認メールの再送信
確認メールを再送信します。 各 URL の確認トークンは30分後に期限切れになります。 ユーザーが期間内にリンクに従って確認しない場合は、新しい確認メールをリクエストする必要があります。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "skroob@example.com" // If Realm is set to send a confirmation email, we can // send the confirmation email again here. do { try await client.resendConfirmationEmail(email) // The confirmation email has been sent // to the user again. print("Confirmation email resent") } catch { print("Failed to resend confirmation email: \(error.localizedDescription)") }
ユーザー確認機能の再試行
バージョン10.9.0の新機能。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "skroob@example.com" // If Realm is set to run a custom confirmation function, // we can trigger that function to run again here. do { try await client.retryCustomConfirmation(email) // The custom confirmation function has been // triggered to run again for the user. print("Custom confirmation retriggered") } catch { print("Failed to retry custom confirmation: \(error.localizedDescription)") }
ユーザーのパスワードのリセット
ユーザーのパスワードのリセットは複数段階のプロセスです。
クライアント アプリで、ユーザーがパスワードをリセットするための UI を提供します。 その後、App Services App はメールを送信するか、カスタム関数を実行してユーザーの ID を確認できます。
ユーザーの ID を確認した後、パスワード再設定リクエストを完了できます。
パスワードのリセットが完了すると、ユーザーは新しいパスワードを使用してログできます。
希望するパスワード リセット方法の設定方法の詳細については、 App Services メール/パスワード認証 のドキュメントを参照してください。
パスワード リセット メールの送信
ユーザーの ID を確認するためにパスワード リセット メールを送信するには、パスワード リセット メールを送信するようにアプリを設定する必要があります。
パスワード リセット プロセスを開始するには、ユーザーのメールを使用して sendResetPasswordEmail
を呼び出します。 App Services は、一意の URL を含むメールをユーザーに送信します。 ユーザーは 30 分以内にこの URL にアクセスする必要があります。
ユーザーがパスワード リセット メールの URL にアクセスした後、ユーザーのメール、新しいパスワード、一意の URL で指定されたtoken
とtokenId
を使用してresetPassword
を呼び出します。
ユーザーが 30 分以内にパスワード リセット メールの URL にアクセスしない場合、 token
とtokenId
は期限切れになります。 パスワードのリセット プロセスを再度開始する必要があります。
RLMApp *app = [RLMApp appWithId:YOUR_APP_ID]; RLMEmailPasswordAuth *client = [app emailPasswordAuth]; // If Realm app password reset mode is "Send a password reset email", // we can do so here: NSString *email = @"forgot.my.password@example.com"; [client sendResetPasswordEmail:email completion:^(NSError *error) { if (error != nil) { NSLog(@"Failed to send reset password email: %@", [error localizedDescription]); return; } // Email sent. NSLog(@"Successfully sent reset password email."); }]; // Later... NSString *newPassword = @"mynewpassword12345"; // Token and tokenId are query parameters in the confirmation // link sent in the reset password email. NSString *token = @"someToken"; NSString *tokenId = @"someTokenId"; [client resetPasswordTo:newPassword token:token tokenId:tokenId completion:^(NSError *error) { if (error != nil) { NSLog(@"Failed to reset password: %@", [error localizedDescription]); return; } // Password reset. NSLog(@"Successfully reset password."); }];
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "forgot.my.password@example.com" // If Realm app password reset mode is "Send a password reset email", // we can do so here: do { try await client.sendResetPasswordEmail(email) print("Password reset email sent.") } catch { print("Reset password email not sent: \(error.localizedDescription)") } // Later... let newPassword = "mynewpassword12345" // Token and tokenId are query parameters in the reset password // link sent in the reset password email. let token = "someToken" let tokenId = "someTokenId" do { try await client.resetPassword(to: newPassword, token: token, tokenId: tokenId) print("Password reset successful.") } catch { print("Failed to reset password: \(error.localizedDescription)") }
パスワードリセット機能の実行
パスワード リセット機能 を実行するようにアプリを構成するときは、SDK からCallResetPasswordFunction()を呼び出すときに実行する関数を定義します。 この関数は、ユーザー名、パスワード、および任意の数の追加引数を指定できます。 これらの引数を使用して、セキュリティの質問の回答やその他のチャレンジにユーザーがパスワード リセットを正常に完了するために渡す必要があるものなどの詳細を指定できます。
独自のパスワード リセット フローを定義する場合は、カスタム パスワード リセット機能を使用することをお勧めします。 For example, you might send a custom password reset email from a specific domain. または、メール以外のサービスを使用してユーザーの ID を確認することもできます。
Atlas App Services 側では、このメソッドを呼び出すときに実行されるカスタム パスワード リセット機能を定義します。 この関数は、次の 3 つのステータスのいずれかを返すことができます。
fail
pending
success
fail
ステータスは SDK によってエラーとして扱われます。 SDK callResetPasswordFunction()
は戻り値を取らないため、クライアントにpending
またはsuccess
ステータスを返すことはありません。
サーバー側の保留中のケース
ユーザーに本人確認を行うために追加の手順を実行したい場合、 App Services のパスワード リセット関数によりpending
が返されることがあります。 ただし、その戻り値は SDK のcallResetPasswordFunction()
に渡されないため、クライアントアプリはpending
ステータスを処理するために独自のロジックを実装する必要があります。
サーバー側関数により、カスタム メール プロバイダーを使用してメールが送信される場合があります。 または、SMS を使用して、テキスト メッセージでユーザーの ID を確認することもできます。
App Services パスワード リセット関数コンテキストで、 と にアクセスできます。 App Services のパスワード リセット機能からこの情報を渡すと、token
tokenId
ユニバーサル リンク を使用してこれらの値をアプリに渡すことができます。 。その後、クライアントアプリケーションはresetPassword
を呼び出してパスワード リセット フローを完了できます。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "forgot.my.password@example.com" let newPassword = "mynewpassword12345" // The password reset function takes any number of // arguments. let args: [AnyBSON] = [] // This SDK call maps to the custom password reset // function that you define in the backend. In this example, // we assume your function waits for additional identity // confirmation. Calling this function only kicks // off the password reset function. It does not reset the password. do { try await client.callResetPasswordFunction(email: email, password: newPassword, args: args) print("Successfully called the password reset function") } catch { print("Password reset failed: \(error.localizedDescription)") } // Later... // Token and tokenId are parameters you can access // in the App Services function context. You could send // this to the user via email, SMS, or some other method. let token = "someToken" let tokenId = "someTokenId" do { try await client.resetPassword(to: newPassword, token: token, tokenId: tokenId) print("Password reset successful.") } catch { print("Failed to reset password: \(error.localizedDescription)") }
サーバー側の成功例
App Services のパスワード リセット関数が関数内で追加の検証を行う場合、またはパスワードのリセットを試みる前にユーザーの ID を検証した場合は、 success
を返すように App Services 関数を構成できます。 ただし、その戻り値は SDK のcallResetPasswordFunction()
に渡されないため、クライアントアプリはsuccess
ステータスを処理するために独自のロジックを実装する必要があります。
この例では 関数を呼び出すと、パスワード リセット プロセス全体が実行されます。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "forgot.my.password@example.com" let newPassword = "mynewpassword12345" // The password reset function takes any number of // arguments. You might ask the user to provide answers to // security questions, for example, to verify the user // should be able to complete the password reset. let args: [AnyBSON] = [] // This SDK call maps to the custom password reset // function that you define in the backend do { try await client.callResetPasswordFunction(email: email, password: newPassword, args: args) print("Password reset successful!") } catch { print("Password reset failed: \(error.localizedDescription)") }
完了ハンドラーを使用したメール/パスワード ユーザー メソッド
Apple の async/await 構文 を使用していない場合 、これらのメソッドはすべて完了ハンドラーで利用できます。この例では、完了ハンドラー構文を使用してユーザーを登録する方法を示しています。
let app = App(id: YOUR_APP_SERVICES_APP_ID) let client = app.emailPasswordAuth let email = "skroob@example.com" let password = "password12345" client.registerUser(email: email, password: password) { (error) in guard error == nil else { print("Failed to register: \(error!.localizedDescription)") return } // Registering just registers. You can now log in. print("Successfully registered user.") }