# 用户鉴权 (/zh-CN/api-reference/rtm/unity/token)

> For AI agents: see the complete documentation index at [llms.txt](/llms.txt).

鉴权是指在用户访问你的系统前，对其进行身份校验。用户在使用声网服务，如加入音视频通话或登录信令系统时，声网使用 Token 对其鉴权。

RTM 提供 Message Channel 和 Stream Channel 两种频道类型，使用不同类型的频道，对应的 Token 类型也不同：

- 使用 Message Channel：只需在调用 `LoginAsync` 方法登录 RTM 系统时，传入开通了 RTM 服务的 Token（以下简称 RTM Token）。
- 使用 Stream Channel：在使用 RTM Token 鉴权的基础上，还需要在调用 `JoinAsync` 方法加入 Stream Channel 时传入开通了 RTC 服务的 Token（以下简称 RTC Token）。

Token 的有效期最长为 24 小时，声网推荐你在 Token 过期前更新 Token。本文介绍如何更新 Token。

想要了解生成和使用 Token 的更多信息，可以查看：

- [用户鉴权](/zh-CN/realtime-media/rtm/build/authentication-and-connection/user-authentication)

## IRtmClient::RenewTokenAsync [#irtmclientrenewtokenasync]

### 接口描述 [#接口描述]

调用 `IRtmClient::RenewTokenAsync` 方法更新 RTM Token。

为保证及时更新 Token，声网推荐你监听 `OnTokenPrivilegeWillExpire` 回调，详见[事件监听](/zh-CN/api-reference/rtm/unity/configuration#事件监听)。成功添加事件监听后，当 RTM Token 还有 30 秒过期时，SDK 会触发 `OnTokenPrivilegeWillExpire` 回调，提醒用户 Token 即将过期。收到该回调时，你可以在服务端重新生成 RTM Token，然后调用 `RenewTokenAsync` 方法，将新生成的 RTM Token 传给 SDK。

### 接口方法 [#接口方法]

你可以通过以下方式调用 `IRtmClient::RenewTokenAsync` 方法：

```csharp
RtmResult<RenewTokenResult> RenewTokenAsync(string token);
```

| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
| --- | --- | --- | --- | --- |
| `token` | string | 必填 | - | 新生成的 RTM Token。 |

### 基本用法 [#基本用法]

```csharp
var result =  await rtmClient.RenewTokenAsync("your_token");
if (result.Status.Error)
{
    // 更新失败，处理报错
    Debug.Log(result.Status.ErrorCode);
}
else
{
    // 更新成功
}
```

### 返回值 [#返回值]

`IRtmClient::RenewTokenAsync` 操作返回一个 `RtmResult<RenewTokenResult>` 类型数据结构的返回值，其中包含：

|    属性    |       类型        | 描述         |
| ------- | ----- | ------------ |
|  `Status`  |   `RtmStatus`    | 无论操作是否成功，都返回一个 `RtmStatus` 类型的数据结构，其中包含本次操作的状态。  |
| `Response` | `RenewTokenResult` | 操作成功后，返回一个 `RenewTokenResult` 类型的数据结构，其中包含本次操作的执行结果。 |

`RtmStatus` 包含以下属性：

|    属性     |  类型  | 描述               |
| ------- | -- | ------- |
|   `Error`   |  bool  | 本次操作是否出错。 |
| `ErrorCode` | string | 错误码             |
| `Operation` | string | 本次操作类型。     |
|  `Reason`   | string | 本次操作出错原因。 |

你可以通过检索 `errorCode` 字段的[错误码](/zh-CN/realtime-media/rtm/build/troubleshooting)了解错误原因，并找到对应的解决方法。

## IStreamChannel::RenewTokenAsync [#istreamchannelrenewtokenasync]

### 接口描述 [#接口描述-1]

调用 `IStreamChannel::RenewTokenAsync` 方法更新 RTC Token。

为保证及时更新 Token，声网推荐你监听 `OnTokenPrivilegeWillExpire` 回调，详见[事件监听](/zh-CN/api-reference/rtm/unity/configuration#事件监听)。成功添加事件监听后，当 RTC Token 还有 30 秒过期时，SDK 会触发 `OnTokenPrivilegeWillExpire` 回调，提醒用户 Token 即将过期。收到该回调时，你可以在服务端重新生成 RTC Token，然后调用 `RenewTokenAsync` 方法，将新生成的 RTC Token 传给 SDK。

### 接口方法 [#接口方法-1]

你可以通过以下方式调用 `IStreamChannel::RenewTokenAsync` 方法：

```csharp
RtmResult<RenewTokenResult> RenewTokenAsync(string token);
```

| 参数 | 类型 | 是否必填 | 默认值 | 描述 |
| --- | --- | --- | --- | --- |
| `token` | string | 必填 | - | 新生成的 RTC Token。 |
| `resultCallback` | `ResultCallback<Void>` | 必填 | - | [token-unity-html-1-2-4 details](#table-slot-token-unity-html-1-2-4) |

<a id="table-slot-token-unity-html-1-2-4"></a>

**token-unity-html-1-2-4 details**

调用结果回调：

- 调用成功：执行 `onSuccess` 方法。
- 调用失败：执行 `onFailure` 方法。

### 基本用法 [#基本用法-1]

```csharp
var result =  await streamChannel.RenewTokenAsync("your_token");
if (result.Status.Error)
{
    // 更新失败，处理报错
    Debug.Log(result.Status.ErrorCode);
}
else
{
    // 更新成功
}
```

### 返回值 [#返回值-1]

`IStreamChannel::RenewTokenAsync` 操作返回一个 `RtmResult<RenewTokenResult>` 类型数据结构的返回值，其中包含：

|    属性    |       类型        | 描述         |
| ------- | ----- | ------------ |
|  `Status`  |   `RtmStatus`    | 无论操作是否成功，都返回一个 `RtmStatus` 类型的数据结构，其中包含本次操作的状态。  |
| `Response` | `RenewTokenResult` | 操作成功后，返回一个 `RenewTokenResult` 类型的数据结构，其中包含本次操作的执行结果。 |

`RtmStatus` 包含以下属性：

|    属性     |  类型  | 描述               |
| ------- | -- | ------- |
|   `Error`   |  bool  | 本次操作是否出错。 |
| `ErrorCode` | string | 错误码             |
| `Operation` | string | 本次操作类型。     |
|  `Reason`   | string | 本次操作出错原因。 |

你可以通过检索 `errorCode` 字段的[错误码](/zh-CN/realtime-media/rtm/build/troubleshooting)了解错误原因，并找到对应的解决方法。
