API 访问策略

API 访问策略控制对 API 资源的访问权限。 有时,出于反作弊或其他安全目的,游戏允许或拒绝来自游戏客户端的某些 API。 您可以使用策略声明来控制访问权限,以指定在特定情况下应用的一组访问规则。

本主题讨论如何使用 API 权限策略创建适当的规则。

重要

本指南讨论高级技术。 如果应用不正确,使用此功能可能完全禁用客户端访问游戏。

策略控制和结构

游戏使用 PlayFab 管理 API 调用来检索和更新访问策略。 用于设置 API 访问策略的两个特定调用是 GetPolicyUpdatePolicy。 有关管理 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: ClientServerAdmin

    使用 API 名称(例如 ConfirmPurchaseLoginWithTwitchReportPlayer)替换 API-CALL

    资源字符串支持通配符。 以下资源字符串将匹配任何资源。

    pfrn:api--*

  • 操作 - 描述对资源执行的操作的字符串。 使用 * 匹配任何操作。

  • 效果 - 指定规则定义的字符串。 使用 AllowDeny 允许或拒绝对资源执行的操作。

  • 主体 - 唯一标识用户类的字符串。 使用 * 匹配任何用户。

  • 批注 - 用户定义的字符串,用于提供有关该策略声明的详细信息。

  • 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()));
}

下图显示了第一次运行代码后的输出示例。 如图所示,策略由多个权限语句组成。

Game Manager - Admin API - Get-Update Policy - C# Output