カスタム認証フロー
Auth カテゴリは、ユーザーが定義したカスタム認証フローを実行するように設定できます。以下のガイドでは、シンプルなパスワードレス認証フローのセットアップ方法を示します。
前提条件
Amplify には、iOS (13.0)、Android (API レベル 24)、および macOS (10.15) の最小ターゲット プラットフォームが必要です。Web、Windows、または Linux をターゲットにする場合は、Flutter のサポートされているデプロイ プラットフォームを参照してください。いくつかのターゲット プラットフォームには追加のセットアップが必要です。プラットフォーム固有のセットアップの詳細については、プラットフォーム セットアップを参照してください。
Auth を設定する
カスタム認証フローは、手動で設定できます。
ユーザーを登録する
上記のフローでは、ユーザーを登録するためのパラメータとして、ユーザー名と有効なメール ID が必要です。次の API を呼び出してサインアップ フローを開始します。
Cognito での認証フローは設定を通じて切り替えることができますが、ユーザーはパスワード付きで登録することが依然として必要です。
Future<void> signUpCustomFlow() async { try { final userAttributes = <AuthUserAttributeKey, String>{ AuthUserAttributeKey.email: 'email@domain.com', AuthUserAttributeKey.phoneNumber: '+15559101234', // additional attributes as needed }; final result = await Amplify.Auth.signUp( username: 'myusername', password: 'mysupersecurepassword', options: SignUpOptions(userAttributes: userAttributes), ); safePrint('Sign up result: $result'); } on AuthException catch (e) { safePrint('Error signing up: ${e.message}'); }}サインアップ フローの次のステップは、ユーザーを確認することです。確認コードは、サインアップ時に提供されたメール ID に送信されます。メールで受け取った確認コードを confirmSignUp の呼び出しに入力します。
Future<void> confirmUser({ required String username, required String confirmationCode,}) async { try { final result = await Amplify.Auth.confirmSignUp( username: username, confirmationCode: confirmationCode, ); // Check if further confirmations are needed or if // the sign up is complete. await _handleSignUpResult(result); } on AuthException catch (e) { safePrint('Error confirming user: ${e.message}'); }}ユーザーをサインインする
ユーザーからユーザー名を取得する UI を実装します。ユーザーがユーザー名を入力した後、以下のメソッドを呼び出してサインイン フローを開始できます:
// Create state variables for the sign in statusvar isSignedIn = false;String? challengeHint;
Future<void> signInCustomFlow(String username) async { try { final result = await Amplify.Auth.signIn(username: username); setState(() { isSignedIn = result.isSignedIn; // Get the publicChallengeParameters from your Create Auth Challenge Lambda challengeHint = result.nextStep.additionalInfo['hint']; }); } on AuthException catch (e) { safePrint('Error signing in: ${e.message}'); }}カスタムチャレンジでサインインを確認する
ユーザーからカスタム チャレンジを取得するには、ユーザーが必要な値を送信するための適切な UI を作成し、その値を confirmSignin() API に渡します。
Future<void> confirmSignIn(String generatedNumber) async { try { final result = await Amplify.Auth.confirmSignIn( /// Enter the random number generated by your Create Auth Challenge trigger confirmationValue: generatedNumber, ); safePrint('Sign in result: $result'); } on AuthException catch (e) { safePrint('Error signing in: ${e.message}'); }}ユーザーが正しい応答を提供すると、アプリケーションで認証されます。
パスワード検証を含むカスタム認証フロー
このドキュメントの例では、パスワードレスのカスタム認証フローを示しています。ただし、ユーザーがカスタム認証フローの一部として有効なパスワードを提供することが必要な場合もあります。
有効なパスワードを必須にするには、DefineAuthChallenge コードを変更して PASSWORD_VERIFIER ステップを処理できます:
exports.handler = async (event) => { if ( event.request.session.length === 1 && event.request.session[0].challengeName === 'SRP_A' ) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = 'PASSWORD_VERIFIER'; } else if ( event.request.session.length === 2 && event.request.session[1].challengeName === 'PASSWORD_VERIFIER' && event.request.session[1].challengeResult === true ) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = 'CUSTOM_CHALLENGE'; } else if ( event.request.session.length === 3 && event.request.session[2].challengeName === 'CUSTOM_CHALLENGE' && event.request.session[2].challengeResult === true ) { event.response.issueTokens = true; event.response.failAuthentication = false; } else { event.response.issueTokens = false; event.response.failAuthentication = true; }
return event;};