はじめに
以前こちらの記事でOAuth Appの利用について投稿しましたが、
その後Marketplace UIの刷新など大きな変更点があったため、前出の 2025年版 はじめての Zoom API - Server to Server OAuth編 と同様改めてリライトしたものをお送りいたします。不明点などあれば、コメントやDMでどしどしお寄せください。
OAuth Appとは?
ZoomのOAuth Appは、「ユーザー個別認証」に特化した認証方式です。詳細は、上述の解説に詳しく載っているのでそちらを参照してみてください。
通常のOAuth(ユーザー認証あり)
OAuth Appは、
- エンドユーザーが自分で認証画面にログインし、権限を与える
- サービスA(たとえば自作アプリ)がサービスB(Zoomなど)の「あなたの情報へのアクセス権」を "本人同意"で取得 する
- 各ユーザーごとに個別の認証・許可が必要
というフローです。そのためユーザーの明示的な同意が必要になります。
Server to Server OAuth App(サーバー間認証)
一方、Server to Server OAuth Appは
- ユーザー個別の認証を必要とせず
- システム同士(自社システム⇔Zoom)で、管理者権限のトークンを使ってAPI通信を行う方式です
主な違いとして
| OAuth(ユーザー認証) | Server to Server OAuth App(サーバー認証) | |
|---|---|---|
| 利用シーン | ユーザー個人のZoom連携・外部サービスとの連携 | 社内自動化・バッチ・管理者主導の連携 |
| 認証フロー | 各ユーザーごとに認証画面で同意・許可 | 管理者が一度設定すればOK |
| 権限範囲 | 認証したユーザーの権限のみ | 管理者権限(アカウント全体) |
| 利用例 | ユーザーごとのZoom予定取得 ユーザーのZoom Phone録音取得など |
社内自動会議作成 定期的なアカウントのレポート取得など |
「ユーザーごとに"許可"を得てデータを取る」場合はOAuth、「自動的にシステムで操作したい」「管理者として全体を操作したい」場合はServer to Server OAuth Appを使う、というイメージです。
Server to Server OAuth Appで発行されるトークンは管理者と同等の権限を持っていますので取り扱いにはご注意ください。
また、IDやSecret、発行したトークンは社外共有禁止となっています。例えば、Zoomのミーティング、ウェビナーなどの自動化を目的として Server to Server OAuth Appの作成を促し、そのClient IDやSecretを要求するサードパーティのサービスなども同様に規約違反となります。
社外公開や外部連携の場合はOAuthアプリやISV契約を検討しましょう。
OAuth Appの特徴
OAuth アプリには以下のような特徴があります。
- ユーザーが個別に認証・同意することでそのユーザーの権限でAPIアクセスできます
- アクセストークンの有効期限は1時間
- リフレッシュトークンの有効期限は90日(適切に更新すれば継続利用可能)
- ユーザーがアプリの認証を取り消すと、そのユーザーのトークンは無効化されます
- 必要なAPIスコープのみ付与できます(最小限の権限付与を推奨)
OAuth Appで発行されるトークンは認証したユーザーの権限を持っていますので取り扱いにはご注意ください。
また、外部公開する場合はMarketplaceでの審査が必要になります。
リフレッシュトークンの有効期限は現在90日に変更となっています。
公式規約リンク
Marketplaceでの作成手順
-
Zoom Marketplaceにサインインします。
-
サインインしたユーザーがオーナーでない場合、「管理者 > 役割」から OAuth App の権限を付与して「設定を保存」します。
-
Marketplace右上の「Build App」→「General App」を選択し「Create」をクリックします。

-
「App Name」に名前を入力します。
「Choose app type」で以下を選択します: -
もし社内で他のメンバーにも利用させたい場合、上部のProductionタブから必要な追加情報を入力の上、Add your app画面の「Share within your account」からURLを社員に共有します。
アクセストークン生成方法 🔑
OAuth Appでは、ユーザーの認証を経て「Authorization Code」を取得し、それを使って「Access Token」を生成します。
OAuth認証フロー
Step 1: 認証URLの生成
ユーザーを以下のURLにリダイレクトします:
https://zoom.us/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}
Step 2: Authorization Codeの取得
ユーザーが認証すると、設定したRedirect URLにcodeパラメータが付いてリダイレクトされます:
https://your-redirect-url.com?code=AUTHORIZATION_CODE
Step 3: Access Tokenの取得
Authorization Codeを使ってAccess Tokenを取得します。
Node.jsでの実装例
const axios = require('axios');
const clientId = '<Client ID>';
const clientSecret = '<Client Secret>';
const authCode = '<Authorization Code>';
const redirectURL = '<Redirect URL>';
async function getAccessToken(authCode) {
const url =
"https://zoom.us/oauth/token?grant_type=authorization_code&code=" +
authCode +
"&redirect_uri=" +
redirectURL;
try {
const response = await axios.post(url, null, {
headers: {
Authorization:
"Basic " +
Buffer.from(clientId + ":" + clientSecret).toString("base64"),
},
});
return {
accessToken: response.data.access_token,
refreshToken: response.data.refresh_token,
expiresIn: response.data.expires_in
};
} catch (error) {
console.error('Error getting access token:', error.response?.data || error.message);
return null;
}
}
Curlコマンドでの実行例
curl -s --request POST \
--url "https://zoom.us/oauth/token?grant_type=authorization_code&code=<AUTHORIZATION_CODE>&redirect_uri=<REDIRECT_URI>" \
--header "Authorization: Basic $(echo -n '<Client ID>:<Client Secret>' | base64)" \
| jq -r .access_token
リフレッシュトークンによる継続認証
Access Tokenは1時間で期限切れになりますが、Refresh Tokenを使って新しいAccess Tokenを取得できます。
Refresh Tokenの特徴
- 有効期限は90日
- 新しいAccess Tokenを取得する際に新しいRefresh Tokenも発行される
- 適切に更新すれば継続的にAPI利用が可能
Refresh Tokenでのトークン更新
Node.jsでの実装例
async function refreshAccessToken(refreshToken) {
const url =
"https://zoom.us/oauth/token?grant_type=refresh_token&refresh_token=" +
refreshToken;
const response = await axios.post(url, null, {
headers: {
Authorization:
"Basic " +
Buffer.from(clientId + ":" + clientSecret).toString("base64"),
"Content-Type": "application/x-www-form-urlencoded",
},
});
return {
accessToken: response.data.access_token,
refreshToken: response.data.refresh_token,
expiresIn: response.data.expires_in
};
}
Curlコマンドでの実行例
curl -s --request POST \
--url "https://zoom.us/oauth/token?grant_type=refresh_token&refresh_token=<REFRESH_TOKEN>" \
--header "Authorization: Basic $(echo -n '<Client ID>:<Client Secret>' | base64)" \
--header "Content-Type: application/x-www-form-urlencoded" \
| jq -r .access_token
APIリクエスト例
取得したアクセストークンを使い、Zoom APIにリクエストできます。以下は、認証したユーザーの情報を取得するコマンドです。
Curlで実行する
# access_tokenを取得して保存(事前に認証フローを完了している必要があります)
export access_token="YOUR_ACCESS_TOKEN_HERE"
# 取得したトークンを使って /v2/users/me エンドポイントを呼び出し、display_nameを取得
curl -s --request GET --url 'https://api.zoom.us/v2/users/me' \
--header "Authorization: Bearer $access_token" | jq -r .display_name
Node.jsで実行する
const axios = require('axios');
const baseUrl = 'https://api.zoom.us';
async function getUserInfo(accessToken) {
try {
const response = await axios.get(`${baseUrl}/v2/users/me`, {
headers: { 'Authorization': `Bearer ${accessToken}` },
});
return response.data;
} catch (err) {
console.error('Error getting user info:', err.response?.data || err.message);
return null;
}
}
// 使用例(トークンマネージャーと組み合わせ)
const tokenManager = new ZoomTokenManager(clientId, clientSecret);
(async () => {
console.log('Starting OAuth flow...');
// 事前にOAuth認証フローを完了してrefreshTokenを取得済みと仮定
tokenManager.refreshToken = 'YOUR_REFRESH_TOKEN_HERE';
const accessToken = await tokenManager.getValidAccessToken();
if (accessToken) {
const userInfo = await getUserInfo(accessToken);
if (userInfo) {
console.log(`Hello, ${userInfo.display_name}!`);
}
}
})();
参考リンク・リソース
重要なポイント:
- Refresh Tokenを適切に管理・更新することで長期間の利用が可能
- Access Tokenは1時間で期限切れになるため、期限管理が重要
- スコープは必要最小限に設定し、セキュリティを確保
外部公開する場合は、必ずMarketplaceでの審査を受けてください。社内利用の場合でも、ユーザーのプライバシーとセキュリティを最優先に考慮して実装しましょう。
困ったときは公式ドキュメントやZoomサポートも活用してください。
この記事は、Zoom Communications, Inc.の公式にサポートされているものではなく、個人的に公開しているものになります。Zoom Communications, Inc.とその従業員、および関連会社は、本記事の使用や保守について責任を負いません。技術的な議論やサポートが必要な場合は、作成者やZoom開発者コミュニティ( https://devforum.zoom.us/ )にご連絡いただけますが、この記事にはサービスレベル契約に基づくサポートがないことをご理解ください。




