Open8

Zoom APIを使ってみて設計する上での注意点

yaguchiiyaguchii

Zoom APIの認証方式

Zoom APIを利用するためのトークンを取得する方法は様々

  • OAuth
    • OAuth 2.0のフローに従ってZoomにサインイン認証する
    • ブラウザを必要とする
  • Server-to-Server
    • ブラウザでの認証を必要としない
    • サーバ間通信で利用する認証方式
  • JWT apps
    • JWT(SON Web Token)に準じたトークンを生成する
    • 任意でExpiration Timeを設定する
    • JWTにはrevoke(破棄)させる概念がないため、一度発行したトークンは失効期日を過ぎない限り利用可能
    • 2023年6月に廃止を予定

今回は、サーバ側で使いたかったため、Server-to-Server認証方式を選択

yaguchiiyaguchii

Server to Server OAuth App の特徴

ここに詳しく書いてある
https://qiita.com/yosuke-sawamura/items/fa036273a161b190478b

Qiitaをよく見ると、公式Docには書いていなかった

再発行すると以前のトークンは失効

という仕様を発見。有効なトークンは常に1つだけということ...
APIを同時実行した場合、先に発行したトークンが失効してしまうため、同時実行しない考慮をする必要が生じた。

yaguchiiyaguchii

で、どうしたか

  • Zoom APIを実行する処理にキュー(Cloud Tasks)を挟んだ
  • 同時実行されないようにmax concurrent を1に設定した
  • 今の所問題はおきていない
yaguchiiyaguchii

もしかしたらサポート経由で有効トークン数を増やしてもらえるかも...?

サポートとのやりとり継続中のため、まだなんとも

yaguchiiyaguchii

(後日談)Zoomサポート側に有効トークン数を増やしてもらう

  • アクセストークンを取得する際に、token_indexクエリを追加で指定してとのこと
    • token_indexに異なる値を指定することで、トークンが失効しないようになる
    • つまりtoken_index=1を指定してトークンを取得した後にtoken_index=2を指定してもtoken_index=1で取得したトークンは失効しない
    • token_indexの最大値は10まで指定できるとのことなので、10でお願いした
POST https://zoom.us/oauth/token?grant_type=account_credentials&account_id={accountId} 
HTTP/1.1
Host: zoom.us
Authorization: Basic Base64Encoder(clientId:clientSecret)
{
      “Access_token“: String,
      “Token_type”: “bearer”,
      “Expire_in”: long,
      “scope” : [String]
}

POST https://zoom.us/oauth/token?grant_type=account_credentials&account_id={accountId}&token_index={num}
HTTP/1.1
Host: zoom.us
Authorization: Basic Base64Encoder(clientId:clientSecret)
{
      “Access_token“: String,
      “Token_type”: “bearer”,
      “Expire_in”: long,
      “scope” : [String]
}
yaguchiiyaguchii

動作を確認できた

  • token_index=1でトークンを取得したあとに、token_index=2で取得しても先にtoken_index=1で発行したトークンは失効しない
  • token_index=1でトークンを再度取得すると、前回token_index=1で取得したトークンは失効する

今後の方針としては

  • 公式ドキュメントに記載はまだ無い (2022/10/3時点) ので、積極的には使いたくないが
  • 「ユーザー起動タスク」と「バックグラウンドタスク」では別のtoken_indexを使うのが良いと思っている
    • (ユーザー起動タスクとバックグラウンドタスクは同時にAPIコールする可能性があるため)