API アクセス ポリシー
API アクセス ポリシーは、API リソースへのアクセスを制御します。 時には、対不正行為や他のセキュリティの目的で、ゲーム クライアントが特定の API を使用することを許可または拒否する必要があります。 ポリシー ステートメントを使用して、特定の状況で適用されるアクセス ルールのセットを指定して、アクセスを制御することができます。
このトピックでは、適切なルールを作成するための API アクセス許可ポリシーの使用について説明します。
Important
このガイドでは、高度なテクニックについて説明します。 誤って適用すると、この機能を使用して、クライアントのタイトルへのアクセスを完全に無効化することが可能です。
ポリシー コントロールと構成
タイトルは PlayFab 管理者 API 呼び出しを使用して、アクセス ポリシーの取得と更新を行います。 API アクセス ポリシーの設定に使用する具体的な呼び出しは、GetPolicy と UpdatePolicy の 2 つです。 管理者 API 呼び出しの詳細については、PlayFab API 参照を参照してください。
管理者 API を使用するには、タイトルに関連付けられた開発者用シークレット キーを提供する必要があります。 開発者キーは、タイトルが管理者 API を呼び出すことを許可するために使用されます。 シークレット キーの取得については、シークレット キーの管理を参照してください。
各ポリシーには、ステートメントが含まれており、1 つまたは複数の PlayFab リソースのルールとして動作します。 PlayFab では、すべてのポリシーを許可するポリシー ステートメントの既定のセットを定義しています。 この一連のポリシー ステートメントを置き換えずに削除した場合、タイトルでクライアント API を呼び出すことができなくなります。
既定の PlayFab ポリシー ステートメントは、以下のとおりです。
"Statements": [
{
"Resource": "pfrn:api--*",
"Action": "*",
"Effect": "Allow",
"Principal": "*",
"Comment": "The default allow all policy"
}
]
アクセス許可ステートメントの各セットは、認証 - ポリシーの更新で定義された以下の項目で構成されています。
RESOURCE - 1 つまたは複数の PlayFab リソースを一意に識別する文字列。
API リソースを記述するには、次に示す規則を使用します。
pfrn:api--/API-GROUP/API-CALL
クライアント API を
API-GROUP
に指定します:Client
、Server
、またはAdmin
。API-CALL
をConfirmPurchase
、LoginWithTwitch
、ReportPlayer
などの API 名に置き換えます。リソースの文字列には、ワイルドカードを使用できます。 次のリソース文字列には、リソースのいずれかが一致します。
pfrn:api--*
ACTION - リソースで実行する操作を説明する文字列。 任意の操作が一致するよう使用
*
します。EFFECT - ルールの定義として指定する文字列。
Allow
またはDeny
を使用して、リソース経由での操作を許可または拒否します。PRINCIPAL - ユーザー クラスを一意に識別する文字列。
*
を使用して任意のユーザーに一致させます。COMMENT - ポリシー ステートメントの詳細について、提供するユーザー定義の文字列です。
APICONDITIONS - 高度なルールの条件を定義する オプションのオブジェクト。暗号化、署名ヘッダーなど。
より詳細なアクセス許可のステートメントを使用するようにポリシーを変更すると、ご使用になるアプリケーションで使用する API のみを許可することで、強力なセキュリティ ルールを設定できます。
次の例は、DeleteCharacterFromUser
呼び出しを制限する方法を示したものです。
{
"Resource": "pfrn:api--/Server/DeleteCharacterFromUser",
"Action": "",
"Effect": "Deny",
"Principal": "",
"Comment": "Disable server character delete"
}
API アクセス ポリシーの例
次のコード サンプルでは、ポリシーを使用した基本的な操作を紹介しています。 コードは次のアクションを実行します。
- 既存のポリシーを取得してログに記録します。
- ポリシーを更新します。
- 既存のポリシーを再度取得してログに記録します。
public void Start() {
PlayFabSettings.staticSettings.DeveloperSecretKey = "<insert key here>";
PlayFabSettings.TitleId = "< insert title id here >";
FetchApiPolicy(UpdateApiPolicy);
}
private void FetchApiPolicy(Action nextAction = null) {
PlayFabAdminAPI.GetPolicy(new GetPolicyRequest() {
PolicyName = "ApiPolicy"
}, result => {
Debug.Log(result.PolicyName);
foreach (var statement in result.Statements)
{
Debug.Log("Action: "+ statement.Action);
Debug.Log("Comment: "+ statement.Comment);
if(statement.ApiConditions != null)
Debug.Log("ApiCondition.HashSignatureOrEncryption: "+ statement.ApiConditions.HasSignatureOrEncryption);
Debug.Log("Effect: "+ statement.Effect);
Debug.Log("Principal: "+statement.Principal);
Debug.Log("Resource: "+ statement.Resource);
}
if (nextAction != null) nextAction();
},error=>Debug.LogError(error.GenerateErrorReport()));
}
private void UpdateApiPolicy() {
PlayFabAdminAPI.UpdatePolicy(new UpdatePolicyRequest() {
PolicyName = "ApiPolicy",
OverwritePolicy = false, // Append to existing policy. Set to True, to overwrite.
Statements = new List<PermissionStatement>() {
new PermissionStatement() {
Action = "*", // Statement effects Execute action
ApiConditions = new ApiCondition() {
HasSignatureOrEncryption = Conditionals.False // Require no RSA encrypted payload or signed headers
},
Comment = "Do not allow clients to confirm purchase",
Resource = "pfrn:api--/Client/ConfirmPurchase", // Resource name
Effect = EffectType.Deny, // Do not allow,
Principal = "*"
}
}
}, result => {
FetchApiPolicy();
}, error => Debug.LogError(error.GenerateErrorReport()));
}
以下の画像は、コードを初めて実行した後の出力例です。 このように、ポリシーには、いくつかの権限ステートメントがあります。