访问控制
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}
创建模块终端
创建一个包含最新 Economy SDK 版本的 Cloud Code 模块来发出增加余额请求。模块函数接受currencyIdusing Microsoft.Extensions.DependencyInjection;using Unity.Services.CloudCode.Apis;using Unity.Services.CloudCode.Core;using Unity.Services.CloudCode.Shared;using Unity.Services.Economy.Model;namespace Sample;public class EconomySample{ [CloudCodeFunction("IncrementBalance")] public async Task<ApiResponse<CurrencyBalanceResponse>> IncrementPlayerBalance(IExecutionContext ctx, IGameApiClient gameApiClient, string currencyId) { try { return await gameApiClient.EconomyCurrencies.IncrementPlayerCurrencyBalanceAsync(ctx, ctx.ServiceToken, ctx.ProjectId, ctx.PlayerId, currencyId, new CurrencyModifyBalanceRequest(currencyId, 10)); } catch (ApiException ex) { throw new Exception($"Failed to get increment {currencyId} currency for player: {ctx.PlayerId}. Error: {ex.Message}"); } } public class ModuleConfig : ICloudCodeSetup { public void Setup(ICloudCodeConfig config) { config.Dependencies.AddSingleton(GameApiClient.Create()); } }}
测试 Cloud Code 模块在以玩家身份进行身份验证后是否能够增加余额。
如果余额更新请求成功,Cloud Code 应以curl --request POST 'https://cloud-code.services.api.unity.com/v1/projects/<PROJECT_ID>/modules/<MODULE_NAME>/<FUNCTION_NAME>' \--header 'Content-Type: application/json' \--header 'Authorization: Bearer <BEARER_TOKEN>' \--data '{ "params": { "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>'