カスタム認証フロー
Auth カテゴリは、ユーザーが定義したカスタム認証フローを実行するように設定できます。以下のガイドでは、シンプルなパスワードレス認証フローのセットアップ方法を示します。
前提条件
Amplify ライブラリが統合されたアプリケーションと、以下のいずれかの最小ターゲット:
- iOS 13.0(Xcode 14.1 以降を使用)
- macOS 10.15(Xcode 14.1 以降を使用)
- tvOS 13.0(Xcode 14.3 以降を使用)
- watchOS 9.0(Xcode 14.3 以降を使用)
- visionOS 1.0(Xcode 15 以降を使用)(プレビューサポート - 詳細は以下を参照)
完全な例については、プロジェクト設定のウォークスルーに従ってください。
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 succeededLambda トリガーセットアップ
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))