カスタム認証フロー
Auth カテゴリは、ユーザーが定義したカスタム認証フローを実行するように設定できます。以下のガイドでは、シンプルなパスワードレス認証フローのセットアップ方法を示します。
前提条件
- Amplify ライブラリが統合された、少なくとも Android SDK API レベル 24 をターゲットとする Android アプリケーション
- Android プロジェクトの作成の完全な例については、プロジェクト設定のウォークスルーに従ってください
Auth を設定する
カスタム認証フローは、手動で設定できます。
ユーザーを登録する
上記のフローでは、ユーザーを登録するためのパラメータとして、ユーザー名と有効なメール ID が必要です。次の API を呼び出して、サインアップ フローを開始します。
AuthSignUpOptions options = AuthSignUpOptions.builder() .userAttribute(AuthUserAttributeKey.email(), "my@email.com") .build();Amplify.Auth.signUp("username", "Password123", options, result -> Log.i("AuthQuickStart", "Result: " + result.toString()), error -> Log.e("AuthQuickStart", "Sign up failed", error));val options = AuthSignUpOptions.builder() .userAttribute(AuthUserAttributeKey.email(), "my@email.com") .build()Amplify.Auth.signUp("username", "Password123", options, { Log.i("AuthQuickStart", "Sign up succeeded: $it") }, { Log.e ("AuthQuickStart", "Sign up failed", it) })val options = AuthSignUpOptions.builder() .userAttribute(AuthUserAttributeKey.email(), "my@email.com") .build()try { val result = Amplify.Auth.signUp("username", "Password123", options) Log.i("AuthQuickStart", "Result: $result") } catch (error: AuthException) { Log.e("AuthQuickStart", "Sign up failed", error)}RxAmplify.Auth.signUp( "username", "Password123", AuthSignUpOptions.builder().userAttribute(AuthUserAttributeKey.email(), "my@email.com").build()) .subscribe( result -> Log.i("AuthQuickStart", "Result: " + result.toString()), error -> Log.e("AuthQuickStart", "Sign up failed", error) );サインアップ フローの次のステップは、ユーザーを確認することです。確認コードは、サインアップ時に提供されたメール ID に送信されます。メールで受け取った確認コードを confirmSignUp の呼び出しに入力します。
Amplify.Auth.confirmSignUp( "username", "the code you received via email", result -> Log.i("AuthQuickstart", result.isSignUpComplete() ? "Confirm signUp succeeded" : "Confirm sign up not complete"), error -> Log.e("AuthQuickstart", error.toString()));Amplify.Auth.confirmSignUp( "username", "the code you received via email", { result -> if (result.isSignUpComplete) { Log.i("AuthQuickstart", "Confirm signUp succeeded") } else { Log.i("AuthQuickstart","Confirm sign up not complete") } }, { Log.e("AuthQuickstart", "Failed to confirm sign up", it) })try { val code = "code you received via email" val result = Amplify.Auth.confirmSignUp("username", code) if (result.isSignUpComplete) { Log.i("AuthQuickstart", "Signup confirmed") } else { Log.i("AuthQuickstart", "Signup confirmation not yet complete") }} catch (error: AuthException) { Log.e("AuthQuickstart", "Failed to confirm signup", error)}RxAmplify.Auth.confirmSignUp("username", "the code you received via email") .subscribe( result -> Log.i("AuthQuickstart", result.isSignUpComplete() ? "Confirm signUp succeeded" : "Confirm sign up not complete"), error -> Log.e("AuthQuickstart", error.toString()) );コンソール ウィンドウに以下が表示される場合、サインアップ フローが完了しています:
Confirm signUp succeededユーザーをサインインする
ユーザーからユーザー名を取得する UI を実装します。ユーザーがユーザー名を入力した後、以下のメソッドを呼び出してサインイン フローを開始できます:
AWSCognitoAuthSignInOptions options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITHOUT_SRP) .build();Amplify.Auth.signIn( "username", "password", options, result -> Log.i("AuthQuickstart", result.isSignedIn() ? "Sign in succeeded" : "Sign in not complete"), error -> Log.e("AuthQuickstart", error.toString()));val options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITHOUT_SRP) .build()Amplify.Auth.signIn( "username", "password", options, { result -> if (result.isSignedIn) { Log.i("AuthQuickstart", "Sign in succeeded") } else { Log.i("AuthQuickstart", "Sign in not complete") } }, { Log.e("AuthQuickstart", "Failed to sign in", it) })val options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITHOUT_SRP) .build()try { val result = Amplify.Auth.signIn("username", "password", options) if (result.isSignedIn) { Log.i("AuthQuickstart", "Sign in succeeded") } else { Log.e("AuthQuickstart", "Sign in not complete") }} catch (error: AuthException) { Log.e("AuthQuickstart", "Sign in failed", error)}AWSCognitoAuthSignInOptions options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITHOUT_SRP) .build();RxAmplify.Auth.signIn("username", "password", options) .subscribe( result -> Log.i("AuthQuickstart", result.isSignedIn() ? "Sign in succeeded" : "Sign in not complete"), error -> Log.e("AuthQuickstart", error.toString()) );これはチャレンジのあるカスタム認証フローであるため、サインイン プロセスの結果には、次のステップ .confirmSignInWithCustomChallenge があります。ユーザーがカスタムチャレンジを入力できるように UI を実装します。
カスタムチャレンジでサインインを確認する
ユーザーからカスタム チャレンジ (この場合は 1234) を取得し、confirmSignin() API に渡します。
Amplify.Auth.confirmSignIn( "confirmation", result -> Log.i("AuthQuickstart", "Confirm sign in succeeded: " + result.toString()), error -> Log.e("AuthQuickstart", "Failed to confirm sign in", error));Amplify.Auth.confirmSignIn("confirmation", { Log.i("AuthQuickstart", "Confirm sign in succeeded: $it") }, { Log.e("AuthQuickstart", "Failed to confirm sign in", it) })try { val result = Amplify.Auth.confirmSignIn("confirmation") Log.i("AuthQuickstart", "Confirm sign in succeeded: $result") } catch (error: AuthException) { Log.e("AuthQuickstart", "Failed to confirm signin", error)}RxAmplify.Auth.confirmSignIn("confirmation") .subscribe( result -> Log.i("AuthQuickstart", result.toString()), error -> Log.e("AuthQuickstart", error.toString()) );コンソール ウィンドウに以下が表示される場合、サインイン フローが完了しています:
Confirm sign in succeededLambda トリガーセットアップ
AWS Amplify は、AWS Amplify の一部として関数を作成できるようになりました。Functions の詳細と使用を開始する方法については、Functions ドキュメントを確認してください。さらに、利用可能なトリガーの詳細については、Cognito ドキュメントを参照してください。
Secure Remote Password(SRP)を使用したカスタム認証フロー
Cognito User Pool では、最初のステップとして SRP を使用してカスタム認証フローを開始できます。このフローを使用したい場合は、以下に示すように、最初のチャレンジとして SRP_A を処理するように Define Auth Lambda トリガーをセットアップします:
exports.handler = (event, context) => { 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; } context.done(null, event);};Lambda が最初のステップとして SRP で開始するようにセットアップされている場合、認証フローとして customWithSRP を使用してサインイン プロセスを開始していることを確認してください:
AWSCognitoAuthSignInOptions options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITH_SRP) .build();Amplify.Auth.signIn( "username", "password", options, result -> Log.i("AuthQuickstart", result.isSignedIn() ? "Sign in succeeded" : "Sign in not complete"), error -> Log.e("AuthQuickstart", error.toString()));val options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITH_SRP) .build()Amplify.Auth.signIn( "username", "password", options, { result -> if (result.isSignedIn) { Log.i("AuthQuickstart", "Sign in succeeded") } else { Log.i("AuthQuickstart", "Sign in not complete") } }, { Log.e("AuthQuickstart", "Failed to sign in", it) })val options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITH_SRP) .build()try { val result = Amplify.Auth.signIn("username", "password", options) if (result.isSignedIn) { Log.i("AuthQuickstart", "Sign in succeeded") } else { Log.e("AuthQuickstart", "Sign in not complete") }} catch (error: AuthException) { Log.e("AuthQuickstart", "Sign in failed", error)}AWSCognitoAuthSignInOptions options = AWSCognitoAuthSignInOptions.builder() .authFlowType(AuthFlowType.CUSTOM_AUTH_WITH_SRP) .build();RxAmplify.Auth.signIn("username", "password", options) .subscribe( result -> Log.i("AuthQuickstart", result.isSignedIn() ? "Sign in succeeded" : "Sign in not complete"), error -> Log.e("AuthQuickstart", error.toString()) );