> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

> Authorization Extension の情報をルールで使用する方法について説明します。

# Authorization Extension でルールを使用する

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  Auth0 では、ロールベースのアクセス制御 (RBAC) を実装する方法が 2 つ用意されており、API 独自の内部アクセス制御システムの代わりに、またはそれと組み合わせて使用できます。

  * [Authorization Core](/docs/ja-jp/manage-users/access-control/rbac)
  * [Authorization Extension](/docs/ja-jp/customize/extensions/authorization-extension)

  Authorization Core feature set は Authorization Extension と同等の機能を備えつつ、パフォーマンスとスケーラビリティを向上させ、Authorization Extension より柔軟な RBAC システムを提供します。

  現在、どちらも RBAC の主要な機能を実装しており、API 用に定義されたカスタムスコープを、ユーザーに権限として割り当てられているものだけに制限できます。
</Callout>

Auth0 ルールを Authorization Extension と組み合わせると、次のようなことができます。

* 発行されたトークンにカスタムクレームを追加する。
* ユーザーのグループメンバーシップ、ロール、権限を判別する。
* ユーザーのグループ、ロール、権限の情報を `app_metadata` の一部として保存する。
* ユーザーのグループ、ロール、権限を送信されるトークンに追加する (これらは `openid groups permissions roles` スコープで要求できます) 。

上記のロジックはルールの一部であるため、ログインのコンテキストでのみ実行されます。ユーザーがグループに追加またはグループから削除された場合、この変更が Auth0 に反映されるのは、ユーザーが次回ログインした後になります。

詳しくは、[Auth0 ルール](/docs/ja-jp/customize/rules) をご覧ください。

<div id="add-custom-claims-to-the-issued-token">
  ## 発行されたトークンにカスタムクレームを追加する
</div>

トークンにカスタムクレームを追加するには、Authorization Extension が追加できるようにするルールを別途作成します。カスタムクレームは、名前空間付きにすることも、非名前空間にすることもできます。

詳しくは、[Create Custom Claims.](/docs/ja-jp/secure/tokens/json-web-tokens/create-custom-claims) をご覧ください。

トークンに追加するクレームの数は、必要最小限に抑えるようにしてください。

```javascript lines theme={null}
function (user, context, callback) {
  var namespace = 'http://yourdomain/claims/'; // 独自のネームスペースを設定できますが、Auth0 domainは使用しないでください

  // 名前空間付きトークンを追加します。シナリオに不要なものは削除してください
  context.idToken[namespace + "permissions"] = user.permissions;
  context.idToken[namespace + "groups"] = user.groups;
  context.idToken[namespace + "roles"] = user.roles;
  
  callback(null, user, context);
}
```

このルールは、Authorization Extension のルールの**後**に実行される必要があります。確実にその順序になるよう、このルールは Authorization Extension のルールより下に配置してください。

`/authorize` エンドポイントを呼び出す場合や Lock を設定する場合は、`scope` に含める情報として `groups`、`permissions`、および/または `roles` を指定する必要があります。

<div id="control-app-access">
  ## アプリケーションへのアクセスを制御する
</div>

Authorization Extension ルールの後で実行されるルールを作成して、アプリケーションへのアクセスを制御することもできます。その方法の 1 つは、アプリケーション メタデータを使用して、各アプリケーションに必要なロールを指定することです。

詳しくは、[ルールでメタデータを管理する](/docs/ja-jp/manage-users/user-accounts/metadata/manage-metadata-rules)を参照してください。

<div id="set-app-metadata-required-roles">
  ### アプリのメタデータに必須ロールを設定する
</div>

アプリのメタデータにロールを設定できます。ロールとは、特定の機能セットを実現するためにまとめた権限のグループです。この手順は、設定したルールがどのアプリに対して動作すべきかを識別できるように、アプリに「タグ付け」するものと考えてください。

1. ⁠⁠⁠⁠`required_roles` を指定して `context.clientMetadata` フィールドを設定するには、[Auth0 Dashboard > アプリケーション > アプリケーション](https://manage.auth0.com/#/applications) で対象のアプリケーションを選択します。
   すると、そのアプリケーションの **設定** が表示されます。下にスクロールし、ページ下部の **高度な設定を表示** を選択します。
2. **アプリケーションのメタデータ** で項目を追加し、**キー** に `required_roles` を設定します。**値** フィールドには、ロールをカンマ区切りで入力します。フィールドを追加するには **+ 追加** を選択します。
3. 完了したら、**変更を保存** を選択します。これで、このアプリケーションからログインすると、`context.clientMetadata` に、入力したロール値の文字列を持つ `required_roles` が含まれるようになります。

<div id="create-rule-enforcing-app-roles">
  ### アプリのロールを強制するルールを作成する
</div>

これで各アプリに関連付けられたロールが設定されたので、このアプリ情報をコンテキストとして使って実行されるルールを作成できます。

1. このルールを作成する前に、**Token Contents** の **Roles** を有効にし、Authorization Extension ルールを公開します。
2. このルールを追加し、生成された "auth0-authorization-extension" ルールの後に配置されていることを確認します。
3. `required_roles` を設定したら、次の内容で新しい[ルール](https://manage.auth0.com/#/rules)を作成します。

   ```javascript lines theme={null}
   function (user, context, callback) {
     context.clientMetadata = context.clientMetadata || {};
     if (context.clientMetadata.required_roles && context.clientMetadata.required_roles.length){
       if (user.roles) {
         var _ = require('lodash');
         var roles = context.clientMetadata.required_roles.split(',');
         var matchingRoles =_.filter(user.roles, function(roleName) {
           return _.includes(roles, roleName);
         });

         if (matchingRoles && matchingRoles.length) {
           return callback(null, user, context);
         }
       }

       return callback(new UnauthorizedError('You do not have the required role to access ' + context.clientName));
     }

    callback(null, user, context);
   }
   ```

<div id="learn-more">
  ## 詳細はこちら
</div>

* [Authorization Extension のデータのインポートとエクスポート](/docs/ja-jp/customize/extensions/authorization-extension/import-and-export-authorization-extension-data)
* [Authorization Extension の API Access を有効にする](/docs/ja-jp/customize/extensions/authorization-extension/enable-api-access-to-authorization-extension)
