前書き
PlayFab の CDN の利用を検討したときにこんな話がありました。
- ユーザーに CDN 上のファイルに自由にアクセスされたくない
- PlayFab の CDN 上にアップロードしたファイルは GetContentDownloadUrl API で取得した署名付き URL からしかアクセスできないので、普通に使っていても意図しないリソースにアクセスされる可能性は低い
- しかし TitleId と LoginId を解析されてしまえばゲームを通さなくても PlayFab SDK から GetContentDownloadUrl を総当り的に叩いて意図しないリソースにアクセスすることも不可能ではないのでこれを禁止したい
PlayFab ではタイトルごとに API のアクセスポリシーを細かく制御することが可能ですので、今回はこれを試してみました。
ちなみに一部の API は GameManager 上でチェックボックスにチェックを入れるだけでポリシーを変更できます。
しかしながら GetContentDownloadUrl は GameManager でポリシーを変更できない API なので、 Admin API を使用してポリシーを変更します。
Admin API を使って API のアクセスポリシーを変更する
C# のコンソールアプリケーションを作成して以下のコードを実行します。
async Task Main()
{
PlayFabSettings.staticSettings.DeveloperSecretKey = "your title secret";
PlayFabSettings.staticSettings.TitleId = "your title id";
await PlayFabAdminAPI.UpdatePolicyAsync(new UpdatePolicyRequest
{
PolicyName = "ApiPolicy",
OverwritePolicy = false,
Statements = new List<PermissionStatement>
{
new PermissionStatement
{
Action = "*",
ApiConditions = new ApiCondition
{
HasSignatureOrEncryption = Conditionals.False
},
Comment = "Do not allow clients to this api",
Resource = "pfrn:api--/Client/GetContentDownloadUrl", // ←ポリシーを変更する API 名
Effect = EffectType.Deny,
Principal = "*"
}
}
});
}
この状態で Client API から GetContentDownloadUrl を実行すると 403 エラーになりました。
Client API から実行できなくした GetContentDownloadUrl は、Server API で実行することができます。
クライアント(Unity 等)からは Cloud Script を実行し、Cloud Script 側で Server API を使用して GetContentDownloadUrl を実行してその結果をクライアントに返せば困らないですね。
API アクセスポリシーを設定してよりセキュアにゲームを運用する一例でした。