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

# 認可拡張でルールを使用する

> ルール内で認可拡張の情報を使用する方法について説明します。

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

  * [認可コア](/docs/ja-jp/manage-users/access-control/rbac)
  * [認可拡張機能](/docs/ja-jp/customize/extensions/authorization-extension)

  認可コアの機能セットは、認可拡張機能と同じ機能性を備え、性能と拡張性を向上させると同時に、認可拡張機能より柔軟なRBACシステムを提供します。

  現時点では、どちらもRBACの主要な機能を実装し、APIに対して定義されるカスタムスコープをユーザーに権限として割り当てられたスコープに制限することが可能です。
</Callout>

Auth0ルールを認可拡張と併用すると、次のようなことが可能になります：

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

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

詳細については、「[Auth0ルール](/docs/ja-jp/customize/rules)」をお読みください。

## 発行されたトークンにカスタムクレームを追加する

トークンにカスタムクレームを追加するには、認可拡張がそれを行うことを許可する追加のルールを作成します。カスタムクレームは、名前空間付きまたは名前空間なしでもかまいません。

詳細については、「[カスタムクレームを作成する](/docs/ja-jp/secure/tokens/json-web-tokens/create-custom-claims)

トークンに追加するクレームの数を制限する必要があります。

```javascript lines theme={null}
function (user, context, callback) {
  var namespace = 'http://yourdomain/claims/'; // You can set your own namespace, but do not use an Auth0 domain

  // Add the namespaced tokens. Remove any which is not necessary for your scenario
  context.idToken[namespace + "permissions"] = user.permissions;
  context.idToken[namespace + "groups"] = user.groups;
  context.idToken[namespace + "roles"] = user.roles;
  
  callback(null, user, context);
}
```

このルールは、認可拡張ルールの **［after（後）］** に実行する必要があります。これを確実に行うには、認可拡張ルールの下に配置してください。

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

## アプリのアクセスを制御する

また、アプリケーションへのアクセスを制御するなどの操作を行うために、認可拡張ルールの後に実行されるルールを記述することもできます。これを行う1つの方法は、アプリケーションメタデータを使用して、各アプリケーションに必要なロールを指定することです。

詳細については、[ルールを使用したメタデータの管理](/docs/ja-jp/manage-users/user-accounts/metadata/manage-metadata-rules)をお読みください。

### アプリのメタデータに必要なロールを設定する

ロールを使用してアプリのメタデータを設定できます。ロールとは、特定の機能セットを作成するためにグループ化された権限のグループです。この手順は、セットアップしたルールがどのアプリに対してアクションを実行するかを認識できるように、アプリに「タグ付け」することと考えることができます。

1. `context.clientMetadata`フィールドを `required_roles`で設定するには、[Auth0 Dashboard> Applications>Applications](https://manage.auth0.com/#/applications)で作業するアプリケーションを選択します。これにより、アプリケーションの **［Settings（設定）］** が表示されます。下にスクロールして、ページの下部にある **［Show Advanced Settings（詳細設定を表示）］** を選択します。
2. **［Application Metadata（アプリケーションメタデータ）］** の下に、 **［Key（キー）］** を `required_roles`に設定する項目を追加し、 **［Value（値）］** フィールドにロールをコンマ区切り形式でリストします。フィールドを追加するには、 **［+ Add（+ 追加）］** を選択します。
3. 終わったら、 **［Save Changes（変更を保存）］** を選択します。これで、このアプリケーションからログインすると、`context.clientMetadata`に、入力したロール値の文字列を含む`required_roles`が表示されます。

### ルールを適用するアプリロールを作成する

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

1. このルールを作成する前に、 **［Token Contents（トークンコンテンツ）］** の下の **［Roles（ロール）］** を有効にし、認可拡張ルールを公開します。
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);
   }
   ```

## もっと詳しく

* [認可拡張機能のデータをインポートまたはエクスポートする](/docs/ja-jp/customize/extensions/authorization-extension/import-and-export-authorization-extension-data)
* [認可拡張機能へのAPIアクセスの有効化](/docs/ja-jp/customize/extensions/authorization-extension/enable-api-access-to-authorization-extension)
* [認可拡張機能のトラブルシューティング](/docs/ja-jp/troubleshoot/authentication-issues/troubleshoot-authorization-extension)
