Open8
Zoom APIを使ってみて設計する上での注意点
はじめに
- プロダクトでZoom APIを使う機会があった
- 実際に使ってみて、一部設計上考慮すべき点があったのでその備忘的な記事
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認証方式を選択
Server to Server OAuth App の特徴
ここに詳しく書いてある
Qiitaをよく見ると、公式Docには書いていなかった
再発行すると以前のトークンは失効
という仕様を発見。有効なトークンは常に1つだけということ...
APIを同時実行した場合、先に発行したトークンが失効してしまうため、同時実行しない考慮をする必要が生じた。
で、どうしたか
- Zoom APIを実行する処理にキュー(Cloud Tasks)を挟んだ
- 同時実行されないようにmax concurrent を1に設定した
- 今の所問題はおきていない
もしかしたらサポート経由で有効トークン数を増やしてもらえるかも...?
サポートとのやりとり継続中のため、まだなんとも
(後日談)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]
}
動作を確認できた
-
token_index=1
でトークンを取得したあとに、token_index=2
で取得しても先にtoken_index=1
で発行したトークンは失効しない -
token_index=1
でトークンを再度取得すると、前回token_index=1
で取得したトークンは失効する
今後の方針としては
- 公式ドキュメントに記載はまだ無い (2022/10/3時点) ので、積極的には使いたくないが
- 「ユーザー起動タスク」と「バックグラウンドタスク」では別の
token_index
を使うのが良いと思っている- (ユーザー起動タスクとバックグラウンドタスクは同時にAPIコールする可能性があるため)
Zoom の develoer forumにもほぼ同じ悩みを抱えたユーザがいた