服务令牌和访问令牌支持
Use Access Tokens and Service Tokens to authenticate requests in Cloud Code modules.
阅读时间6 分钟最后更新于 1 个月前
在模块中,
IExecutionContextAccessTokenServiceToken令牌类型 | 来源 | 数据访问 | 用途 |
|---|---|---|---|
| 由 Authentication 服务生成。 | 仅限经过身份验证的玩家。 | |
| 由 Cloud Code 生成。 | 跨玩家数据访问。 | |
概述
请评估您是要以玩家身份还是以受信任的客户端身份进行身份验证。 模块IExecutionContextAccessTokenServiceTokenAccessTokenServiceToken访问令牌支持
访问令牌是 Authentication 服务 (https://docs.unity.com/ugs/manual/authentication/manual/use-anon-sign-in) 生成的 JWT。您可以使用访问令牌对玩家进行身份验证。 当经过身份验证的玩家调用 Cloud Code 模块时,他们会将自己的访问令牌作为IExecutionContextAccessToken支持的服务
要检查哪些服务支持访问令牌,请参阅下表:提供者 | 支持的服务 |
|---|---|
| Cloud Code C# Client SDK | 所有 Cloud Code C# Client SDK 都与其对应的服务 API 支持相同的访问令牌。 |
| UGS Client API | 所有支持 Authentication 服务的 UGS 服务。 |
| Cloud Code C# Admin SDK | 不支持。改用服务帐户身份验证。 |
| UGS Admin API | 不支持。改用服务帐户身份验证。 |
将令牌用于 Cloud Code C# Client SDK
要将AccessTokenIExecutionContext[CloudCodeFunction("IncrementBalance")]public async Task<ApiResponse<CurrencyBalanceResponse>> IncrementPlayerBalance(IGameApiClient gameApiClient, IExecutionContext ctx, string currencyId){ ... try { // Increment the balance of the currency for the player calling the module var res = await gameApiClient.EconomyCurrencies.IncrementPlayerCurrencyBalanceAsync(ctx, ctx.AccessToken, ctx.ProjectId, ctx.PlayerId, currencyId, new CurrencyModifyBalanceRequest(currencyId, 10)); _logger.LogInformation("Incremented currency {currencyId} balance by {amount}", currencyId, 10); return res; } catch (ApiException e) { _logger.LogError("Failed to increment {currencyId} balance for the player. Error: {error}", currencyId, e.Message); throw new Exception($"Failed to increment {currencyId} balance for playerId {ctx.PlayerId}. Error: {e.Message}"); }}
用于 UGS Client API
要将AccessTokenpublic class Relationships{ private readonly RestClient _httpClient; public Relationships() { _httpClient = new RestClient("https://social.services.api.unity.com/v1/relationships"); } public async Task<List<RelationshipsApiResponse?>> GetRelationships(IExecutionContext context) { var request = new RestRequest() { // Pass the access token as a bearer token in the header Authenticator = new JwtAuthenticator(context.AccessToken) }; .... }}
服务令牌支持
服务令牌是 Cloud Code 生成的 JWT。您可以使用服务令牌以 Cloud Code 身份对服务进行身份验证。这是经过令牌交换过程的服务帐户令牌。 您可以将服务令牌用于 Cloud Code C# Client SDK。要将其用于其他 API,您需要在 Authentication 标头中将其作为持有者令牌传递。支持的服务
如需查看支持服务令牌的服务列表,请参阅下表:提供者 | 支持的服务 |
|---|---|
| Cloud Code C# Client SDK | 请参阅可用库以查看可用 SDK 的列表。 |
| UGS Client API | |
| Cloud Code C# Admin SDK | 不支持。改用服务帐户身份验证。 |
| UGS Admin API | 不支持。改用服务帐户身份验证。 |
将令牌用于 Cloud Code C# Client SDK
要将ServiceTokenIExecutionContext[CloudCodeFunction("IncrementBalance")]public async Task<ApiResponse<CurrencyBalanceResponse>> IncrementPlayerBalance(IGameApiClient gameApiClient, IExecutionContext ctx, string currencyId, string playerId){ ... try { // Increment the balance of the currency for the player ID passed in, authenticated as Cloud Code var res = await gameApiClient.EconomyCurrencies.IncrementPlayerCurrencyBalanceAsync(ctx, ctx.ServiceToken, ctx.ProjectId, playerId, currencyId, new CurrencyModifyBalanceRequest(currencyId, 10)); _logger.LogInformation("Incremented currency {currencyId} balance by {amount}", currencyId, 10); return res; } catch (ApiException e) { _logger.LogError("Failed to increment {currencyId} balance for the player. Error: {error}", currencyId, e.Message); throw new Exception($"Failed to increment {currencyId} balance for playerId {ctx.PlayerId}. Error: {e.Message}"); }}
将令牌用于 UGS Client API
要将ServiceToken
例如,如果您为 Cloud Save API 定义了一个接口,则可以使用
ServiceTokenusing System.Net;using Unity.Services.CloudCode.Core;using Newtonsoft.Json;using RestSharp;using RestSharp.Authenticators;namespace ExampleModule;public interface ICloudSaveData{ public Task<CloudSaveResponse?> GetData(IExecutionContext context, string playerId);}public class CloudSaveResponse{ public CloudSaveItem[] Results { get; set; }}public class CloudSaveItem{ public string Key { get; set; } public object Value { get; set; }}public class CloudSaveData : ICloudSaveData{ private readonly RestClient _httpClient; public async Task<CloudSaveResponse?> GetData(IExecutionContext context, string playerId) { var request = new RestRequest($"v1/data/projects/{context.ProjectId}/players/{playerId}/items") { // Authenticate as Cloud Code to interact with cross-player data Authenticator = new JwtAuthenticator(context.ServiceToken) }; // Pass through the analytics user id and Unity installation id to the service. if (context.AnalyticsUserId != null) request = request.AddHeader("analytics-user-id", context.AnalyticsUserId); if (context.UnityInstallationId != null) request = request.AddHeader("unity-installation-id", context.UnityInstallationId); RestResponse response = await _httpClient.ExecuteGetAsync(request); if (response.Content == null) throw new Exception("Failed to load data from Cloud Save: Content was null"); if (response.StatusCode != HttpStatusCode.OK) throw new Exception("Failed to load data from Cloud Save: " + response.Content); return JsonConvert.DeserializeObject<CloudSaveResponse>(response.Content); }}