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

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

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

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

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

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

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

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

## renewToken [#renewtoken]

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

调用 `renewToken` 方法更新 Token。

更新不同类型的 Token 时，需要填写的参数不同：

- RTM Token：更新时只需填写 `token` 参数。
- RTC Token：更新时需填写 `token` 和 `channelName` 参数

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

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

你可以通过以下方式调用 `renewToken` 方法：

```javascript
rtm.renewToken(token: string, options?: object): Promise<RenewTokenResponse>
```

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

`options` 对象中包含以下属性：

|     属性     |  类型  | 是否必填 | 默认值 | 描述  |
| --------- | --- | ----- | --- | ----------- |
| `channelName` |      string       |   选填   |   -    |    频道名称。更新 RTC Token 时必须填写。    |

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

示例 1：更新 RTM Token

```javascript
rtmClient.addEventListener('tokenPrivilegeWillExpire', async (channelName) => {
    if(!channelName){
        // RTM Token 即将过期
        const newToken = "<Your new token>";
        await rtmClient.renewToken(newToken);
    }
});
```

示例 2：更新 RTC Token

```javascript
rtmClient.addEventListener('tokenPrivilegeWillExpire', async (streamChannelName) => {
    if(streamChannelName){
        // RTC Token 即将过期。
        const newToken = "<Your new token>";
        await rtmClient.renewToken(newToken, {
            channelName: streamChannelName
        });
    }
});
```

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

如果方法调用成功，则返回一个 `RenewTokenResponse` 类型数据：

```javascript
type RenewTokenResponse = {
    timestamp: number,              // 预留字段
}
```

如果方法调用失败，则返回一个 `ErrorInfo` 类型数据：

```javascript
type ErrorInfo = {
    error: boolean;                     // 本次操作是否出错
    operation: string;                  // 本次操作的 API 名称
    errorCode: number;                  // 错误码
    reason: string;                     // 错误描述
}
```

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