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 には、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 status
var 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}');
}
}

ユーザーがすでにサインインし、有効なセッションがアクティブな場合、signIn を呼び出すことができないことに注意してください。最初に signOut を呼び出して、元のセッションを削除する必要があります。

カスタムチャレンジでサインインを確認する

ユーザーからカスタム チャレンジを取得するには、ユーザーが必要な値を送信するための適切な 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}');
}
}

ユーザーが正しい応答を提供すると、アプリケーションで認証されます。

ConfirmSignIn の特別な処理

confirmSignIn 呼び出し中に、Lambda から failAuthentication: true が返された場合、リクエストのセッションは Cognito によって無効化され、NotAuthorizedException がスローされます。回復するには、ユーザーは Amplify.Auth.signIn を呼び出して新しいサインインを開始する必要があります。

例外: メッセージ Invalid session for the user. を含む NotAuthorizedException

パスワード検証を含むカスタム認証フロー

このドキュメントの例では、パスワードレスのカスタム認証フローを示しています。ただし、ユーザーがカスタム認証フローの一部として有効なパスワードを提供することが必要な場合もあります。

有効なパスワードを必須にするには、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;
};