# 概览

开发者如果不需要保利威 Saas 的观看条件验证功能时，可通过保利威 Api 接口生成观众登录令牌（以下统称 **登录令牌**），令牌验证通过后即可绕过观看条件限制进入直播观看页，详细用法可见以下文档：

## 一、处理流程

### 1.1 步骤1：获取登录令牌

通过保利威 Api 接口获取观众登录令牌，接口文档可见：[生成登录令牌](https://git.polyv.net/help-center/document-center/-/blob/master/live/js/new_sdk/live_watch_sdk/articles/verify/create-login-token/README.md)。

> 由于该接口涉及 appSecret 进行参数签名，建议该步骤由服务端生成。

### 1.2 步骤2：验证登录令牌

通过步骤1 生成登录令牌后，通过验证接口验证登录令牌，验证通过后从接口响应头中获取 `x-auth-token`，该 token 为观看页 SDK 使用的验证令牌，接口文档可见：[验证登录令牌](https://git.polyv.net/help-center/document-center/-/blob/master/live/js/new_sdk/live_watch_sdk/articles/verify/verify-login-token/README.md)。

### 1.3 步骤3：设置 x-auth-token

通过步骤2 获取 `x-auth-token` 后，可调用观看页 SDK 核心实例的 `setXAuthToken` 方法设置令牌。

### 1.4 步骤4：安装核心实例

通过步骤3 设置后即可根据正常流程安装核心实例，注意关于登录令牌的流程仅在首次安装前需要，二次安装则不再需要该流程。

## 二、示例代码

以下为 js 方式的流程示例代码：

```js
import { send } from '@just4/ajax/ajax';
import md5 from 'md5';
import { createWatchCore } from '@polv/live-watch-sdk';

/**
 * 生成签名
 * @param {Object} data 请求参数
 * @param {String} secret 签名密钥
 * @returns 签名串
 */
function getSign(data, secret) {
  let text = '';
  const keys = Object.keys(data).sort();

  for (const key of keys) {
    text += `${key}${data[key]}`;
  }
  const sign = md5(secret + text + secret);
  return sign.toUpperCase();
}

async function example() {
  const channelId = '频道号';

  // 创建观看页 SDK 核心实例
  const watchCore = createWatchCore({
    channelId,
  });

  // 请求数据
  const reqData = {
    appId: '应用 ID，从管理后台获取',
    timestamp: Date.now(),
    channelId,
    viewerId: '观众 id',
    nickname: '观众昵称',
  };
  // 应用密钥，从管理后台获取，建议获取登录令牌流程在服务端中进行，避免将应用密钥直接暴露在 js 中
  const appSecret = 'xxxxx';
  // 生成签名
  const sign = getSign(reqData, appSecret);
  reqData.sign = sign;

  // 步骤1：通过 ajax 获取登录令牌
  const response = await send('//api.polyv.net/live/v3/channel/watch/get-api-token', {
    method: 'post',
    data: reqData,
  });
  const result = response.data;
  const loginToken = result.data.token;

  // 步骤2：验证登录令牌
  const res = await send('//watch-api.polyv.cn/v3/common/auth/api-auth/viewer/set-info', {
    method: 'post',
    data: {
      channelId,
      token: loginToken,
    },
  });
  // 从响应头中获取 x-auth-token
  const xAuthToken = res.xhr.getResponseHeader('x-auth-token');
  if (!xAuthToken) {
    throw new Error('获取失败，响应头中没有 x-auth-token')
  }

  // 步骤3：设置 x-auth-token
  watchCore.setXAuthToken(xAuthToken);

  // 步骤4：安装核心实例
  await watchCore.setup();
}
```

## 三、时序图

关于登录令牌的流程图如下：

![](https://git.polyv.net/help-center/document-center/-/blob/master/live/js/new_sdk/live_watch_sdk/assets/login-token.png)
