# アクセス制御

> Control access to Unity Gaming Services by creating rules to restrict service APIs.

[Access Control サービス](/services/access-control.md) を介して、Cloud Code を含む Unity Gaming Services (UGS) へのアクセスを制御できます。

Access Control を使用すると、ルールを作成して、プレイヤーに対して使用可能にしないサービス API へのアクセスを制限できます。

> **Note:**
>
> プレイヤーにモジュールへのアクセスを許可すると、ゲームのセキュリティが低下します。詳細については、[サーバー主導](/cloud-code.md) を参照してください。

## Cloud Code モジュールへのプレイヤーのアクセスを制御する例##control-player-access-to-cloud-code-modules-example

以下の例は、Cloud Code サービス API へのアクセスを拒否するポリシーに基づいてプロジェクトを作成する方法を示します。プレイヤーからの直接リクエストを拒否する一方で Cloud Code C# モジュールをトリガーに関連付けて、ゲームのセキュリティを向上させます。[UGS CLI ツール](https://services.docs.unity.com/guides/ugs-cli/latest/access/Access%20Command%20Line/overview/) でアクセスポリシーを作成できます。

## 前提条件##prerequisites

最初に、必要なアクセスロールでサービスアカウントを作成し、[UGS CLI](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/) を設定する必要があります。

### サービスアカウントを使用した認証##authenticate-using-a-service-account

Scheduling および Triggers サービスを呼び出す前に、サービスアカウントを使用して認証する必要があります。

1. [Unity Dashboard](https://cloud.unity.com) に移動します。
2. **Administration** (管理) > **Service Accounts** (サービスアカウント) を選択します。
3. **New** (新規) ボタンを選択し、サービスアカウントの名前と説明を入力します。
4. **Create** (作成) を選択します。

製品ロールを追加し、キーを作成します。

1. **Manage product roles** (製品ロールの管理) を選択します。
2. 以下のロールをサービスアカウントに追加します。

* LiveOps ドロップダウンから、**Triggers Configuration Editor** (Triggers 設定編集者)、**Triggers Configuration Viewer** (Triggers 設定閲覧者)、**Scheduler Configuration Editor** (Scheduler 設定編集者)、**Scheduler Configuration Viewer** (Scheduler 設定閲覧者) を選択します。
* Admin (管理者) ドロップダウンから、**Unity Environments Viewer** (Unity 環境閲覧者)、**Project Resource Policy Editor** (プロジェクトリソースポリシー編集者)、**Project Resource Policy Reader** (プロジェクトリソースポリシー閲覧者) を選択します。

3. **Save** (保存) を選択します。
4. **Add Key** (キーの追加) を選択します。
5. base64 エンコードを使用して **Key ID** (キー ID) と **Secret key** (秘密鍵) をエンコードします。形式は "key\_id:secret\_key" です。この値をメモしておきます。

詳細については、[Authentication](../authentication) を参照してください。

### UGS CLI の設定##configure-the-ugs-cli

以下のステップに従って、UGS CLI の使用を準備します。

1. [UGS CLI をインストール](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/install-the-cli/) します。

2. 以下を使用して、プロジェクト ID と環境を設定します。
   `ugs config set project-id <your-project-id>`
   `ugs config set environment-name <your-environment-name>`

3. 前に作成したサービスアカウントを使用して認証します。詳細については、[認証の取得](https://services.docs.unity.com/guides/ugs-cli/latest/general/get-started/get-authenticated/) を参照してください。

### モジュールエンドポイントの作成##create-a-module-endpoint

プロジェクト内のすべての接続済みプレイヤーにメッセージをブロードキャストする Cloud Code モジュールを [作成](/cloud-code/modules/how-to-guides/write-modules.md) します。

詳細については、[プッシュメッセージの送信](/cloud-code/modules/how-to-guides/push-messages.md) を参照してください。

```csharp
using Microsoft.Extensions.DependencyInjection;
using Unity.Services.CloudCode.Core;
using Unity.Services.CloudCode.Apis;

namespace HelloWorld
{
    public class HelloWorld
    {
        [CloudCodeFunction("SendProjectMessage")]
        public async Task SendProjectMessage(IExecutionContext context, PushClient pushClient, string message, string messageType)
        {
            await pushClient.SendProjectMessageAsync(context, message, messageType);
        }
    }

    public class ModuleConfig : ICloudCodeSetup
    {
        public void Setup(ICloudCodeConfig config)
        {
            config.Dependencies.AddSingleton(PushClient.Create());
        }
    }
}
```

モジュールをデプロイします。

モジュールのデプロイ方法を学習するには、[Hello World のデプロイ](/cloud-code/modules/getting-started.md#deploy-the-module) を参照してください。

### アクセスを制限するアクセス制御プロジェクトポリシーの作成##create-an-access-control-project-policy-to-restrict-access

以下のコンテンツで `project-policy.json` ファイルを作成して、プレイヤーによるモジュールエンドポイントへの直接アクセスを拒否するポリシーを作成します。

```json
{
  "statements": [
    {
      "Sid": "DenyPlayerAccessForSendingMessageToProject",
      "Resource": "urn:ugs:cloud-code:/v1/projects/*/modules/HelloWorld/SendProjectMessage",
      "Principal": "Player",
      "Action": ["*"],
      "Effect": "Deny"
    }
  ]
}
```

UGS CLI ツールを使用して、このポリシーをプロジェクトに適用します。

`ugs access upsert-project-policy project-policy.json`

[プレイヤーとして認証](/cloud-code/modules/how-to-guides/authentication.md#authenticate-players) されている場合にプレイヤーの `SendProjectMessage` モジュールエンドポイントへの直接リクエストがポリシーによって正常に拒否されたことをテストします。

```bash
curl 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/players/<PLAYER_ID>/modules/HelloWorld/SendProjectMessage' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
"params": {
"message": "hello"
}
}'
```

ポリシーが正常に適用されている場合、このリクエストは `403` HTTP ステータスコードとともにレスポンスを返します。

```json
{
    "status": 403,
    "title": "Forbidden",
    "type": "https://services.docs.unity.com/docs/errors/#56",
    "requestId": "b815d154-91f5-470e-a8ef-76c3c8ec7c13",
    "detail": "Access has been restricted",
    "code": 56
}
```

同じリクエストでサービスアカウントを認証するときに Cloud Code モジュールが実行できることをテストします。続行するには、ステートレストークンを取得し、リクエストでそれを Bearer トークンとして使用する必要があります。

詳細については、[Cloud Code Client API Bearer 認証](/cloud-code/modules/how-to-guides/authentication.md#cloud-code-client-api-bearer-authentication) を参照してください。

```bash
curl 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/modules/HelloWorld/SendProjectMessage' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
"params": {
"message": "hello"
}
}'
```

リクエストに成功した場合、Cloud Code は `200` HTTP ステータスコードで応答します。

```json
{
  "output":null
}
```

### Scheduling と Triggers の設定##set-up-scheduling-and-triggers

スケジュールとトリガーを設定して、`SendProjectMessage` モジュールエンドポイントを呼び出すことができます。

#### スケジュール設定の作成##create-a-schedule-configuration

`new-file` コマンドを実行して、スケジュール設定をローカルに作成します。

```bash
ugs scheduler new-file schedule-config
```

以下の設定で `schedule-config.sched` ファイルを更新します。

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/schedules.schema.json",
  "Configs": {
    "send-project-message": {
      "EventName": "announcement",
      "Type": "one-time",
      "Schedule": "2024-08-28T00:00:00Z",
      "PayloadVersion": 1,
      "Payload": "{\"message\": \"hello\"}"
    }
  }
}
```

> **Note:**
>
> **ノート**: `schedule` タイムスタンプが将来になっていることを確認します。

#### トリガー設定の作成##create-a-trigger-configuration

`new-file` コマンドを実行して、トリガー設定をローカルに作成します。

```bash
ugs triggers new-file triggers-config
```

`announcement` イベントが発生したときに `SendProjectMessage` モジュールエンドポイントを呼び出すトリガーを作成するには、以下の設定で `triggers-config.tr` ファイルを更新します。

```json
{
  "$schema": "https://ugs-config-schemas.unity3d.com/v1/triggers.schema.json",
  "Configs": [
    {
      "Name": "announcement-trigger",
      "EventType": "com.unity.services.scheduler.announcement.v1",
      "ActionUrn": "urn:ugs:cloud-code:HelloWorld/SendProjectMessage",
      "ActionType": "cloud-code"
    }
  ]
}
```

#### 設定のデプロイ##deploy-the-configurations

UGS CLI ツールを使用してファイルをデプロイします。

```bash
ugs deploy <path-to-config-files>
```

正しく設定されている場合、トリガーは `announcement` イベントが発生したときに `SendProjectMessage` モジュールエンドポイントを呼び出す必要があります。
