- 認証: プリンシパル (ユーザーまたはアプリケーション) が、本人または名乗っているものであるかを確認するプロセス。
- 認可: プリンシパル、そのプリンシパルに付与されたアクセス権、および/またはコンテキストに応じたアクセス条件に基づいて、何が許可されるかを判断するプロセス。
- 同意: ユーザー () が、アプリケーションに対して代理で何を行うことを許可したかを指します。これは通常、委任された認可の要件です。ユーザーは、別のシステムにある自分のデータにアクセスする許可をクライアントに与える必要があります。
- ポリシー適用: アプリケーションまたは API のポリシーを適用し、ユーザーの認証情報および/または認可情報に基づいてアクセスを拒否または許可すること。
- 1 つ目のカテゴリは、アプリケーションまたは API 全体に対してアクセスが許可または拒否される場合です。これを適用するために必要なデータと適用プロセスの両方は、通常、認可サーバーのコンテキストで定義されます。たとえば、ユーザーに関連付けられた
app_metadataと、Auth0 テナントで定義された Action を使用する場合です。 - 2 つ目のカテゴリは、アプリケーションまたは API の特定の機能群に対してアクセスが許可または拒否される場合です。これを適用するために必要なデータは、通常、認可サーバーに保存されます。たとえば、Auth0 テナント内のユーザーに対して
app_metadataを使用し、適用プロセスはアプリケーションまたは API 自体で実行される場合です。このシナリオでは、データは通常、1 つ以上のカスタム クレームとしてidまたはaccessトークンで伝達されます。 - 3 つ目のカテゴリは、アプリケーションまたは API のコンテキストの中で、プリンシパル (subject) が何を操作できるかに応じてアクセスが許可または拒否される場合です。これを適用するために必要なデータと適用プロセスの両方は、通常、アプリケーションまたは API のコンテキストで定義されます。このシナリオでは、1 つ以上のカスタム クレームとして
idまたはaccessトークンで伝達されるデータが、Auth0 以外の外部ソースのデータとあわせて、または単独で利用されることがあります。
- アプリケーション全体または API 全体へのアクセスを拒否すべきケースはありますか?
- サードパーティアプリケーションからアクセスされる API を提供する予定はありますか?
- API は、自社の (ファーストパーティ) アプリケーションからもアクセスされますか?
- アプリケーションからサードパーティの API を呼び出しますか?
- アプリケーションや API で、ユーザーの クレーム に基づくアクセス制御を適用する必要はありますか?
- または がどの組織に関連付けられているかを把握する必要がある場合はどうすればよいですか?
app_metadata に適切な クレーム が含まれていない場合に、UnauthorizedError を返す Action を作成したいことがあります。OpenID Connect (OIDC) を使用するアプリケーションでは、これによりアクセス認可に使用される ID トークン の発行を防ぐことができます。同様に API の場合も、API 呼び出し時に使用される OAuth2 の アクセストークン の発行を、この例で説明されているように防ぐことができます。
Auth0 はまた、アプリケーションが制限を適用するために必要な情報を提供することもできます。アプリケーションレベルの統合では、Auth0 により ID トークン にカスタムクレームを追加でき、アプリケーション側でそれを検証してポリシーの適用に利用できます。この場合は、アプリケーションが適用判断を行うためにどの情報を必要とするかを決める必要があります。アプリケーション内ではなく API 側で判断を行う必要がある場合は、ID トークン ではなく アクセストークン を使用することになる可能性が高いでしょう。詳細はこのまま読み進めてください。
API レベルの統合では、Auth0 は アクセストークン のコンテキスト内で、カスタムクレームとスコープの再構成の両方をサポートしています。ここでも、API がアクセス判断を行うためにどの情報が必要になるかを決める必要があり、そのために API は アクセストークン の内容を検証して制御を適用する必要があります。
複数組織にまたがるシナリオでは、アクセストークン (あるいは ID トークン) がどの組織に適用されるものかを把握することが重要になる場合がよくあります。ベストプラクティスに沿って進めることで、時間と労力を節約できます。
アプリケーション統合
このシナリオでは、お使いの Auth0 テナントは、アプリケーションへの認可されたアクセスを示すものとしてトークンを提供します。OpenID Connect (OIDC) を利用するアプリケーションの場合、特に顧客向けアプリケーションで最も広く使われている業界標準プロトコルであることから、このトークンは JWT 形式の IDトークン になります。ID トークン クレーム
Auth0 では、Actions の拡張機能を使うことで、たとえばユーザーのメタデータの内容に基づいて、ID トークン にカスタムクレームを追加できます。これにより、アプリケーションは ID トークン に必要なクレームが含まれているかを検証し、必要に応じて特定の機能へのアクセスを許可または拒否できます。なお、Actions を使ったカスタムクレームの追加は簡単に行えますが、Actions は柔軟性が高いため、記述したカスタムコードが悪影響を及ぼす可能性もあります。 顧客組織ごとにアプリケーションのインスタンスを分けている場合は、ユーザーの所属組織を表すカスタムクレームを ID トークンに作成するのが一般的です。たとえば、次のようになります。IDトークンのスコープ
OIDC スコープ は通常、認証時にユーザーの詳細情報へのアクセスについて同意を取得するために、アプリケーションで使用されます。あらかじめ定義された各スコープは、定義されている場合、OIDC specification に記載されているとおり、一連の標準クレームを返します。アプリケーションが要求するスコープは、そのアプリケーションで必要なユーザー属性によって異なります。要求されたスコープがユーザーに承認されると、クレームはIDトークン内に返され、 /userinfo エンドポイントからも取得できます。API 連携
このシナリオでは、Auth0 テナントは OAuth2 の アクセストークン (通常は JWT) を発行でき、API はそれを使って特定の相手に対するアクセスを制限できます。さらに、Auth0 は概念的に First-Party and Third-Party Applications の両方をサポートしています。 認可サーバーとして動作する Auth0 テナントは、ユーザー (リソース所有者) の同意を得たうえで、アプリケーション (クライアント) に アクセストークン (通常は JWT) を発行できます。これにより、そのアプリケーションはリソース所有者に代わって、 でホストされている保護されたリソースにアクセスできます。発行された アクセストークン は通常、API に送信される HTTP Authorization ヘッダー内で Bearer トークンとして渡されます。 単一の API でも、論理的に関連する microservice APIs 群でも、Auth0 が提供する アクセストークン を利用してサービスへのアクセスを保護できます。Auth0 Dashboard または Auth0 Management API を通じて比較的簡単に設定できますが、自社システムに最適なアーキテクチャを判断するには、さまざまなアプリケーションのシナリオと API の構成を確認することが重要です。OAuth2 アクセストークン は主に、公開 API を保護するために設計されています。JWT として表現される場合、アクセストークン は自己完結型のエンティティであり、追加のサードパーティ API 呼び出しを行わなくても検証できます。API がこのカテゴリに当てはまらない場合、つまりアプリケーション自体の一部であってそのアプリケーションからしか呼び出されない場合や、ファイアウォールの内側に配置されている場合は、トークンで保護するのは過剰かもしれず、既存の cookie ベース (など) のワークフローで十分なこともあります。
アクセストークンのクレーム
ID トークンと同様に、Auth0 Actions の拡張機能を使用して、アクセストークンにカスタムクレームを追加できます。追加すると、API でアクセストークンに必要なクレームが含まれているかを検証し、必要に応じて特定の機能へのアクセスを許可または拒否できます。アクセストークンのスコープ
OAuth2 スコープ は通常、API がユーザーに代わって実行可能な操作を判断するための仕組みとして使用されます。スコープは API ごとに追加でき、 または Auth0 ) で特定のアクセス権限を定義できます。スコープは Auth0 の拡張機能を使って操作することもできます (たとえば Action を使用する場合。この例を参照してください) 。アプリケーションが API へのアクセスのために要求するスコープは、アプリケーションがユーザーの許可を得て利用したい機能に応じたものであるべきです。要求されたスコープが承認されると、それらはアクセストークンに含まれて返され、続いて 該当する API によって検証 できます。その一例が、ソーシャルプロバイダーを使ってログインするアプリケーションにサインインする場合です。ソーシャルプロバイダーの API では、アプリケーションがユーザーに代わって投稿を行うかどうかを、アプリケーション側で指定する必要があります。これにより、ユーザーはその要求を承諾するか拒否するかを選べます。この例が示しているのは、ユーザーがアプリケーションに権限を委譲しているということです。これは、API がユーザーのロールに基づいてアクセスを制限するのとは異なるため、別の方法で扱う必要があります。 スコープはユーザーのアクセス権限を適用する手段としてよく使われますが、このような使い方をすると扱いが難しくなることがあります。そのため、スコープは本来の目的 (つまり、アプリケーションへの権限委譲) のために使い、ロールベースやその他のアクセス制御のシナリオではカスタムクレームを使うことをお勧めします。きめ細かな認可 (FGA)
きめ細かな認可 を使用すると、次の条件に基づいて、特定のリソースまたはオブジェクトへのアクセス権を個々のユーザーに付与できます。editorやadminなど、組織内でのユーザーの役割- ユーザーの
managerやオブジェクトのmarketingなど、ユーザーまたはオブジェクトの属性 - 親フォルダーへの閲覧権限を持つユーザーは子フォルダーへの閲覧権限も持つ、といったユーザーとオブジェクトの関係
ロールベースアクセス制御 (RBAC)
Auth0 は、ロールベースアクセス制御 (RBAC) を標準でサポートしています。RBAC とは、組織内での役割に基づいてユーザーに権限を割り当てることを指し、より管理しやすくエラーも起こりにくい方法を提供することで、アクセス制御を簡素化します。 RBAC の中核機能は、多くのマルチ組織環境で利用できます。設定で RBAC の要件を確実に満たす方法の詳細については、アクセストークン内の組織データを参照してください。マシン間 (M2M) 認可
ユーザーが対話的に操作するセッションなしで、API を呼び出すためのアクセストークンをアプリケーションが取得しなければならないケースは数多くあります。そのような場合は、ユーザーではなくクライアントを認証する必要があります。 2 では、これを簡単に実現するために client credentials グラントタイプが提供されています。一般的な例としては、次のようなものがあります。- API と通信する必要がある cron ジョブやその他のサービス (例: 日次レポートを生成し、管理者にメールで送信する必要がある場合) 。
- 特権アクセスをサポートする別の API (例: その API はユーザーには直接公開されず、バックエンドのみに公開される場合) 。
- 一部のマイクロサービス アーキテクチャで、ユーザーの関与なしに API レイヤー間で通信する必要がある場合や、ユーザートークンの有効期限が切れたあとに通信する必要がある場合。
- ユーザーの認証前に呼び出す必要がある特権 API (つまり、Auth0 テナント内の Action やカスタム DB スクリプトから呼び出す場合) 。
アクセストークン内の組織データ
システム内で、複数組織対応アプリケーションを支えるために、アプリケーションとは別の API を用意している場合は、トークンが生成された組織に対してのみ操作を制限することが重要です。そのためには、API がそのアクセストークンがどの組織向けに発行されたものかを判断できるよう、アクセストークン内に何らかの情報を含める必要があります。これは、いくつかの簡単な質問への答えに応じて、いくつかの方法で実現できます。- この組織のエンドユーザーは、複数の組織に属する可能性がありますか。それとも、各エンドユーザーは特定の組織に限定されますか。
- API への マシン間 (M2M) アクセスを許可しますか。
- API への マシン間 (M2M) アクセスを許可する場合、複数の組織 (ただし、すべての組織ではない) にアクセスするために、単一のクライアント ID とシークレットを必要とする開発者はいますか。
- 同意を必要とするサードパーティアプリの作成を許可しますか。
- まず、カスタムパラメータを作成しなくても、audience を Auth0 に正式なパラメータとして渡せます。これにより、Auth0 が audience の存在を検証し、Actions にもそれを渡してくれます。また、発行されたリフレッシュトークンが、元々発行された特定の audience に対してのみ機能することも保証されます。
- これにより、特定の組織に対してのみクライアントグラントを標準機能で制限できるようになります。代替案としては、より複雑な client credentials hook を作成して、制限を別の場所から取得しようとする必要があり、さらに、クライアントクレデンシャル呼び出しでどの組織向けにアクセストークンを発行するかを指定するための、はるかに複雑で問題を招きかねない方法も必要になります。
- さらに、Auth0 のコア RBAC 機能も利用できるため、複数の組織にアクセスできるエンドユーザーに対して、組織ごとに異なるロールを設定できます。