# アクセス制御

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

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

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

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

## Cloud Code でプレイヤーの経済をコントロールする例##control-player-economies-with-cloud-code-example

以下の例は、[Economy サービス](/economy.md) の increment/decrement API へのアクセスを拒否するポリシーに基づいてプロジェクトを作成する方法を示します。プレイヤーは自分の残高を直接には操作できないため、プレイヤーに代わってこれらのリクエストを [信頼できるクライアント](./authentication.md#authenticate-trusted-clients) として行う Cloud Code モジュールを作成できます。

[UGS CLI ツール](https://services.docs.unity.com/guides/ugs-cli/latest/access/Access%20Command%20Line/overview/) でアクセスポリシーを適用できます。

### 前提条件##prerequisites

例に進む前に、プロジェクトが以下の前提条件を満たしていることを確認します。

1. [Economy サービス](/economy.md) に [公開された通貨](/economy/publication.md) がある。
2. UGS CLI がコマンドを実行するように設定されている。詳細については、[使用の準備](https://services.docs.unity.com/guides/ugs-cli/latest/general/overview/) ガイドを参照してください。
3. プロジェクトレベルのプロジェクトリソースポリシーエディター、プロジェクトリソースポリシーリーダー、および Unity 環境閲覧者のロールが、CLI ツールでの認証に使用するサービスアカウントに付与されている。

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

以下のコンテンツで `project-policy.json` ファイルを作成して、プレイヤーによる Economy サービス内の increment および decrement API への直接アクセスを拒否するポリシーを作成します。

```json
{
  "statements": [
    {
      "Sid": "DenyPlayerAccessForEconomyIncrementAndDecrement",
      "Resource": "urn:ugs:economy:/*/*crement",
      "Principal": "Player",
      "Action": ["*"],
      "Effect": "Deny"
    }
  ]
}
```

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

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

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

```bash
curl 'https://economy.services.api.unity.com/v2/projects/<PROJECT_ID>/players/<PLAYER_ID>/currencies/<CURRENCY_ID>/increment' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
    "amount": 10
}'
```

ポリシーが正常に適用された場合、このリクエストは `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
}
```

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

最新の Economy SDK バージョンを含む Cloud Code モジュールを [作成](./write-modules.md) して残高増加リクエストを行います。モジュール関数は、パラメーターとして `currencyId` を受け取って、残高更新を適用する通貨を定義します。これが Economy 通貨設定のリソース ID と一致することを確認します。

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

namespace Sample;

public class EconomySample
{
    [CloudCodeFunction("IncrementBalance")]
    public async Task<ApiResponse<CurrencyBalanceResponse>> IncrementPlayerBalance(IExecutionContext ctx,
        IGameApiClient gameApiClient, string currencyId)
    {
        try
        {
            return await gameApiClient.EconomyCurrencies.IncrementPlayerCurrencyBalanceAsync(ctx, ctx.ServiceToken,
                ctx.ProjectId, ctx.PlayerId, currencyId, new CurrencyModifyBalanceRequest(currencyId, 10));
        }
        catch (ApiException ex)
        {
            throw new Exception($"Failed to get increment {currencyId} currency for player: {ctx.PlayerId}. Error: {ex.Message}");
        }
    }

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

> **Important:**
>
> **重要**: Economy SDK のデフォルト認証は、バージョン 2.4 以上の Cloud Code サービスアカウントを使用します。これは、バージョン 2.3 以下を使用している場合はプレイヤーとして認証します。

プレイヤーとして認証するときに Cloud Code モジュールが残高を増やせることをテストします。

```bash
curl --request POST 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/modules/<MODULE_NAME>/<FUNCTION_NAME>' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
	"params": {
		"currencyId": <CURRENCY_ID>
	}
}'
```

残高更新リクエストに成功した場合、Cloud Code は `200` HTTP ステータスコードと新しい残高値を含む増加リクエストの結果で応答する必要があります。

```json
{
  "result": {
    "balance": 10,
    "created": {
      "date": "2023-06-30T09:12:54Z"
    },
    "currencyId": "GOLD",
    "modified": {
      "date": "2023-06-30T09:12:54Z"
    },
    "writeLock": "1"
  }
}
```

### モジュールの検証##validating-the-module

[Player Management](https://cloud.unity.com/player-management) を使用して Unity Dashboard で、または Economy サービス API を介して残高をリクエストすることで、プレイヤーの通貨残高を確認できます。

```bash
curl 'https://economy.services.api.unity.com/v2/projects/<PROJECT_ID>/players/<PLAYER_ID>/currencies' \
--header 'Authorization: Bearer <BEARER_TOKEN>'
```

Cloud Code がプレイヤーの残高をコントロールするように正常に設定されたら、プレイヤーの残高が期待される場合にのみ更新されるようにする追加のロジックを挿入できます。
