認証フローの切り替え
AWSCognitoAuthPluginを使用すると、サインイン時に異なる認証フロー間で切り替えることができます。フローはamplify_outputs.jsonファイルで設定するか、signIn APIへのランタイムパラメータとしてauthFlowTypeを渡すことで設定できます。
クライアント側の認証には、ランタイムで設定できる4つの異なるフローがあります。
-
userSRP:userSRPフローはSRPプロトコル(セキュアリモートパスワード)を使用し、パスワードはクライアントから離れることなく、サーバーには不明です。これは推奨されるフローであり、デフォルトで使用されます。 -
userPassword:userPasswordフローはユーザー認証情報を暗号化されない状態でバックエンドに送信します。「Migration」トリガーを使用してユーザーをCognitoに移行し、ユーザーにパスワードのリセットを強制しない場合は、このトリガーで呼び出されるLambda関数が指定された認証情報を検証する必要があるため、このタイプを使用する必要があります。 -
customWithSRP:customWithSRPフローはSRP認証で開始してからカスタム認証に切り替えるために使用されます。初期認証にSRPを使用し、その後の認証試行にカスタム認証を使用したい場合に便利です。 -
customWithoutSRP:customWithoutSRPフローはSRPなしで認証フローを開始してから、異なる要件を満たすようにカスタマイズできるチャレンジと応答のサイクルのシリーズを使用するために使用されます。 -
userAuth:userAuthフローは、ユーザーが利用可能な認証方法のリストから選択できる、選択ベースの認証フローです。このフローは、ユーザーに認証方法を選択するオプションを提供したい場合に便利です。ユーザーに利用可能な選択肢は、emailOTP、smsOTP、webAuthn、password、passwordSRPです。
AuthはAuthSignInOptionsのauthFlowTypeをAuthFlowType.userPassword、AuthFlowType.customAuthWithoutSrp、またはAuthFlowType.customAuthWithSrpとしてsignInを呼び出すことで、ランタイム時に異なるフローを使用するように設定できます。AuthSignInOptionsでAuthFlowTypeを指定しない場合は、デフォルトフロー(AuthFlowType.userSRP)が使用されます。
認証フローの詳細については、Amazon Cognitoデベロッパー向けドキュメントを参照してください。
USER_AUTH(選択ベースの認証)フロー
USER_AUTH認証フローのユースケースは、ユーザーに認証方法を選択するオプションを提供することです。ユーザーに利用可能な選択肢は、emailOTP、smsOTP、webAuthn、password、passwordSRPです。
let pluginOptions = AWSAuthSignInOptions( authFlowType: .userAuth)let signInResult = try await Amplify.Auth.signIn( username: username, password: password, options: .init(pluginOptions: pluginOptions))guard case .continueSignInWithFirstFactorSelection(let availableFactors) = signInResult.nextStep else { return}print("Available factors: \(availableFactors)")認証方法の選択はユーザーによって行われます。ユーザーは利用可能な要因から選択して、選択した要因で進めることができます。confirmSignIn APIを選択した要因で呼び出して、サインインプロセスを続行する必要があります。以下は、emailOTP要因を選択して進める場合の例です。
// emailOTPを要因として選択var confirmSignInResult = try await Amplify.Auth.confirmSignIn( challengeResponse: AuthFactorType.emailOTP.challengeResponse)USER_PASSWORD_AUTH フロー
USER_PASSWORD_AUTH認証フローのユースケースはAmazon Cognitoへのユーザー移行です。
ユーザー移行Lambda トリガーは、ユーザーをレガシーユーザー管理システムからユーザープールに移行するのに役立ちます。USER_PASSWORD_AUTH認証フローを選択する場合、ユーザーはユーザー移行中にパスワードをリセットする必要はありません。このフローは認証時にSSL接続経由でサービスにユーザーのパスワードを送信します。
すべてのユーザーを移行したら、より安全なSRPフローに切り替えてください。SRPフローはネットワーク経由でパスワードを送信しません。
func signIn(username: String, password: String) async throws {
let option = AWSAuthSignInOptions(authFlowType: .userPassword) do { let result = try await Amplify.Auth.signIn( username: username, password: password, options: AuthSignInRequest.Options(pluginOptions: option)) print("Sign in succeeded with result: \(result)") } catch { print("Failed to sign in with error: \(error)") }}Amazon Cognitoでユーザーを移行する
Amazon Cognitoは、既存のユーザーディレクトリからユーザーをCognitoにシームレスに移行するためのトリガーを提供します。これは、ユーザープールの「Migration」トリガーを設定して、ユーザープール内にまだ存在しないユーザーが認証するか、パスワードをリセットするたびにLambda関数を呼び出すことで実現されます。
簡潔に言えば、Lambda関数は既存のユーザーディレクトリに対してユーザー認証情報を検証し、成功時にユーザー属性と状態を含むレスポンスオブジェクトを返します。エラーが発生した場合はエラーメッセージが返されます。この移行フローをセットアップする方法に関するドキュメント、およびlambdaがリクエストレスポンスオブジェクトをどのように処理すべきかについてのより詳細な手順があります。
CUSTOM_AUTH フロー
Amazon Cognito User Poolsは、ユーザーのアイデンティティを検証するためにパスワードに加えてカスタムチャレンジタイプを有効にするために認証フローをカスタマイズできます。カスタム認証フローは、異なる要件を満たすようにカスタマイズできるチャレンジと応答のサイクルのシリーズです。これらのチャレンジタイプにはCAPTCHA、ダイナミックチャレンジ質問が含まれることがあります。
カスタム認証フローの課題を定義するために、Amazon Cognitoの3つのLambdaトリガーを実装する必要があります。
フローはAuthSignInOptionsでAuthFlowType.customAuthWithSrpまたはAuthFlowType.customAuthWithoutSrpで設定したsignInを呼び出すことで開始されます。
カスタム認証フローをアプリケーションと統合する方法についての詳細は、カスタム認証サインインの手順に従ってください。