Zoom VideoSDK Sample(Windows) のための Token 作成 API

# Zoom Video SDK （Windows） サンプル
Zoom のオンラインミーティング機能をカスタマイズして、自分達のシステムに組み込むことができる　**[Zoom Video SDK](https://marketplace.zoom.us/docs/sdk/video/introduction)**。

Windows や Mac などのネイティブアプリはもちろん、WebアプリにもZoomの機能を組み込むことができるので夢が広がります。

実際に動作検証をするにあたり、 **Windows SDK のサンプルアプリ** を実行する際に躓いた `token作成` についてメモを残します。ここで作成した仕組みを応用すれば、トークンを払い出すためのWebAPIも作成できるのではないかと思っています。

## Zoom Video SDK のWindows版サンプル
SDK パッケージに含まれるサンプルプロジェクトをビルドして実行すると、下記スクリーンショットの画面が表示されます。ここで、**token** を入力する必要があります。

![スクリーンショット 2021-12-27 18.11.34.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/d60ab65c-f153-ee70-35e5-5a7159c78c3d.png)

token ミーティングルームを作成するための認証に利用します。
**JWT 形式** になっており、 **SDKキー** や **SDKシークレット**　などを元に作成する必要があります。

[Zoom VideoSDK - Authentication](https://marketplace.zoom.us/docs/sdk/video/auth)

JWTを作成するためのサンプルが [Zoom VideoSDK(Web) Sample](https://github.com/zoom/sample-app-videosdk) で公開されているので、Lambdaで実行できるようにしてみます。

## AWS Lambda
### モジュールレイヤーの作成

AWS Lambda の Node.js ランタイムで npm モジュールを利用するため、レイヤーを作成します。
[ドキュメント-Lambda レイヤーの作成と共有](https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/configuration-layers.html)

**※以下は AWS CloudShell で作業します。**
[ドキュメント-CLI aws lambda publish-layer-version](https://docs.aws.amazon.com/cli/latest/reference/lambda/publish-layer-version.html)

#### RSA-Sign JavaScript Library

javascript の暗号化ライブラリを含むレイヤーを作成します。
[github - jsrsasign](https://kjur.github.io/jsrsasign/)

```
#
# AWS ドキュメントに沿ったパス作成
$ mkdir nodejs
$ cd nodejs

#
# パッケージインストール
$ npm install jsrsasign --save

#
# レイヤー用 Zip ファイル作成
$ cd ..
$ zip -r layer.zip ./nodejs

#
# レイヤー作成
aws lambda publish-layer-version \
 --layer-name "js-rsa-sign" \
 --description "RSA-Sign JavaScript Library" \
 --zip-file fileb://./layer.zip \
 --compatible-runtimes nodejs12.x nodejs14.x

# {結果のJSON が出力される}

#
# 後片付け
$ rm -rf nodejs/
$ rm layer.zip
```

#### 

### Lambda 関数作成
[Zoom VideoSDK Sample](https://github.com/zoom/sample-app-videosdk) のソースコードを参考に、JWTを作成する処理を作成します。

**AWS Lambda** コンソール右上の「関数の作成」ボタンをクリックします。
![](https://raw.githubusercontent.com/Kakimoty-Field/transfarMailToLine/master/img/lambda/300.png)


**関数の作成** 画面では、以下の項目を設定します。

- １から作成 を選択します。
- 関数名は任意の文字列を入力します。
- ランタイムは `Node.js 14.x` を選択します。

設定が完了したら、画面下部の「関数の作成」ボタンをクリックします。

![](https://raw.githubusercontent.com/Kakimoty-Field/transfarMailToLine/master/img/lambda/310.png)

**lambda 関数設定画面**の最下部、 **レイヤー** グループの「レイヤーの追加」ボタンをクリックします。

![](https://raw.githubusercontent.com/Kakimoty-Field/transfarMailToLine/master/img/lambda/320.png)

**レイヤーを追加**画面では、`カスタムレイヤー`を選択し、ドロップダウンリストから `jsrsasign`を追加します。

### ソースコードデプロイ


```javascript:index.js
const KJUR = require('jsrsasign');

exports.handler = async (event) => {

  let sdkKey = process.env.ZOOM_SDK_KEY;
  let sdkSecret = process.env.ZOOM_SDK_KEY_SECRET;
  let topic = "sessionName";  // サンプルプログラムの Session名になります
  let userIdentity = 'kakimo'; // ユーザ名を指定する想定です

  let signature = '';
  try {
    const iat = Math.round(new Date().getTime() / 1000);
    const exp = iat + 60 * 60 * 2;

    // ヘッダー
    const oHeader = { alg: 'HS256', typ: 'JWT' };

    // ペイロード
    const oPayload = {
      app_key: sdkKey,
      version: '1',
      user_identity: userIdentity,
      iat,
      exp,
      tpc: topic,
    };

    const sHeader = JSON.stringify(oHeader);
    const sPayload = JSON.stringify(oPayload);
    signature = KJUR.jws.JWS.sign('HS256', sHeader, sPayload, sdkSecret);
  } catch (e) {
    console.error(e);
  }
  
  return signature;    
};
```

### 環境変数設定
VideoSDK のミーティングルームセッションを作成するために、**SDK キー** と **SDK シークレット** を環境変数に設定します。
画面中段部分の **設定**タブをクリックし **環境変数** メニューをクリックします。

環境変数入力欄には、下記の変数を設定します。

| キー | 値 |
| --- | --- |
| ZOOM_SDK_KEY | SDK キー |
| ZOOM_SDK_KEY_SECRET | SDK シークレット|

### テスト実行
Lambda の **Test** で空パラメータのテストを作成し、テストを実行します。

これまでの設定が正しい場合、 **Execution results タブ** の `Response` に JWT が出力されます。

```
Test Event Name
test

Response
"eyJhbGc********pXVCJ9.eyJhcHB===++++++09890238302948AfYASDFA0MDYwMzI4MywidHBjIjoibW9ubGFiMiJ9.YTkc46eZCWBlU6---------o99Q"

Function Logs
START RequestId: ****-***-**** Version: $LATEST
END RequestId: ****-***-****
REPORT RequestId: ****-***-****	Duration: 49.72 ms	Billed Duration: 50 ms	Memory Size: 128 MB	Max Memory Used: 58 MB	Init Duration: 187.87 ms

Request ID
201****-***-****
```
この JWT を Windowsアプリケーションの token 欄に入力します。

## Zoom Video SDK サンプルアプリの実行

サンプルアプリケーションを起動すると、下記画面が表示されます。 
画面左上の `歯車ボタン` をクリックします。

![スクリーンショット 2022-01-07 9.59.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/7efd8595-ed88-aeb0-c0b9-0c9d5e40beb8.png)

### Session Settings
**Session Settings** 画面が表示されます。ミーティングに使用するデバイスの設定や、映像のレンダリング方法を設定できます。
最下部に `token` を入力する欄があるので、 [Lambdaで作成したJWT](#テスト実行)を入力します。 
入力したら画面右上の 「×」 をクリックします。
![スクリーンショット 2022-01-07 9.50.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/e7f71eb8-21c6-2dba-c0b2-e2ee9bb82ad5.png)

### Create a Session
トップ画面に戻るので `Create a Session` ボタンをクリックします。

![スクリーンショット 2022-01-07 9.48.29.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/fe2057dd-c26b-7f05-0649-5089159797f2.png)

**Create a Session** 画面が表示されます。

|  項目 |  概要  |
| ---- | ---- |
|  Session Name |  ミーティングセッションIDを入力します。 [ソースコードの topic変数](#ソースコードデプロイ)に設定した文字列を入力します。 |
|  Your Name  | ミーティング参加者名を入力します。ミーティングに参加したときに表示されます。  | ---- |
|  Password(optional)  |  空にすることもできます。入力すると２人目がミーティングに参加するときにパスワード入力する必要があります。  |

![スクリーンショット 2022-01-07 10.01.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311258/161c44a1-c002-ab52-09a7-333c761db716.png)
入力が終わったら　`Create` ボタンをクリックします。

`token`や`Session Name`が正しく入力されている場合は、ミーティングルームが作成されます。

### Join a Session
２人目以降がミーティングに参加する場合はトップ画面の`Join a Session`ボタンをクリックします。操作は[Create a Session](#create-a-session)画面と同じです。