# 身份验证

> Authenticate Cloud Code requests.

Cloud Code 仅接受经过身份验证的请求。

借助于身份验证，您可以使用玩家的身份来确保游戏中每次互动的安全性和一致性。

要向 Cloud Code 进行身份验证，您可以使用以下身份验证方法：

| 请求来源                      | 身份验证方法                                                                                            |
| ------------------------- | ------------------------------------------------------------------------------------------------- |
| 不受信任的客户端（玩家）              | 使用 [Unity Authentication](/authentication.md) 服务。                                                 |
| 受信任的客户端（游戏服务器、集成测试、本地计算机） | 使用[服务帐户身份验证](https://services.docs.unity.com/docs/service-account-auth/)或 Multiplay Hosting 身份验证。 |

## 对玩家进行身份验证##authenticate-players

[Unity Authentication](/authentication.md) 为玩家分配唯一标识符，并提供多种身份验证方法。

> **Note:**
>
> **注意**：Unity Authentication 可用于为支持的平台（包括移动端和 PC 端）提供[匿名身份验证](/authentication/use-anon-sign-in.md)和[特定于平台的身份验证](/authentication/approaches-to-authentication.md)解决方案。

Unity Authentication 使用持有者身份验证和 JSON Web Token ([JWT](https://jwt.io/introduction))。Cloud Code 模块提供了一个 `IExecutionContext` 接口，其中包含一个 `AccessToken` 属性。这个访问令牌便是用于对调用该模块的玩家进行身份验证的 [JWT](https://jwt.io/introduction)。

如需更多有关如何在模块中使用 `AccessToken` 的信息，请参阅[访问令牌支持](./token-support.md#access-token-support)文档。

### 限制访问##restrict-access

如果要限制对特定模块终端的访问，可以使用基于角色的访问控制 (RBAC) 规则。

通过这些规则，可以确保玩家无法运行特殊的模块终端，例如向玩家授予额外资源的一次性支持函数。如需了解更多信息，请参阅[访问控制](./access-control.md)文档。

> **Note:**
>
> **注意**：为了安全起见，只能使用由 Unity Authentication 服务通过 [Cloud Code Client API](https://services.docs.unity.com/cloud-code/v1/index.html#tag/cloud-code) 生成的 JWT。如果您向 [Cloud Code Admin API](https://services.docs.unity.com/cloud-code-admin/v1/#tag/cloud-code-modules) 发出这些调用，Cloud Code 服务会拒绝这些调用。

## 对受信任的客户端进行身份验证##authenticate-trusted-clients

对于[服务帐户身份验证](https://services.docs.unity.com/docs/service-account-auth/)，Cloud Code Client API 和 Cloud Code Admin API 均可供使用。

因此，您可以通过多种方式使用 Cloud Code：

* 从本地计算机编写模块。
* 从 CI/CD 管线编写和运行模块。
* 从游戏服务器运行模块。
* 在集成测试中运行模块。

您可以将服务帐户用于持有者 (JWT) 身份验证和基本身份验证。

### Cloud Code Admin API（基本身份验证）##cloud-code-admin-api-basic-authentication

要访问 [Cloud Code Admin API](https://services.docs.unity.com/cloud-code-admin/v1/#tag/cloud-code-modules)，您需要使用[基本身份验证](https://services.docs.unity.com/docs/service-account-auth/#authenticate-an-api-using-service-account-credentials)。

要直接使用服务帐户凭据，请对 `<KEY_ID>:<SECRET_KEY>` 进行 base64 编码。您还需要向服务帐户授予适当的权限。如需详细了解 Cloud Code 中的权限和角色，请参阅下表。

| 访问权限       | 角色                                                                                                                |
| ---------- | ----------------------------------------------------------------------------------------------------------------- |
| 读取模块       | [Cloud Code Viewer（Cloud Code 查看者）](https://services.docs.unity.com/docs/service-account-auth/#cloud-code-viewer) |
| 读取/写入/删除模块 | [Cloud Code Editor（Cloud Code 编辑者）](https://services.docs.unity.com/docs/service-account-auth/#cloud-code-editor) |

如需了解更多信息，请参阅[服务帐户身份验证](https://services.docs.unity.com/docs/service-account-auth/)文档。

### Cloud Code Client API（持有者身份验证）##cloud-code-client-api-bearer-authentication

要访问 [Cloud Code Client API](https://services.docs.unity.com/cloud-code/v1/index.html#tag/cloud-code)，请使用 Bearer 身份验证。您可以使用 [Token Exchange API](https://services.docs.unity.com/auth/v1/#tag/authentication/operation/exchangetostateless) 获取有限生命周期的无状态令牌。

> **Note:**
>
> **注意**：尽管 Token Exchange API 声明环境 ID 的查询参数是可选参数，但您需要提供环境 ID 才能访问 Cloud Code Client API 以运行模块。

要在令牌过期时[刷新令牌](https://services.docs.unity.com/docs/service-account-auth/#refresh-your-stateless-token)，可以使用相同的 API。

Cloud Code 模块提供了一个 `IExecutionContext` 对象，其中包含一个 `ServiceToken` 属性。`ServiceToken` 属性是一个可用于以 Cloud Code 身份进行身份验证并访问跨玩家数据的 [JWT](https://jwt.io/introduction)。例如，可以使用此令牌调用 Cloud Save 以代表其他玩家保存数据。

如需更多有关如何在模块中使用 `ServiceToken` 的信息，请参阅[服务令牌支持](./token-support.md#service-token-support)文档。

> **Note:**
>
> **注意**：只能使用 Token Exchange API 调用 Client API。无需在请求中指定任何作用域。

## 向 Multiplay Hosting 进行身份验证##authenticate-with-multiplay-hosting

Multiplay Hosting 还支持另一种使用服务器生成的 JWT 的身份验证方法。如需了解更多信息，请参阅关于如何[从 Unity 游戏服务器 (Multiplay Hosting) 进行调用](./run-modules/game-server.md)的文档。
