Name:
interface
Value:
Amplify has re-imagined the way frontend developers build fullstack applications. Develop and deploy without the hassle.
Gen1 DocsLegacy

Page updated Mar 26, 2026

カスタム認証フロー

Auth カテゴリは、ユーザーが定義したカスタム認証フローを実行するように設定できます。以下のガイドでは、シンプルなパスワードレス認証フローのセットアップ方法を示します。

前提条件

  • Amplify ライブラリが統合された、少なくとも Android SDK API レベル 24 をターゲットとする 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 succeeded

Lambda トリガーセットアップ

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())
);