アプリの React Native クライアント コードでは、新しいユーザー アカウントの登録、ユーザーのメール アドレスの確認、またはユーザーのパスワードのリセットができます。
@realm/reactフックuseEmailPasswordAuthには、メール/パスワード ユーザーを管理するためのメソッドと列挙型があります。 クイック リファレンスについては、「 useEmailPasswordAuth フック」を参照してください。
前提条件
ユーザーを認証する前に、次の操作を行う必要があります。
アプリでメール/パスワード認証を有効にします。 詳細については、App Services ドキュメントの「メール/パスワード認証」を参照してください。
クライアントでのユーザー認証の構成
@realm/react にはユーザー認証用のプロバイダーとフックがあります。 ユーザー認証を設定するには:
@realm/reactプロバイダーを設定します。UserProviderフォールバック コンポーネントを使用してユーザーをログインさせます。
@realm/ Reactプロバイダーを設定する
AppProviderでラップされたコンポーネントは、 useAppおよびuseAuthフックにアクセスできます。 これらのコンポーネントは、 AppProviderが App Services バックエンドに正常に接続された場合にのみレンダリングされます。
UserProviderでラップされたコンポーネントは、 userUserフックを使用して認証されたユーザーにアクセスできます。 これらのコンポーネントは、アプリに認証されたユーザーがある場合にのみレンダリングされます
ユーザー認証を設定するには:
App Services にアクセスするために必要なすべてのコンポーネントを
AppProviderでラップします。AppProvider内で、認証されたユーザーにアクセスできるようにするすべてのコンポーネントをUserProvider1} でラップします。UserProviderには、ユーザーをログインさせるコンポーネントを含むfallbackプロパティが含まれています。 認証されたユーザーが存在しない場合、アプリはこのコンポーネントをレンダリングします。
import React from 'react'; import {AppProvider, UserProvider} from '@realm/react'; // Fallback log in component that's defined in another file. import {LogIn} from './Login'; export const LoginExample = () => { return ( <ScrollView> <AppProvider id={APP_ID}> {/* If there is no authenticated user, mount the `fallback` component. When user successfully authenticates, the app unmounts the `fallback` component (in this case, the `LogIn` component). */} <UserProvider fallback={LogIn}> {/* Components inside UserProvider have access to the user. These components only mount if there's an authenticated user. */} <UserInformation /> </UserProvider> </AppProvider> </ScrollView> ); };
フォールバック コンポーネントによるログイン
ユーザーはログインする前に、登録されたメール/パスワード アカウントを持っている必要があります。 ユーザーがログインすると、 UserProviderでラップされているすべてのコンポーネントは、 userUserフックからそのユーザー オブジェクトのインスタンスにアクセスできるようになります。
ユーザーをメールとパスワードを使用してログインするには、次の手順に従います。
ユーザーがまだ登録されていない場合は登録します。
useEmailPasswordAuthフックからlogInとresultを分解します。ユーザーのメールとパスワードを オブジェクトとして
LogIn()に渡します。resultを処理します。
export const LoginWithEmail = () => { const {logIn, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const performLogin = () => { logIn({email, password}); }; // Handle `result`... };
新しいユーザー アカウントの登録
新しいメール/パスワード ユーザーを登録する前に、メールアドレスとパスワードを取得する必要があります。 メールアドレスは別のメール/パスワードユーザーと関連付けることはできず、パスワードは 6 文字から 128 文字の間である必要があります。
登録後、アプリにログインする前に、新しいユーザーのメールアドレスを確認する必要があります。
新しいユーザーアカウントを登録するには:
useEmailPasswordAuthフックからregisterとresultを分解します。ユーザーのメールとパスワードを オブジェクトとして
register()に渡します。ユーザーのメールアドレスを確認します。
type RegisterButtonProps = { email: string; password: string; }; const RegisterButton = ({email, password}: RegisterButtonProps) => { const {register, result, logIn} = useEmailPasswordAuth(); // Log in the user after successful registration useEffect(() => { if (result.success && result.operation === AuthOperationName.Register) { logIn({email, password}); } }, [result, logIn, email, password]); // For this example, the App Services backend automatically // confirms users' emails. const performRegistration = () => { register({email, password}); }; return ( <Button title="Register" onPress={performRegistration} /> ); };
ユーザーのメールアドレスの確認
認証プロバイダーが 新しいユーザー を自動的に確認するように設定されていない限り、新規ユーザーはアプリにログインする前に自分のメール アドレスを確認する必要があります。 確認プロセスはユーザーを登録すると開始され、クライアント コードから確認すると終了します。
メール確認には有効なtokenとtokenIdが必要です。 これらの値は、認証プロバイダの構成に応じて、異なる場所から取得されます。
確認メール を送信します。
tokenとtokenIdの値はクエリ パラメータとして Email Confirmation URLに含まれています。確認関数 を実行します。
tokenとtokenIdの値は引数として関数に渡されます。
登録されているユーザーを確認するには、次の手順に従います。
App Services で、 User Confirmation MethodがSend a confirmation emailに設定されていることを確認します。
クライアント コードで、
useEmailPasswordAuthフックからconfirmとresultを分解します。tokenとtokenIdを オブジェクトとしてconfirm()に渡します。resultに基づいて確認を処理します。
interface ConfirmUserProps { token: string; tokenId: string; } const ConfirmUser = ({token, tokenId}: ConfirmUserProps) => { const {confirm, result} = useEmailPasswordAuth(); const performConfirmation = () => { confirm({token, tokenId}); }; // Handle `result`... }
ユーザー確認方法の再試行
SDK は、ユーザー確認のメールを再送信したり、カスタム確認方法を再試行したりする方法を提供します。
確認メールの再送信
プロバイダーが確認メール を送信するように設定されている場合、Atlas App Services はユーザーが登録すると確認メールを自動的に送信します。 メールには、 30分間有効なトークンを使用して構成されたEmail Confirmation URLへのリンクが含まれています。 ユーザーが期間内にリンクに従って確認しない場合は、新しい確認メールをリクエストする必要があります。
確認メールを再送信するには、以下の手順に従います。
useEmailPasswordAuthフックからresendConfirmationEmailとresultを分解します。ユーザーのメールを オブジェクトとして
resendConfirmationEmail()に渡します。resultに基づいて確認を処理します。
const ResendUserConfirmationEmail = () => { const {resendConfirmationEmail, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const performResendConfirmationEmail = () => { resendConfirmationEmail({email}); }; // Handle `result`... }
ユーザー確認機能の再試行
必要に応じて、カスタム確認関数を再実行できます。
ユーザー確認機能を再試行するには、次の手順に従います。
useEmailPasswordAuthフックからretryCustomConfirmationとresultを分解します。ユーザーのメールを オブジェクトとして
retryCustomConfirmation()に渡します。resultに基づいて確認を処理します。
const RetryCustomUserConfirmation = () => { const {retryCustomConfirmation, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const performRetryCustomConfirmation = () => { retryCustomConfirmation({email}); }; // Handle `result`... }
ユーザーのパスワードのリセット
ユーザーのパスワードのリセットは複数段階のプロセスです。
クライアント アプリで、ユーザーがパスワードをリセットするための UI を提供します。 その後、App Services App はメールを送信するか、カスタム関数を実行してユーザーの ID を確認できます。
ユーザーの ID を確認した後、パスワード再設定リクエストを完了します。
パスワードのリセットが完了すると、ユーザーは新しいパスワードを使用してログできます。
希望するパスワード リセット方法の設定方法の詳細については、 App Services メール/パスワード認証 のドキュメントを参照してください。
メールでパスワードをリセット
パスワード リセット メールを送信してユーザーの ID を確認できます。 パスワード リセット メール を送信するように App Services App を設定する必要があります。 モバイル アプリケーションでは、アプリ内で直接パスワードのリセットを取り扱えます。 Android の ディープリンク または iOS の ユニバーサル リンク を設定します。
パスワード リセット メールからのtokenとtokenIdの値は 30 分間有効です。 ユーザーがその時間内にメールのPassword Reset URLにアクセスしない場合、値は期限切れになり、ユーザーは別のパスワード リセット メールをリクエストする必要があります。
メールでパスワードをリセットするには:
App Services で、 Password Reset MethodがSend a password reset emailに設定されていることを確認します。
クライアント コードで、
useEmailPasswordAuthフックからsendResetPasswordEmail、resetPassword、resultを構造化します。ユーザーのメールを オブジェクトとして
sendResetPasswordEmail()に渡します。リセットメールのパスワード URL から
tokenとtokenIdの値を抽出します。新しいユーザー パスワード、
tokenとtokenIdを オブジェクトとしてresetPassword()に渡します。
const SendResetPasswordEmailButton = ({email}: {email: string}) => { const [errorMessage, setErrorMessage] = useState(''); const {sendResetPasswordEmail, result} = useEmailPasswordAuth(); const performSendResetPasswordEmail = () => { sendResetPasswordEmail({email: email}); }; // Handle `result`... };
interface ResetPasswordButtonProps { password: string; token: string; tokenId: string; } const ResetPasswordButton = ({ password, token, tokenId, }: ResetPasswordButtonProps) => { const [errorMessage, setErrorMessage] = useState(''); const {resetPassword, result} = useEmailPasswordAuth(); const performPasswordReset = () => { resetPassword({token, tokenId, password}); }; // Handle `result`... };
パスワード リセット機能の呼び出し
定義した App Services Function を呼び出して、パスワードのリセットを処理できます。 パスワードリセット機能を実行する ように構成する必要があります。App Services App
この関数は、ユーザー名、パスワード、および任意の数の追加引数を指定できます。 これらの引数を使用して、セキュリティの質問の回答やその他のチャレンジにユーザーがパスワード リセットを正常に完了するために渡す必要があるものなどの詳細を指定できます。
Atlas App Services 側では、このメソッドを呼び出すときに実行されるカスタム パスワード リセット機能を定義します。 その関数は、次の 3 つのステータスのいずれかを返す必要があります。
failpendingsuccess
failステータスはエラーとして扱われます。 SDK メソッドcallResetPasswordFunction()は戻り値を取らないため、クライアントにpendingまたはsuccessステータスを返すことはありません。
パスワードリセット機能を呼び出すには、次のようにします。
App Services で、パスワード リセット機能を作成します。
Atlas App Services で、 Password Reset MethodがRun a password reset functionに設定されていることを確認し、それが新規関数に設定されていることを確認します。
クライアント コードで、
useEmailPasswordAuthフックからcallResetPasswordFunctionとresultを分解します。ユーザーのメールとパスワードを オブジェクトとして
callResetPasswordFunction()に渡し、カスタム関数に定義したその他の引数を渡します。
const ResetPasswordWithFunction = () => { const {callResetPasswordFunction, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const performResetPassword = () => { callResetPasswordFunction({email, password}, "extraArg1", "extraArg2"); }; }
サーバー側の保留中のケース
ユーザーに本人確認を行うために追加の手順を実行したい場合、 App Services のパスワード リセット関数によりpendingが返されることがあります。 ただし、その戻り値は SDK のcallResetPasswordFunction()に渡されないため、クライアントアプリはpendingステータスを処理するために独自のロジックを実装する必要があります。
サーバー側関数により、カスタム メール プロバイダーを使用してメールが送信される場合があります。 または、SMS を使用して、テキスト メッセージでユーザーの ID を確認することもできます。
App Services のパスワード リセット関数のコンテキストで、 tokenとtokenIdにアクセスできます。 App Services のパスワード リセット機能からこの情報を渡す場合、プラットフォーム固有のディープ リンクまたはユニバーサル リンクを使用してこれらの値をアプリに渡すことができます。 次に、クライアント アプリケーションはuseEmailPasswordAuth フックを使用してパスワード リセット フローを完了できます。
interface ResetPasswordButtonProps { password: string; token: string; tokenId: string; } const ResetPasswordButton = ({ password, token, tokenId, }: ResetPasswordButtonProps) => { const [errorMessage, setErrorMessage] = useState(''); const {resetPassword, result} = useEmailPasswordAuth(); const performPasswordReset = () => { resetPassword({token, tokenId, password}); }; // Handle `result`... };
サーバー側の成功例
App Services のパスワード リセット関数が関数内で追加の検証を行う場合、またはパスワードのリセットを試みる前にユーザーの ID を検証した場合は、 successを返すように App Services 関数を構成できます。 ただし、その戻り値は SDK のcallResetPasswordFunction()に渡されないため、クライアントアプリはsuccessステータスを処理するために独自のロジックを実装する必要があります。
useEmailPasswordAuth フック参照
useEmailPasswordAuthフックには、メール/パスワード ユーザーの管理を効率化するメソッドがあります。 認証に関連する状態もあります。 詳細については、 useEmailPasswordAuthリファレンスを参照してください。
また、 useEmailPasswordAuthについては、 @realm/react API ドキュメントも確認してください。