访问控制
Control access to Unity Gaming Services by creating rules to restrict service APIs you want to protect.
阅读时间3 分钟最后更新于 18 天前
您可以通过 Access Control 服务来控制对 Unity Gaming Services(Unity 游戏服务)(UGS) 的访问(包括对 Cloud Code 的访问)。 通过 Access Control,您可以创建规则来限制访问不想提供给玩家的服务 API。
使用 Cloud Code 控制玩家经济的示例
以下示例演示了如何创建基于项目的策略来拒绝对 Economy 服务 increment/decrement API 的访问。由于玩家无法直接操作自己的余额,因此您可以创建一个 Cloud Code 脚本,作为受信任的客户端代表玩家发出这些请求。 您可以使用 UGS CLI 工具应用访问策略。先决条件
在继续该示例之前,请确保项目满足以下先决条件:- 在 Economy 服务中拥有已发布的货币。
- 已设置 UGS CLI 以运行命令。如需了解更多信息,请参阅入门指南。
- 已将项目级 Project Resource Policy Editor(项目资源策略编辑者)、Project Resource Policy Reader(项目资源策略读取者)和 Unity Environments Viewer(Unity 环境查看者)角色授予用来向 CLI 工具进行身份验证的服务帐户。
创建 Access Control 项目策略以限制访问
创建一个包含以下内容的project-policy.json使用 UGS CLI 工具将此策略应用于您的项目:{ "statements": [ { "Sid": "DenyPlayerAccessForEconomyIncrementAndDecrement", "Resource": "urn:ugs:economy:/*/*crement", "Principal": "Player", "Action": ["*"], "Effect": "Deny" } ]}
测试此策略是否成功拒绝了玩家在以玩家身份通过身份验证后直接向ugs access upsert-project-policy project-policy.json
increment如果已成功应用此策略,该请求应返回包含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{ "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}
创建并发布 Cloud Code 脚本
创建并发布一个包含最新 Economy SDK 版本的 Cloud Code 脚本来发出增加余额请求。此脚本接受currencyIdJavaScript
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 }}
测试 Cloud Code 脚本在以玩家身份进行身份验证后是否能够增加余额。
如果余额更新请求成功,Cloud Code 应以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{ "result": { "balance": 10, "created": { "date": "2023-06-30T09:12:54Z" }, "currencyId": "GOLD", "modified": { "date": "2023-06-30T09:12:54Z" }, "writeLock": "1" }}
验证脚本
您可以通过 Unity Cloud Dashboard 使用 Player Management(玩家管理)功能来确认玩家货币余额,或通过 Economy 服务 API 来请求余额以进行确认:成功设置 Cloud Code 以控制玩家余额后,您可以插入其他逻辑,以确保玩家的余额仅在需要时更新。curl 'https://economy.services.api.unity.com/v2/projects/<PROJECT_ID>/players/<PLAYER_ID>/currencies' \--header 'Authorization: Bearer <BEARER_TOKEN>'