API 访问策略
API 访问策略控制对 API 资源的访问权限。 有时,出于反作弊或其他安全目的,游戏允许或拒绝来自游戏客户端的某些 API。 您可以使用策略声明来控制访问权限,以指定在特定情况下应用的一组访问规则。
本主题讨论如何使用 API 权限策略创建适当的规则。
重要
本指南讨论高级技术。 如果应用不正确,使用此功能可能完全禁用客户端访问游戏。
策略控制和结构
游戏使用 PlayFab 管理 API 调用来检索和更新访问策略。 用于设置 API 访问策略的两个特定调用是 GetPolicy 和 UpdatePolicy。 有关管理 API 调用的详细信息,请参阅 PlayFab API 参考。
若要使用管理员 API,必须提供与游戏关联的开发人员密钥。 开发人员密钥用于授权游戏调用管理 API。 有关检索密钥的信息,请参阅密钥管理。
每个策略均包含一个语句列表,充当一个或多个 PlayFab 资源的规则。 PlayFab 定义了一组默认策略语句,允许所有策略。 如果删除这组策略语句而不替换它,则游戏将无法调用客户端 API。
默认 PlayFab 策略语句:
"Statements": [
{
"Resource": "pfrn:api--*",
"Action": "*",
"Effect": "Allow",
"Principal": "*",
"Comment": "The default allow all policy"
}
]
每一组权限语句包含 身份验证 - 更新策略中定义的以下项目:
资源 - 唯一标识一个或多个 PlayFab 资源的字符串。
若要描述 API 资源,请使用下面显示的约定。
pfrn:api--/API-GROUP/API-CALL
将客户端 API 指定为
API-GROUP
:Client
、Server
或Admin
。使用 API 名称(例如
ConfirmPurchase
、LoginWithTwitch
或ReportPlayer
)替换API-CALL
。资源字符串支持通配符。 以下资源字符串将匹配任何资源。
pfrn:api--*
操作 - 描述对资源执行的操作的字符串。 使用
*
匹配任何操作。效果 - 指定规则定义的字符串。 使用
Allow
或Deny
允许或拒绝对资源执行的操作。主体 - 唯一标识用户类的字符串。 使用
*
匹配任何用户。批注 - 用户定义的字符串,用于提供有关该策略声明的详细信息。
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()));
}
下图显示了第一次运行代码后的输出示例。 如图所示,策略由多个权限语句组成。