GrantForge は業務アプリケーションに対して 2 つの顔を持ちます。
- 認可サーバー(OAuth 2.1 / OpenID Connect):ユーザーは GrantForge にログインし、アプリケーションはアクセストークンと ID トークンを取得します。
- 権限センター:アプリケーションは同じトークンで GrantForge に、このユーザーがこのアプリケーションでどのようなロール、リソース(メニュー、ページ、ボタン)、API 権限、データ範囲を持つかを問い合わせます。
概念の対応
| 概念 | 設定する場所 | 説明 |
|---|---|---|
| アプリケーション | プラットフォーム管理 → リソースカタログ | 1 つの業務システム。例: shop |
| リソース | リソースカタログ内のアプリケーションのリソースツリー | モジュール、メニュー、ページ、ボタン、API。ページとボタンはインターフェースを制御し、API リソースは API 権限のコードです(例: orders.read) |
| クライアント | リソースカタログ → アプリケーションの「OAuth クライアント」 | アプリケーションがユーザーをログインさせ、トークンを取得するためのアイデンティティです。ブラウザアプリケーションは公開クライアント、サーバー側アプリケーションは機密クライアントを使います |
| scope | クライアントの設定 | openid、profile、email はログイン用です。permissions はトークンで権限を照会できるようにし、catalog はアプリケーションが自身のアイデンティティでデータエンティティを宣言できるようにします |
| ロールと権限付与 | アクセス制御 → ロール管理 | アプリケーションのリソースをロールに付与し、ロールをユーザー、ユーザーグループ、部門または職位に割り当てます |
| データポリシー | ロール → データ権限 | アプリケーションが宣言したエンティティ(<アプリケーションコード>:<エンティティ>)も、コンソール自身のエンティティと同じように設定します: すべて、自テナント全体、本人のみ、部門、指定部門、または条件別 |
テナント管理者(システムロールを保持する人)は、業務アプリケーションのどのリソースでも自テナントのロールに付与できます。コンソール自身の権限は、引き続き自分が持っている範囲までしか付与できません。
流れ
sequenceDiagram participant B as ブラウザ participant A as 業務アプリケーション participant G as GrantForge B->>G: /oauth2/authorize(PKCE) G-->>B: 未ログインの場合はコンソールのログインページに移動し、ログイン後に認可の要求に戻ります G-->>B: アプリケーションのコールバックアドレスに戻ります。code を伴います B->>G: /oauth2/token(code + code_verifier) G-->>B: アクセストークン、ID トークン B->>G: /api/v1/open/me/authorization(Bearer) G-->>B: ロール、リソース、API 権限(ETag) B->>A: アプリケーション API を呼び出します(Bearer) A->>G: /api/v1/open/me/authorization、/data-access(同じトークン) A-->>B: ユーザーが利用できるデータのみを返します
連携の手順
- プラットフォーム管理 → リソースカタログ でアプリケーションを新規作成し、ページ、ボタン、API のリソースを用意します。
- アプリケーションのクライアントを登録します。ブラウザアプリケーションは「公開」、サーバー側アプリケーションは「機密」を選択し、コールバックアドレスにはアプリケーションのログインコールバックを入力し、scope は少なくとも
openidとpermissionsを選択します。機密クライアントのシークレットは一度だけ表示されます。 - アクセス制御 → ロール管理 でロールを作成し、権限を付与して、ユーザーに割り当てます。
- アプリケーションに SDK を連携します。Java は Java SDK、ブラウザは JavaScript SDK を参照し、プロトコルの詳細は OAuth 2.1 と OpenID Connect と 権限照会用のオープン API を参照してください。
リポジトリの samples/ には 2 つの完全なサンプル(ショップとノート)があり、エンドツーエンドのテストでカバーされています。サンプルアプリケーション を参照してください。
