访问控制

您可以通过访问控制服务控制对 Unity 游戏服务 (UGS)(包括云代码)的访问。

访问控制使您能够创建规则,以限制对您不想让玩家使用的服务 API 的访问。

If you allow player access to APIs, you reduce the security of your game. For more information, refer to Server authority.

使用云代码示例控制玩家经济

以下示例演示了如何创建基于项目的策略,拒绝访问经济服务中的增量/减量 API。由于玩家无法直接操作自己的余额,因此您可以创建一个云代码脚本,该脚本以受信任的客户端身份代表玩家发出这些请求。

您可以使用UGS CLI 工具应用访问策略。

先决条件

在继续使用示例之前,请确保您的项目具有以下先决条件

  1. 经济服务中拥有已发布的货币
  2. 已设置 UGS CLI 以运行命令。有关更多信息,请参阅入门指南。
  3. 已将项目级项目资源策略编辑器、项目资源策略读取器和 Unity 环境查看器角色授予您用于通过 CLI 工具进行身份验证的服务帐户。

创建访问控制项目策略以限制访问

使用以下内容创建一个 project-policy.json 文件,以创建一项策略,该策略拒绝玩家直接访问经济服务中的增量和减量 API。

{
  "statements": [
    {
      "Sid": "DenyPlayerAccessForEconomyIncrementAndDecrement",
      "Resource": "urn:ugs:economy:/*/*crement",
      "Principal": "Player",
      "Action": ["*"],
      "Effect": "Deny"
    }
  ]
}

使用 UGS CLI 工具将此策略应用于您的项目

ugs access upsert-project-policy project-policy.json

测试该策略是否已成功拒绝玩家直接向 increment API 端点发出请求(以玩家身份进行身份验证时)。

curl 'https://economy.services.api.unity.com/v2/projects/<PROJECT_ID>/players/<PLAYER_ID>/currencies/<CURRENCY_ID>/increment' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>' \
--data '{
    "amount": 10
}'

如果策略已成功应用,则此请求应返回具有 403 HTTP 状态代码的响应

{
    "status": 403,
    "title": "Forbidden",
    "type": "https://services.docs.unity.com/docs/errors/#56",
    "requestId": "b815d154-91f5-470e-a8ef-76c3c8ec7c13",
    "detail": "Access has been restricted",
    "code": 56
}

创建并发布云代码脚本

创建和发布一个云代码脚本,该脚本包含最新的经济 SDK 版本,以发出增量余额请求。此脚本将 currencyId 作为脚本参数,以定义要应用余额更新的货币。确保这与您在经济货币配置中的资源 ID 相匹配。

JavaScript

const { CurrenciesApi } = require("@unity-services/economy-2.4");

module.exports = async ({ params, context, logger }) => {
 const { projectId, playerId } = context;
 const { currencyId } = params;

 const currencies = new CurrenciesApi(context);

  try {
    const result = await currencies.incrementPlayerCurrencyBalance({ projectId, playerId, currencyId, currencyModifyBalanceRequest: { amount: 10 } });
    return result.data;
  } catch (err) {
    logger.error("Failed to update currency balance", {"error.message": err.message}, {"currencyId" : currencyId});
    throw err;
  }
}

module.exports.params = {
  "currencyId" : { "type": "String", "required": true }
}

重要:经济 SDK 默认身份验证使用来自 2.4+ 版本的云代码服务帐户。它在使用 2.3 及更低版本时以玩家身份进行身份验证。

测试以玩家身份进行身份验证时,云代码脚本是否能够增加余额。

curl --request POST 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/scripts/<SCRIPT_NAME>' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer <BEARER_TOKEN>'
--data '{"currencyId": "<CURRENCY_ID>"}'

如果余额更新请求成功,云代码应返回 200 HTTP 状态代码以及包含新余额值的增量请求结果。

{
  "result": {
    "balance": 10,
    "created": {
      "date": "2023-06-30T09:12:54Z"
    },
    "currencyId": "GOLD",
    "modified": {
      "date": "2023-06-30T09:12:54Z"
    },
    "writeLock": "1"
  }
}

验证脚本

您可以使用玩家管理或通过经济服务 API 请求余额,通过 Unity 云仪表板确认玩家货币余额

curl 'https://economy.services.api.unity.com/v2/projects/<PROJECT_ID>/players/<PLAYER_ID>/currencies' \
--header 'Authorization: Bearer <BEARER_TOKEN>'

成功设置云代码以控制玩家余额后,您可以插入其他逻辑,以确保仅在预期时更新玩家的余额。