まずは少し引いた視点で、アクセス制御について見ていきましょう。アクセス制御には、業界で統一された明確な定義があるわけではありません。しかし、少し調べてみると、多くの信頼できる情報源が、アクセス制御を、認証、認可、同意、ポリシー適用をまとめた包括的な概念として捉えており、適切な人やサービスだけがアプリケーションや API にアクセスできるようにするものだという点で一致しています。では次に、認証、認可、同意、ポリシー適用の違いをもう少し詳しく見ていきましょう。通常、Auth0 の (つまり ) は、認証と同意、および認可とポリシー適用の一部または全部を担います。さらに、 や API 自体が、ほとんどの場合、特にコンテキストに応じたアクセス制御が必要な場面では、ポリシーを実際に適用する主体になります。
1 つ目のカテゴリは、アプリケーションまたは API 全体へのアクセスが許可または拒否される場合です。これを適用するために必要なデータと適用プロセスの両方は、通常、認可サーバーのコンテキストで定義されます。たとえば、ユーザーに関連付けられた app_metadata や、Auth0 テナントで定義した Action を使用する場合です。
2 つ目のカテゴリは、アプリケーションまたは API の特定の機能セットへのアクセスが許可または拒否される場合です。これを適用するために必要なデータは、通常、認可サーバーに保存されます。たとえば、Auth0 テナント内のユーザーの app_metadata を使用し、適用処理自体はアプリケーションまたは API 側で実行します。このシナリオでは、データは通常、id または access トークン内の 1 つ以上のカスタムクレームとして伝達されます。
3 つ目のカテゴリは、アプリケーションまたは API のコンテキスト内で、プリンシパル (subject) が何を操作できるかに応じてアクセスが許可または拒否される場合です。これを適用するために必要なデータと適用プロセスの両方は、通常、アプリケーションまたは API のコンテキストで定義されます。このシナリオでは、id または access トークン内の 1 つ以上のカスタムクレームとして伝達されるデータが、Auth0 以外の外部ソースのデータと組み合わせて、または組み合わせずに利用されることがあります。
さらに、Role-based Access Control (RBAC) や Attribute-based Access Control (ABAC) の仕組みは、上で説明したどのアクセス制御カテゴリにも適用できます。したがって、ユースケースが何であれ、必要な機能やワークフローを検討する際には、考慮すべき点がいくつかあります。
アプリケーションまたは API 全体へのアクセスを拒否すべきシナリオはありますか?
サードパーティアプリケーションからアクセスできる API を提供しますか?
API は、自社の (ファーストパーティ) アプリケーションからもアクセスされますか?
アプリケーションはサードパーティ API を呼び出しますか?
アプリケーションおよび/または API は、ユーザークレームに基づいてアクセス制御を適用すべきですか?
アプリケーションをファーストパーティとして設定し、その後 API を構成してファーストパーティクライアントが同意を省略できるようにすることは可能です。ただし、localhost を使用している場合、Auth0 はそのアプリケーションが本当にファーストパーティアプリであることを検証できないため、ユーザーには引き続き同意が求められます。この制約を回避するには、開発中にローカルマシンでテストする際は、ダミーのローカルホスト名を作成して代わりに使用してください。
ユーザーとの対話セッションを一切伴わないアプリケーションが、API を呼び出すためにアクセストークンを取得する必要があるケースは数多くあります。そのような場合は、ユーザーではなくクライアントを認証する必要があり、 2 では、これを簡単に実現できるように client credentials grant type が用意されています。一般的な例としては、次のようなものがあります。
API と通信する必要がある cron ジョブやその他のサービス (例: 日次レポートを生成して管理者にメール送信する場合) 。
特権アクセスをサポートする別個の API (例: API がユーザーに直接公開されず、バックエンドのみに公開される場合) 。
一部のマイクロサービス アーキテクチャで、ユーザーの関与なしに、またはユーザートークンの有効期限が切れた後に、一部の API レイヤーが他の API レイヤーと通信する必要がある場合。
ユーザーが認証される前に呼び出す必要がある特権 API (つまり、Auth0 テナント内の Action またはカスタム DB スクリプトから)
従来、こうしたシナリオに対応するために、特別な「サービスアカウント」を作成する方法が使われていました。これは、非対話型のユースケースをサポートするサービス向けに設定された、username とパスワードを持つユーザーです。しかし、この方法は多くの理由から現在では推奨されておらず、このような状況では OAuth 2.0 Client Credentials Grant を使用するのが現在のベストプラクティスです。