仕組みの詳細
認証(_AuthN_と略記)は、あなたが誰であるかを検証するプロセスです。この検証を行うシステムは、識別プロバイダーまたはIdPと呼ばれます。これは自分でホストする IdP またはクラウドサービスの場合があります。多くの場合、この IdP は Facebook、Google、Amazon などのソーシャルプロバイダーです。
認可(_AuthZ_と略記)は、何にアクセスできるかを検証するプロセスです。これは、カスタムロジックを備えたトークンを確認したり、事前に定義されたルールを使用したり、ポリシーを使用した署名付きリクエストで行われることもあります。
AWS による認証
Amplify エコシステムでは、最も一般的な認証方法は、Amazon Cognito User Pools を単独で使用するか、ソーシャルプロバイダーと一緒に使用してユーザーの ID を検証する方法です(_フェデレーション_として知られています)。
Amazon Cognito User Pools は、ユーザーの登録、認証、アカウント回復を処理するための完全な機能を備えたユーザーディレクトリサービスです。一方、Amazon Cognito フェデレーション ID またはアイデンティティプールは、AWS サービスを使用するようユーザーを認可する方法です。
Amplify は User Pools とインターフェースして、Facebook や Google などの他の OpenID プロバイダーとのフェデレーションを含むユーザー情報を保存し、フェデレーション ID を活用して AWS リソースへのユーザーアクセスを管理します。例えば、ユーザーがファイルを S3 バケットにアップロードできるようにします。Amplify CLI は、これらの AWS リソースのアクセス制御ポリシーを自動化し、GraphQL で細かいアクセス制御を提供して、API 内のデータを保護します。
認可は、通常は次の 2 つの方法のいずれかで行われます。
- クライアントがトークンをバックエンドに渡し、カスタムロジックを実行してアクションを許可または拒否する
- クライアントがリクエストに署名し、バックエンドが署名を検証して、事前に定義されたポリシーに基づいてアクションを許可または拒否する。事前に定義されたルールは IAM ポリシーとして知られており、Amplify CLI によって自動的に設定されます。
最初のモードは REST または GraphQL API の一般的な認可方法ですが、2 番目のモードは S3、Pinpoint などの AWS サービスとのインターフェースに必要です。
サインアップとサインイン
多くのアプリケーションでは、ユーザーのサインアップとサインインで十分です。認証されたら、アプリは API と通信してデータにアクセスおよび変更できます。この場合、Amplify CLI を使用して amplify add auth を実行し、デフォルト設定を選択して User Pool を作成できます。アプリケーションでは、Auth.signUp と Auth.signIn(または Amplify UI コンポーネント)を使用してこのプロセスを完了し、トークンを取得できます。Amplify クライアントは、Auth.currentSession を呼び出してトークンが無効になった場合はトークンをリフレッシュします。
ソーシャルプロバイダーフェデレーション
多くのアプリケーションは、Facebook、Google Sign-In、Login with Amazon などのソーシャルプロバイダーでのログインもサポートしています。これを行うことが推奨される方法は OAuth リダイレクト経由です。これにより、ユーザーはソーシャルメディアアカウントを使用してログインでき、対応するユーザーが User Pools に作成されます。この設計では、アプリにソーシャルプロバイダーの SDK を含める必要はありません。amplify add auth を実行し、ソーシャルプロバイダーオプションを選択して設定してください。完了後、アプリケーションで Auth.federatedSignIn() を使用して、事前構築された「Hosted UI」を表示するか、プロバイダー名を渡す(例えば Auth.federatedSignIn({provider: 'Facebook'}))ことで直接インターフェースし、独自の UI を構築できます。 また、プロバイダーのトークンを
Auth.federatedSignIn() に直接渡すことで、Identity Pools から認証情報を直接取得することもできます。ただし、そのプロバイダーの SDK を直接アプリで使用し、トークンリフレッシュと認証フローを手動で管理する必要があります。
AWS サービスへのアクセス
一部のアプリケーションは、リクエストに署名することを必要とする AWS サービスを使用する必要があります。例としては、S3 にイメージまたはビデオを保存したり、Pinpoint または Kinesis に分析を送信したりすることが挙げられます。Amplify は、Cognito Identity Pool からの短期認証情報を使用してリクエストに自動的に署名し、これらの認証情報は Amplify クライアントライブラリによって自動的に有効期限切れ、ローテーション、および更新されます。amplify add auth でバックエンドを設定し、Auth.signIn を呼び出すことで、クライアントが認証された後、これは自動的に行われます。以下の図は、User Pools から JWT トークンがどのように返され、Identity Pools から AWS 認証情報がどのように返されるかを示しています。これらには、Auth.currentSession() と Auth.currentCredentials() を使用していつでもアクセスできます。