> For the complete documentation index, see [llms.txt](/llms.txt)

# アクセス制御

GS2 のAPIに対するアクセス制御




GS2の各サービスにアクセスするための、クレデンシャル(認証情報）やアクセス権限の管理をする
仕組みが GS2-Identifier です。

各サービスにアクセスが可能かの権限管理は、GS2-Identifierユーザー（以下ユーザー）ごとに行います。

ユーザーにはGS2のどういったサービスを利用可能かの定義（セキュリティポリシー）を割り当てます。

GS2はクレデンシャルを使ってアクセスしてきたユーザーを認証し、プロジェクトトークンを返します。
ゲームアプリ/管理ツールはこのプロジェクトトークンを使用して各サービスにアクセスを行います。

権限の詳細な設定はセキュリティポリシーで定義され、これを各ユーザーごとに割り当てます。

## ユーザー

ユーザーが持つデータ構造の概要は、以下のようになります。


```plantuml
class User {
  +userId
  +name
  :
}

class Identifier {
  +clientId
  +clientSecret
  :
}

class Password {
  +hashedPassword
  :
}

class AttachedSecurityPolicy {
  +securityPolicyId
  :
}

class SecurityPolicy {
  +policyDocument
  :
}

User "1" *-- "many" Identifier
User "1" --- "1" Password
User "1" *-- "<=10" AttachedSecurityPolicy
AttachedSecurityPolicy "1" -- "1" SecurityPolicy

note "認証情報(クレデンシャル)\n各サービスのAPIにアクセスするために必要となる情報" as IdentifierNote
Identifier .. IdentifierNote

note "パスワード\nマネージメントコンソールにサブアカウントとしてログインするための情報" as PasswordNote
Password .. PasswordNote

note "ユーザーのアクセス権限" as AttachedSecurityPolicyNote
AttachedSecurityPolicy .. AttachedSecurityPolicyNote

note "権限設定" as SecurityPolicyNote
SecurityPolicy .. SecurityPolicyNote

```

## セキュリティポリシー

セキュリティポリシーにはあらかじめ以下のポリシーが定義済みです。

| セキュリティーポリシー名 | 説明 |
| -------------------- | --- |
| AdministratorAccess | 全てのAPIを利用する権限 |
| ApplicationAccess | チート行為に繋がらないAPIのみが呼び出せる権限 |
| DeliveryAccess | GS2-Distributor がリソースの溢れ処理を実行するために必要となる権限 |
| UnauthenticatedAccess | バージョンチェック（GS2-Version）の実行に必要な処理（ログイン処理含む）のみ行える権限 |

AdministratorAccess ポリシー は、GS2のすべてのサービスにアクセス可能な権限です。

ゲームアプリ内に組み込んで使用する想定の ApplicationAccess ポリシーは、
チート行為につながるようなサーバの操作が可能なAPIの呼び出しができないよう設定されています。

### セキュリティポリシーのフォーマット

セキュリティポリシーはJSON形式で記述します。

Statements　の中に　Effect、Actions、Resources の各要素を含めます。
*(アスタリスク)はワイルドカードを表します。

最も単純なセキュリティポリシーは例のようになります。
このセキュリティポリシーは、あらゆる操作をあらゆるサービス、
APIに対して許可する、というものです。

```json
{
  "Version": "2016-04-01",
  "Statements": [
    {
      "Effect": "Allow",
      "Actions": [
        "*"
      ],
      "Resources": [
        "*"
      ]
    }
  ]
}
```

#### Actions

例に示したセキュリティポリシーは GS2-Inboxサービスに対しあらゆる操作が行える、というものになります。
この例のセキュリティポリシーが割り当てられているユーザーの権限は、GS2-Inbox 以外のサービスにアクセスできません。

*(アスタリスク)はワイルドカードを表しています。

```json
{
  "Version": "2016-04-01",
  "Statements": [
    {
      "Effect": "Allow",
      "Actions": [
        "Gs2Inbox:*"
      ],
      "Resources": [
        "*"
      ]
    }
  ]
}
```

#### Effect

このポリシーでの、APIへのアクセスの 許可/不許可の指定をします。

| 指定 | アクセス |
| ---- | ------ |
| Allow | 許可 |
| Deny | 不許可 |

##### アクションの列挙

Actions には アクション、アクセスし実行が可能/不可能なメソッドの指定を
列挙することができます。
各サービスのリファレンスに記載されているメソッドを指定します。

[サービス名]:[メソッド名] のように :(コロン) を間に挟んでください。

サービス名の指定は
Gs2Inbox
のように、-(ハイフン)を含まず、Gs2に各サービスの名称が連なったものになります。

メソッド名は
SendMessage
のように、先頭の文字は大文字（アッパーキャメルケース）になります。

```json
{
  "Version": "2016-04-01",
  "Statements": [
    {
      "Effect": "Allow",
      "Actions": [
        "Gs2Inbox:SendMessage",
        "Gs2Inbox:DescribeMessage",
        "Gs2Inbox:ReadMessage",
        "Gs2Inbox:DeleteMessage"
      ],
      "Resources": [
        "*"
      ]
    }
  ]
}
```

#### Resources

このポリシーの影響を受けるリソースの範囲を指定する変数になります。

Resources には操作を許可もしくは拒否したいリソースのGRNを列挙します。
Actions 同様先頭および末尾にワイルドカードを用いることが可能です。

```json
{
  "Version": "2016-04-01",
  "Statements": [
    {
      "Effect": "Allow",
      "Actions": [
        "Gs2Inbox:SendMessage"
      ],
      "Resources": [
        "grn:gs2:{region}:{ownerId}:inbox:namespace-0001",
        "grn:gs2:{region}:{ownerId}:inbox:namespace-0001:*"
      ]
    }
  ]
}
```

こちらの例では namespace-0001 にのみ SendMessage が可能な権限を設定しています。

##### プレースホルダ

GRN の要素のうち「リージョン名: {region}」「オーナーID: {ownerId}」「ユーザーID: {userId}」はプレースホルダを用いることができます。
プレースホルダを指定することで実行時にアクセスしている値に置き換えて評価されます。

## セキュリティポリシーの判定

ユーザーは最大10個のセキュリティポリシーを割り当てることができます。
Effect に Allow が指定されたアクションについて Or で処理をした後に、Effect に Deny が指定されたアクションについて Or で処理をしたものを除いたAPIを呼び出し可能となります。

つまり、Allow と Deny の両方に記述がある場合は、Deny が優先されます。




