## 一.企业应用鉴权
### 1.鉴权前提

- 百家云颁发应用的appId和appSecret
- 开发者需在自己的服务端集成Signature生成算法(参考第四节)
- SDK初始化时需传入AppID

### 2.第三方客户端AppID鉴权流程图
![authentication](http://img.baijiayun.com/0ewiki/attachments/24a4db41cdae523c2777beba809f94b9.jpg)
### 3.第三方客户端生成签名 【signature】
- 第三方客户端将userId（第三方userId）发送给第三方服务器。
- 第三方服务器根据appId、userId、appSecret等，生成鉴权用的签名材料signature。
- 第三方服务端返回signature，以及 expireTime 和 nonce 值。
- 第三方客户端调用客户端SDK的Login接口，参数为userId、signature、expireTime和nonce。
- 客户端 SDK 去Boom服务端鉴权。


### 4.第三方客户端生成签名的算法
```
Signature = HexEncode(HMAC-SHA256((appId + ":" + userId + ":" + expireTime + ":" + nonce), appSecret))
```

#### 算法说明：

- HMAC-SHA256 的输入数据是 appId、userId、expireTime、nonce 值，中间用“:”分隔。
- HMAC-SHA256 的密钥是 appSecret。
- HMAC-SHA256 生成的二进制数需要转换为十六进制字符串（HexEncode）
- expireTime：鉴权签名材料 signature的过期时间戳。单位是秒。比如当前的系统的时间戳是1704060000，signature有效期设置成10分钟，则 expireTime = 1704060000+10*60 = 1704060600
- nonce：随机字符串，每次计算鉴权签名材料 signature时都必须不同。字符串长度为32~64字节



## 二.Boom JSSDK

BoomMeeting 是为了让Boom平台的第三方用户更加高效和快捷的接入Boom音视频能力的抽象出来 SDK 产品，第三方应用仅用有限几步，就可以获取Boom的全部音视频能力。


### Installation

BoomMeeting为UMD打包方式，兼容了AMD common.js 等多种模块技术的引用

以下所有功能，皆可在index.html或者main.js中找到对应示例


* step1: 
    - 服务端获取签名信息 `step4`登录的时候 需要用到 这些参数 { userId, nonce, expireTime, nickname, signature }
	参考生成签名算法


* step2:

    在自有工程index.html中引入对应的js

    ```
    <script src="https://clientpkg.boom.cn/download/js-lib/BoomMeetingExternal.min.js"></script>

    ```

    其中 BoomMeeing.js 为Boom平台的api入口文件
    main.js为第三方业务处理文件（可根据项目情况自定义class或者js业务处理文件）

* step3: 
    - baseURL: 是私有化部署之后服务器接口的地址
    - domain: 是私有化部署之后会议室页面的地址

    ```javascript
    BoomMeetingExternal.setup({appId, baseURL, domain})
    ```
* step4: 调用登录接口，传入业务端的用户id,用户昵称，nonce, expireTime, signature

    ```javascript
    BoomMeetingExternal.login({userId, nonce, expireTime, nickname, signature}).then((data)=>{
        showToast('登录成功')
    }).catch(error=>{
        console.log(error)
    })
    ```

* step5: 监听事件

    ```javascript
    BoomMeetingExternal.on('participant-joined', (data) => {
        console.log('------participant-joined listener-------', data);
        var tarP = data.detail.participant;
        showToast('有小伙伴加入房间:' + JSON.stringify(getNickName(tarP)));
    });
    BoomMeetingExternal.on('participant-left', (data) => {
        console.log('------participant-left listener-------', data);
        var tarP = data.detail.participant;
        showToast('有小伙伴离开房间:' + JSON.stringify(getNickName(tarP)));
    });
    BoomMeetingExternal.on('room-error', (data) => {
        console.log('------room-error listener-------', data);
        var nickNames = [];
        var tarError = data.detail.error;
        console.log('加入房间失败' + JSON.stringify(tarError));
        showToast('加入房间失败' + JSON.stringify(tarError));
    });
    BoomMeetingExternal.on('room-end', (data) => {
        console.log('------room-end listener-------', data);
        var nickNames = [];
        console.log('结束了会议')
        showToast('结束了会议');
    });
    ```



* step6: 加入房间(加入之前，需要先去后台创建)

    ```javascript
    BoomMeetingExternal.join({roomId: '424830', nickname:'nickname', mode:'live' | 'meeting' | 'audio'}).then((data)=>{
        showToast('加入成功')
    }).catch(error=>{
        console.log(error)
    })
    ```
    
* step7: 离开房间

	```javascript
	BoomMeetingExternal.leave().then((data)=>{
	    showToast('离开成功')
	}).catch(error=>{
	    console.log(error)
	})
	```






<!-- ## 三.restApi
{@tutorial restAPI}

## 四.点播转码流程图
{@tutorial vod} -->



# boom-web-saas-external
Boom js SDK

```
npn install
```

## tsc 生成 types 文件. dist 文件

```
    tsc
```

## npm run build 生成打包文件

```
    npm run build
```

## npm run jsdoc:generate 生成开发文档

```
npm run jsdoc:generate
```

## 参考: 
- https://segmentfault.com/a/1190000021695864
- https://www.cnblogs.com/share123/p/10141615.html
- https://blog.csdn.net/weixin_48986139/article/details/114269077


## sample 是示例代码, 跑起来之后会在 localhost:3004 上访问到 

```
cd sample; npm run start
```

