> ## 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.

> Auth0 Actions を使用して、カスタムロジックでロールベースのアクセス制御を拡張し、ログイン時にユーザーのロールを評価し、アクセストークンの permissions を追加または削除します。

# 認可を伴う Actions のサンプルユースケース

Auth0 [Actions](/docs/ja-jp/customize/actions) を使用すると、事前設定された[認可ポリシー](/docs/ja-jp/manage-users/access-control/authorization-policies)による決定結果を変更または補完できるため、[ロールベースのアクセス制御 (RBAC) ](/docs/ja-jp/manage-users/access-control/rbac)だけでは対応できない、より複雑なケースにも対処できます。Actions は実行順序に応じて、permissions が <Tooltip tip="アクセストークン: API へのアクセスに使用される、opaque な文字列または JWT 形式の認可クレデンシャル。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Access+Token">アクセストークン</Tooltip> に追加される前に、認可の決定結果を変更できます。また、トークンの内容をカスタマイズすることもできます。

<div id="allow-access-only-on-weekdays-for-a-specific-application">
  ## 特定のアプリケーションへのアクセスを平日のみに制限する
</div>

たとえば、平日にのみアクセスできるようにしたいアプリケーションがあるとします。[新しいActionを作成](/docs/ja-jp/customize/actions/write-your-first-action)し、Action をログインフローに追加するため、`Login / Post Login` トリガーを選択します。続いて、次のコードを Actions Code Editor にコピーします。

```js lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  if (event.client.name === "APP_NAME") {
    const d = new Date().getDay();

    if (d === 0 || d === 6) {
      api.access.deny("This app is only available during the week.");
    }
  }
}
```

最後に、作成したActionを[ログインフロー](https://manage.auth0.com/#/actions/flows/login/)に追加します。Actions を Flows にアタッチする方法については、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action)の「Action をフローに関連付ける」セクションを参照してください。

ユーザーが週末にアプリケーションへアクセスしようとした場合は、認証されており必要な権限を持っていても、アクセスは拒否されます。

<div id="allow-access-only-to-users-who-are-inside-the-corporate-network">
  ## 企業ネットワーク内からアクセスしているユーザーのみにアクセスを許可する
</div>

たとえば、アプリケーションへのアクセスは許可したいものの、企業ネットワーク内からそのアプリケーションにアクセスしているユーザーにだけ許可したいとします。[新しいActionを作成](/docs/ja-jp/customize/actions/write-your-first-action)し、Action をログインフローに追加するため、`Login / Post Login` トリガーを選択します。次のコードを Actions Code Editor にコピーしてください。

```js lines theme={null}
const ipaddr = require("ipaddr.js");

exports.onExecutePostLogin = async (event, api) => {
  const corpNetwork = "192.168.1.134/26";
  const currentIp = ipaddr.parse(event.request.ip);

  if (!currentIp.match(ipaddr.parseCIDR(corpNetwork))) {
    api.access.deny("This app is only available from inside the corporate network.");
  };
};
```

最後に、作成した Action を [ログインフロー](https://manage.auth0.com/#/actions/flows/login/) に追加します。Actions を Flows に関連付ける方法については、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action) の "Action をフローに関連付ける" セクションを参照してください。

ユーザーが社内ネットワークの外部にいる場合は、認証に成功し、適切な権限を持っていてもアクセスは拒否されます。

<Callout icon="file-lines" color="#0EA5E9" iconType="regular">
  `ipaddr.js` のような `npm` ライブラリを使用するには、そのライブラリを Action の依存関係として追加する必要があります。詳しくは、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action) の "依存関係を追加する" セクションを参照してください。
</Callout>

<div id="deny-access-to-anyone-calling-an-api">
  ## API を呼び出すすべてのユーザーのアクセスを拒否する
</div>

API を呼び出すすべてのユーザーのアクセスを拒否したいとします。つまり、API の `identifier` 値に基づいてアクセスを拒否する必要があります。この値は、[Auth0 Dashboard > アプリケーション > APIs](https://manage.auth0.com/#/apis) にある API の **API <Tooltip tip="Audience: 発行されたトークンの audience を一意に識別する値です。トークン内では aud という名前で表され、その値には、ID トークンではアプリケーション（Client ID）の ID、アクセストークンでは API（API 識別子）の ID が含まれます。" cta="用語集を見る" href="/docs/ja-jp/glossary?term=Audience">Audience</Tooltip>** フィールドで確認できます。[新しい Action を作成](/docs/ja-jp/customize/actions/write-your-first-action)し、この Action をログインフローに追加するために `Login / Post Login` トリガーを選択します。次のコードを Actions Code Editor にコピーします。

```js lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  // Actionsでは、APIはリソースサーバーと呼ばれます。
  const { identifier } = event.resource_server || {};
  if (identifier === "https://api.example.com") {
    api.access.deny("end_users_not_allowed");
  }
}
```

最後に、作成した Action を [ログインフロー](https://manage.auth0.com/#/actions/flows/login/) に追加してください。Actions を Flows に関連付ける方法については、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action) の "Action をフローに関連付ける" セクションを参照してください。

この場合、API の `identifier` の値は `https://api.example.com` なので、これが拒否する audience です。

<div id="add-user-roles-to-tokens">
  ## トークンにユーザーのロールを追加する
</div>

Auth0 が発行するトークンにユーザーのロールを追加するには、`event.authorization` オブジェクトを `api.idToken.setCustomClaim` メソッドおよび `api.accessToken.setCustomClaim` メソッドとともに使用します。[新しい Action を作成](/docs/ja-jp/customize/actions/write-your-first-action)し、Action をログインフローに追加するため、`Login / Post Login` トリガーを選択します。次のコードを Actions Code Editor にコピーします。

```js lines theme={null}
exports.onExecutePostLogin = async (event, api) => {
  const namespace = 'https://my-app.example.com';
  if (event.authorization) {
    api.idToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
    api.accessToken.setCustomClaim(`${namespace}/roles`, event.authorization.roles);
  }
}
```

最後に、作成した Action を [ログインフロー](https://manage.auth0.com/#/actions/flows/login/) に追加します。Actions を Flows に接続する方法については、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action) の「Action をフローに関連付ける」セクションを参照してください。

次の点に注意してください。

* 要求元のアプリケーションに返される <Tooltip tip="JSON Web トークン (JWT): 2 者間でクレームを安全に表現するために使用される標準的な ID トークン形式（多くの場合はアクセストークン形式でもあります）。" cta="用語集を表示" href="/docs/ja-jp/glossary?term=JWT">JWT</Tooltip> は、トリガー処理の最後に生成され、署名されます。最終的に署名された JWT には、Action 内からアクセスできません。

<div id="deny-access-to-specific-ja3ja4-fingerprints">
  ## 特定のJA3/JA4フィンガープリントへのアクセスを拒否する
</div>

`event.security_context` オブジェクトには、現在のトランザクションの JA3/JA4 フィンガープリント値が含まれています。

[新しいActionを作成](/docs/ja-jp/customize/actions/write-your-first-action)し、Action をログインフローに追加するため、`Login / Post Login` トリガーを選択します。次のコードを Actions Code Editor にコピーします：

```js lines theme={null}
exports.onExecutePreUserRegistration = async (event, api) => {
  const clientJa4 = event?.security_context?.ja4;
  console.log('[ACTION]', {clientJa4});
  const badFingerprints = ['t13d1517h2_8daaf6152771_b6f405a00624','t13d1516h2_8daaf6152771_d8a2da3f94cd'];
  if (clientJa4 && badFingerprints.includes(clientJa4)){
    api.access.deny('suspicious_tls_fingerprint', 'Your TLS fingerprint has been flagged as suspicious');
  }
};
```

最後に、作成した Action を [ログインフロー](https://manage.auth0.com/#/actions/flows/login/) に追加します。Actions を Flows に接続する方法については、[初めての Action を作成する](/docs/ja-jp/customize/actions/write-your-first-action) の「Action をフローに関連付ける」セクションを参照してください。
