組織(非 API)権限の保護
Logto の組織テンプレートを利用して、組織レベルのロールと権限を管理・適用し、組織コンテキスト内でのアプリ機能やワークフローへのアクセスを制御できます。
組織(非 API)権限とは?
組織権限(非 API)は、組織コンテキスト内でユーザーが何をできるかを制御しますが、API レベルでは強制されません。代わりに、バックエンド API ではなく、アプリの機能、UI 要素、ワークフロー、ビジネスアクションへのアクセスを管理します。
ユースケース例
- 組織内でのメンバー招待や管理
- 組織ロールの割り当てや変更
- 組織の請求、設定、管理機能の管理
- API エンドポイントを持たないダッシュボード、分析、内部ツールへのアクセス
Logto では、OAuth 2.1 とロールベースのアクセス制御 (RBAC) を利用して、これらの組織権限をセキュアに管理でき、マルチテナント SaaS アーキテクチャにも対応しています。
これらの権限は 組織テンプレート で定義された組織ロールを通じて管理されます。すべての組織が同じテンプレートを利用するため、全組織で一貫した権限モデルが保証されます。
Logto での仕組み
- 組織レベルの RBAC:ロールと権限は組織テンプレートで定義されます。ユーザーが組織に参加すると、1 つ以上のロールが割り当てられ、特定の権限が付与されます。
- 非 API 強制:権限はアプリの UI、ワークフロー、またはバックエンドロジックでチェック・適用され、必ずしも API ゲートウェイで強制されるわけではありません。
- API 保護との分離:組織(非 API)権限は API リソース権限とは別物です。高度なシナリオでは両方を組み合わせて利用できます。

実装概要
- Logto の組織テンプレートで組織権限を定義します。
- 組織固有のアクションに必要な権限をまとめた組織ロールを作成します。
- 各組織内のユーザーやクライアントにロールを割り当てます。
- リフレッシュトークンまたはクライアントクレデンシャルフローを使って、現在の組織の組織トークン(JWT)を取得します。
- アプリの UI やバックエンドでアクセストークンを検証し、組織権限を強制します。
認可フロー:組織権限の認証と保護
以下のフローは、クライアント(Web、モバイル、バックエンド)が非 API 権限の強制のために組織トークンを取得・利用する流れを示しています。
このフローは必要なパラメータやヘッダーの詳細を網羅しているわけではなく、主要なステップに焦点を当てています。実際の動作例はこの後の説明を参照してください。
ユーザー認証 = ブラウザ/アプリ。M2M = クライアントクレデンシャル + 組織コンテキストを使うバックエンドサービスやスクリプト。
実装手順
組織権限の登録
-
コンソール → 組織テンプレート → 組織権限
にアクセスします。 - 必要な組織権限を定義します(例:
invite:member、manage:billing、view:analyticsなど)。
詳細な設定手順は 組織権限の定義 を参照してください。
組織ロールの設定
-
コンソール → 組織テンプレート → 組織ロール
にアクセスします。 - 先ほど定義した組織権限をまとめたロールを作成します(例:
admin、member、billingなど)。 - これらのロールを各組織内のユーザーやクライアントに割り当てます。
詳細な設定手順は 組織ロールの利用 を参照してください。
組織トークン(非 API)の取得
クライアント/アプリは、組織権限へアクセスするために組織トークン(非 API)を取得する必要があります。Logto は JSON Web Token (JWT) 形式で組織トークンを発行します。リフレッシュトークンフロー または クライアントクレデンシャルフロー のいずれかで取得できます。
リフレッシュトークンフロー
ほぼすべての Logto 公式 SDK は、リフレッシュトークンフローによる組織トークンの取得を標準でサポートしています。標準的な OAuth 2.0 / OIDC クライアントライブラリでもこのフローを実装できます。
- Logto SDK
- OAuth 2.0 / OIDC client library
Logto SDK を初期化する際、scopes パラメータに urn:logto:scope:organizations および必要な組織権限(スコープ)を追加します。
一部の Logto SDK には、UserScope.Organizations など組織用の事前定義スコープがあります。
ID トークンの organizations クレーム (Claim) を確認すると、ユーザーが所属している組織 (Organization) の ID 一覧を取得できます。このクレーム (Claim) には、ユーザーがメンバーであるすべての組織 (Organization) がリストされているため、アプリ内で組織 (Organization) の列挙や切り替えが簡単に行えます。
特定の組織の組織トークンをリクエストするには、getOrganizationToken または getAccessToken(組織 ID 指定)などのメソッドを利用します。
各 SDK の詳細は クイックスタート を参照してください。
OAuth 2.0 クライアントの設定や認可コードフローの初期化時に、以下のパラメータを含めてください:
resource:urn:logto:resource:organizationsを指定し、組織トークンを要求することを示します。scope:事前定義の組織スコープ(urn:logto:scope:organizations)、offline_access(リフレッシュトークン取得用)、および必要な組織権限(例:invite:member、manage:billingなど)を含めます。
一部のライブラリは resource パラメータをネイティブにサポートしていませんが、通常は認可リクエストで追加パラメータを渡せます。詳細はライブラリのドキュメントを確認してください。
認可リクエストの非公式例:
GET /oidc/auth?response_type=code
&client_id=your-client-id
&redirect_uri=https://your-app.com/callback
&scope=openid profile offline_access urn:logto:scope:organizations invite:member manage:billing
&resource=urn:logto:resource:organizations
&code_challenge=abc123
&code_challenge_method=S256
&state=xyz
HTTP/1.1
Host: your.logto.endpoint
ユーザーが認証されると、認可コードが返却されます。このコードを使って Logto の /oidc/token エンドポイントに POST リクエストを送信します。
トークンリクエストの非公式例:
POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Content-Type: application/x-www-form-urlencoded
Authorization: Basic base64(client_id:client_secret)
grant_type=authorization_code
&code=authorization-code-received
&redirect_uri=https://your-app.com/callback
現時点では、Logto は認可コードフローから直接組織トークンを取得することをサポートしていません。組織トークンを取得するには、リフレッシュトークンフローを使用する必要があります。
リフレッシュトークンが返却され、組織トークンの取得に利用できます。
ID トークンの organizations クレーム (Claim) を確認すると、ユーザーが所属している組織 (Organization) の ID 一覧を取得できます。このクレーム (Claim) には、ユーザーがメンバーであるすべての組織 (Organization) がリストされているため、アプリ内で組織 (Organization) の列挙や切り替えが簡単に行えます。
最後に、リフレッシュトークンを使って Logto の /oidc/token エンドポイントに POST リクエストを送り、組織トークンを取得します。以下を含めることを忘れずに:
organization_idパラメータに希望する組織 ID を指定- (オプション)
scopeパラメータで必要な権限をさらに絞り込む(例:manage:members view:reportsなど)
トークンリクエストの非公式例:
POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Content-Type: application/x-www-form-urlencoded
Authorization: Basic base64(client_id:client_secret)
grant_type=refresh_token
&refresh_token=your-refresh-token
&organization_id=your-organization-id
クライアントクレデンシャルフロー
マシン間通信 (M2M) シナリオでは、クライアントクレデンシャルフローを利用して組織権限用のアクセストークンを取得できます。Logto の /oidc/token エンドポイントに組織パラメータを含めて POST リクエストを送信し、クライアント ID とシークレットで組織トークンをリクエストします。
リクエストに含める主なパラメータ:
organization_id:トークンを取得したい組織の IDscope:リクエストしたい組織権限(例:invite:member、manage:billingなど)
クライアントクレデンシャルグラントタイプによるトークンリクエストの非公式例:
POST /oidc/token HTTP/1.1
Host: your.logto.endpoint
Content-Type: application/x-www-form-urlencoded
Authorization: Basic base64(client_id:client_secret)
grant_type=client_credentials
&organization_id=your-organization-id
&scope=invite:member manage:billing
組織トークンの検証
Logto が発行する組織トークン(JWT)には、アプリ/UI/バックエンドで組織レベルのアクセス制御を強制するためのクレームが含まれています。
アプリが組織トークンを受け取った際は、次の点を確認してください:
- トークン署名の検証(Logto の JWKs を利用)
- トークンの有効期限(
expクレーム)の確認 iss(発行者)が Logto エンドポイントと一致しているかaud(オーディエンス)がフォーマットされた組織識別子(例:urn:logto:organization:{organization_id})と一致しているかscopeクレーム(スペース区切り)を分割し、必要な権限が含まれているか
ステップごとのガイドや言語別ガイドは アクセストークンの検証方法 を参照してください。
Optional: Handle user permission change
User permissions can change at any time. Because Logto issues JWTs for RBAC, permission updates only appear in newly issued tokens, and never modify existing JWTs.
An access token can only include scopes that were requested in the original OAuth authorization flow. Even if a user gains new permissions, the token issued later can only contain a subset of the originally requested scopes. To access newly granted scopes that were not part of the initial request, the client must run a new authorization flow.
Downscoped permissions
When a user loses permissions:
- Newly issued tokens immediately reflect the reduced scopes.
- Existing JWTs keep the old scopes until they expire.
- Your API should always validate scopes and rely on short token lifetimes.
If you need faster reactions, implement your own signal that tells clients to refresh their tokens.
Enlarged permissions
For organization tokens, when a user gains permissions, enlarged permissions will show up on the next issuance (refresh or token request). A new token is still required, but no full re-auth is needed unless the new scopes exceed the original request set.
Recommendations
- Validate scopes in your API on every call.
- Keep token expiration short.
- Add optional notifications if you need immediate permission-change propagation.
ベストプラクティスとセキュリティのヒント
- UI のみの強制に頼らない:重要なアクションは必ずバックエンドでも権限を検証してください。
- オーディエンス制限を利用:
audクレームを必ず確認し、トークンが意図した組織用であることを保証してください。 - ビジネス主導の権限設計:実際のアクションに対応する明確な名前を使い、各組織ロールに必要なものだけを付与してください。
- API 権限と非 API 権限は可能な限り分離(ただし両方を 1 つのロールに含めることも可能)。
- プロダクトの進化に合わせて組織テンプレートを定期的に見直す。
よくある質問
1 つのロールに組織権限と非組織権限を混在できますか?
いいえ、組織権限(組織レベルの API 権限を含む)は組織テンプレートで定義されており、グローバル API 権限と混在できません。ただし、組織権限と組織レベルの API 権限を含むロールは作成できます。
非 API 権限はどこで強制すべきですか?
非 API 権限は、UI(機能制御用)とサーバーサイドロジック(重要なアクション用)の両方でチェックしてください。
さらに読む
アクセストークンの検証方法 トークンクレームのカスタマイズユースケース:マルチテナント SaaS アプリケーションの構築