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.0Xcode 14.1 以降を使用)
  • macOS 10.15Xcode 14.1 以降を使用)
  • tvOS 13.0Xcode 14.3 以降を使用)
  • watchOS 9.0Xcode 14.3 以降を使用)
  • visionOS 1.0Xcode 15 以降を使用)(プレビューサポート - 詳細は以下を参照)

完全な例については、プロジェクト設定のウォークスルーに従ってください。

visionOS サポートは現在プレビュー段階で、最新の Amplify Release を使用することで利用できます。 新しい Xcode および visionOS バージョンがリリースされるにつれて、サポートは必要に応じて最善の努力で更新されます。

macOS プロジェクトで Auth を使用するには、Keychain Sharing 機能を有効にする必要があります。Xcode で、アプリケーションターゲット > Signing & Capabilities > + Capability に移動し、Keychain Sharing を選択します。

この機能が必要な理由は、Auth がプラットフォームのベストプラクティスとして macOS で Data Protection Keychain を使用するためです。macOS での Keychain の動作と Keychain Sharing 権限の詳細については、TN3137: macOS keychain APIs and implementations を参照してください。

アプリケーションに機能を追加する方法の詳細については、Xcode Capabilities を参照してください。

Auth を設定する

カスタム認証フローは、手動で設定できます。

ユーザーをサインインする

ユーザーからユーザー名を取得する UI を実装します。ユーザーがユーザー名を入力した後、以下のメソッドを呼び出してサインイン フローを開始できます:

func signIn(username: String) async {
do {
let options = AWSAuthSignInOptions(authFlowType: .customWithoutSRP)
let signInResult = try await Amplify.Auth.signIn(username: username,
options: .init(pluginOptions: options))
if case .confirmSignInWithCustomChallenge(_) = signInResult.nextStep {
// ユーザーにカスタムチャレンジの入力を求めます。
} else {
print("Sign in succeeded")
}
} catch let error as AuthError {
print("Sign in failed \(error)")
} catch {
print("Unexpected error: \(error)")
}
}
func signIn(username: String) -> AnyCancellable {
Amplify.Publisher.create {
let options = AWSAuthSignInOptions(authFlowType: .customWithoutSRP)
try await Amplify.Auth.signIn(username: username,
options: .init(pluginOptions: options))
}.sink {
if case let .failure(authError) = $0 {
print("Sign in failed \(authError)")
}
}
receiveValue: { result in
if case .confirmSignInWithCustomChallenge(_) = result.nextStep {
// ユーザーにカスタムチャレンジの入力を求めます。
} else {
print("Sign in succeeded")
}
}
}

これはチャレンジのあるカスタム認証フローであるため、サインイン プロセスの結果には、次のステップ .confirmSignInWithCustomChallenge があります。ユーザーがカスタムチャレンジを入力できるように UI を実装します。

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

ユーザーからカスタムチャレンジを取得するには、ユーザーが必要な値を送信するための適切な UI を作成し、その値を confirmSignin() API に渡します。

func customChallenge(response: String) async {
do {
_ = try await Amplify.Auth.confirmSignIn(challengeResponse: response)
print("Confirm sign in succeeded")
} catch let error as AuthError {
print("Confirm sign in failed \(error)")
} catch {
print("Unexpected error: \(error)")
}
}
func customChallenge(response: String) -> AnyCancellable {
Amplify.Publisher.create {
try await Amplify.Auth.confirmSignIn(challengeResponse: response)
}.sink {
if case let .failure(authError) = $0 {
print("Confirm sign in failed \(authError)")
}
}
receiveValue: { _ in
print("Confirm sign in succeeded")
}
}

コンソール ウィンドウに以下が表示される場合、サインイン フローが完了しています:

Confirm sign in succeeded

Lambda トリガーセットアップ

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 を使用してサインイン プロセスを開始していることを確認してください:

let options = AWSAuthSignInOptions(
authFlowType: .customWithSRP)
let signInResult = try await Amplify.Auth.signIn(
username: username,
password: password,
options: .init(pluginOptions: options))