Token导航 LogoToken导航

Agent Skill · 开发

zoom-oauth(zoom OAuth 安全)

用于辅助安全审计、权限检查、凭据风险、认证流程和常见漏洞排查。它适合让 Agent 梳理敏感配置、检查依赖风险、分析鉴权逻辑或生成安全复核清单。使用时不能把工具输出直接当最终结论,涉及密钥、令牌、用户数据或生产系统时,应先确认最小权限、脱敏方式和操作边界。

zoom-oauth 是开发类 Agent Skill,可用宿主为 Codex、Claude、Cursor、Gemini CLI,通过GitHub 仓库获取,权限为接触敏感数据;许可证信息还不明确,第三方扫描已通过,按安装量在开发类的 21,746 个 Skill 里排第 5,328。

总安装 6,510周安装 274GitHub Stars 11,719下载 2,280核验 2026-05-01

安装说明

本站只整理中文说明,不托管安装包,也不代用户安装。
GitHub
许可证
unknown

安装方式

通过对话安装

复制提示词发给支持本地命令或 Skills 的 AI 助手,先确认命令和权限,再让它执行。

请帮我安装这个 Agent Skill:zoom-oauth(zoom OAuth 安全)
来源仓库:https://github.com/anthropics/knowledge-work-plugins
仓库路径:skills/zoom-oauth
安装命令:
npx skills add https://github.com/anthropics/knowledge-work-plugins --skill zoom-oauth
安装前请先检查当前环境是否支持对应 CLI,并向我确认将要执行的命令、安装目录、联网范围和文件读写权限;确认后再执行。

命令行安装

复制命令到本机终端执行。该命令会通过 npx skills 从第三方来源获取 Skill;本站只展示命令,不托管安装包,也不自动执行。

skills.shnpx skills
npx skills add https://github.com/anthropics/knowledge-work-plugins --skill zoom-oauth

这个 Skill 是做什么的

开发类 Skill 面向写代码、改代码和排查问题,一般会读写仓库文件,部分还会执行构建或测试命令。

zoom-oauth 用于辅助安全审计、权限检查、凭据风险和认证流程排查。适合让 Agent 梳理敏感配置、检查依赖风险或分析鉴权逻辑。通过 npx skills add 命令从指定 GitHub 仓库安装并使用。使用时不能把工具输出直接当最终结论,涉及密钥、令牌或用户数据时应先确认最小权限。

zoom-oauth 属于开发类 Skill,可作为该场景下的辅助能力补充。

来源仓库内路径:skills/zoom-oauth

上手步骤

4 步
  1. 1

    确认自己的宿主工具

    公开资料标注支持 Codex、Claude、Cursor、Gemini CLI;先确认自己用的是其中之一,再按对应工具的 Skills 目录放置。

  2. 2

    拿到安装命令

    可以直接复制的命令是 npx skills add https://github.com/anthropics/knowledge-work-plugins --skill zoom…;命令里的占位符换成自己的路径或密钥再执行。

  3. 3

    安装后重启宿主

    命令执行完要完全退出宿主工具再打开,让新装的 Skill 被重新扫描到,否则列表里可能看不到。

  4. 4

    按最小权限试用

    它需要接触敏感数据,先在测试目录或测试账号里跑,确认没问题再放到正式项目。

常见问题

6 条

zoom-oauth 怎么安装?

在终端执行 npx skills add https://github.com/anthropics/knowledge-work-plugins --skill zoom-oauth。装完完全退出宿主工具再打开,让它重新扫描本地 Skill。

zoom-oauth 支持哪些 AI 工具?

公开资料标注支持 Codex、Claude、Cursor、Gemini CLI。其他工具只要能读取本地 Skill 目录,一般也能手动放进去,但要自己确认触发方式是否一致。

zoom-oauth 需要什么权限?

权限级别是接触敏感数据。该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

zoom-oauth 是免费的吗?

公开资料没有标注明确许可证,收费和商用限制都无法确认。正式使用前请到来源仓库核对授权说明。

zoom-oauth 用的人多吗?

公开数据是累计安装 6,510 次,近一周安装 274 次,下载 2,280 次,GitHub 11,719 星。这些数字来自第三方目录统计,只能当作热度参考,不代表质量或安全性。

zoom-oauth 安全吗?

第三方扫描结果为通过,但这只覆盖已知的静态检查项,不能替代自己读一遍源码和安装命令。

值得选的地方和要先想清楚的地方

值得选的地方

  • 同时适配 4 种工具,换客户端不用重新找替代品。
  • 第三方扫描已通过,常见的高风险行为没有命中。
  • 来源仓库有 11,719 星,维护活跃度相对可查。

先想清楚的地方

  • 需要接触敏感数据,装到常用环境前要先评估影响面。
  • 许可证没有明确标注,能不能商用、能不能再分发都不确定。
  • 第三方目录整理,版本更新和行为细节以来源仓库为准。

适不适合你

更适合

  • 已经在用 Codex,想直接扩展它能力的人。
  • 需要处理开发类任务、又不想每次都手写提示词的人。

不太适合

  • 环境里有大量密钥、凭证,不方便给第三方 Skill 读取的人。
  • 需要明确授权才能用到公司项目里的场景。
  • 需要厂商级技术支持和 SLA 的生产系统。

开发类 Skill 对比

6 个同类
Skill总安装GitHub 星权限许可证扫描
skill-vetter

技能审查员 · OpenClaw

8,779,018986操作浏览器MIT-0通过
ontology

本体论 · OpenClaw

6,636,960576只读MIT-0通过
entra-app-registration

内部应用程序注册 · Codex、Claude

6,631,872764接触敏感数据未明确通过
entra-app-registration

内部应用程序注册 · Codex、Claude

3,757,680201接触敏感数据未明确通过
nano-banana-pro

纳米香蕉专业版 · OpenClaw

3,526,898364接触敏感数据MIT-0有提醒
zoom-oauth

zoom OAuth 安全 · 本页

6,51011,719接触敏感数据未明确通过

按安装量取同分类前几名;数字来自第三方目录统计,只作热度参考,不代表质量结论。

SKILL.md 原文

Zoom OAuth

Background reference for Zoom auth and token lifecycle behavior. Prefer setup-zoom-oauth first, then use this skill for the exact flow, scope, and error details.

Zoom OAuth

Authentication and authorization for Zoom APIs.

📖 Complete Documentation

For comprehensive guides, production patterns, and troubleshooting, see Integrated Index section below.

Quick navigation:

Prerequisites

  • Zoom app created in Marketplace
  • Client ID and Client Secret
  • For S2S OAuth: Account ID

Four Authorization Use Cases

Use CaseApp TypeGrant TypeIndustry Name
Account AuthorizationServer-to-Serveraccount_credentialsClient Credentials Grant, M2M, Two-legged OAuth
User AuthorizationGeneralauthorization_codeAuthorization Code Grant, Three-legged OAuth
Device AuthorizationGeneralurn:ietf:params:oauth:grant-type:device_codeDevice Authorization Grant (RFC 8628)
Client AuthorizationGeneralclient_credentialsClient Credentials Grant (chatbot-scoped)

Industry Terminology

TermMeaning
Two-legged OAuthNo user involved (client ↔ server)
Three-legged OAuthUser involved (user ↔ client ↔ server)
M2MMachine-to-Machine (backend services)
Public clientCan't keep secrets (mobile, SPA) → use PKCE
Confidential clientCan keep secrets (backend servers)
PKCEProof Key for Code Exchange (RFC 7636), pronounced "pixy"

Which Flow Should I Use?

                              ┌─────────────────────┐
                              │  What are you       │
                              │  building?          │
                              └──────────┬──────────┘
                                         │
                    ┌────────────────────┼────────────────────┐
                    │                    │                    │
                    ▼                    ▼                    ▼
          ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
          │  Backend        │  │  App for other  │  │  Chatbot only   │
          │  automation     │  │  users/accounts │  │  (Team Chat)    │
          │  (your account) │  │                 │  │                 │
          └────────┬────────┘  └────────┬────────┘  └────────┬────────┘
                   │                    │                    │
                   ▼                    │                    ▼
          ┌─────────────────┐           │           ┌─────────────────┐
          │    ACCOUNT      │           │           │     CLIENT      │
          │   (S2S OAuth)   │           │           │   (Chatbot)     │
          └─────────────────┘           │           └─────────────────┘
                                        │
                                        ▼
                              ┌─────────────────────┐
                              │  Does device have   │
                              │  a browser?         │
                              └──────────┬──────────┘
                                         │
                         ┌───────────────┴───────────────┐
                         │ NO                         YES│
                         ▼                               ▼
          ┌─────────────────────────┐         ┌─────────────────┐
          │        DEVICE           │         │      USER       │
          │     (Device Flow)       │         │  (Auth Code)    │
          │                         │         │                 │
          │ Examples:               │         │ + PKCE if       │
          │ • Smart TV              │         │   public client │
          │ • Meeting SDK device    │         │                 │
          └─────────────────────────┘         └─────────────────┘

Account Authorization (Server-to-Server OAuth)

For backend automation without user interaction.

Request Access Token

POST https://zoom.us/oauth/token?grant_type=account_credentials&account_id={ACCOUNT_ID}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "user:read:user:admin",
  "api_url": "https://api.zoom.us"
}

Refresh

Access tokens expire after 1 hour. No separate refresh flow - just request a new token.


User Authorization (Authorization Code Flow)

For apps that act on behalf of users.

Step 1: Redirect User to Authorize

https://zoom.us/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}

Use https://zoom.us/oauth/authorize for consent, but https://zoom.us/oauth/token for token exchange.

Optional Parameters:

ParameterDescription
stateCSRF protection, maintains state through flow
code_challengeFor PKCE (see below)
code_challenge_methodS256 or plain (default: plain)

Step 2: User Authorizes

  • User signs in and grants permission
  • Redirects to redirect_uri with authorization code: https://example.com/?code={AUTHORIZATION_CODE}

Step 3: Exchange Code for Token

POST https://zoom.us/oauth/token?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

With PKCE: Add code_verifier parameter.

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "refresh_token": "eyJ...",
  "expires_in": 3600,
  "scope": "user:read:user",
  "api_url": "https://api.zoom.us"
}

Refresh Token

POST https://zoom.us/oauth/token?grant_type=refresh_token&refresh_token={REFRESH_TOKEN}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}
  • Access tokens expire after 1 hour
  • Refresh token lifetime can vary; ~90 days is common for some user-based flows. Treat it as configuration/behavior that can change and rely on runtime errors + re-auth fallback.
  • Always use the latest refresh token for the next request
  • If refresh token expires, redirect user to authorization URL to restart flow

User-Level vs Account-Level Apps

TypeWho Can AuthorizeScope Access
User-levelAny individual userScoped to themselves
Account-levelUser with admin permissionsAccount-wide access (admin scopes)

Device Authorization (Device Flow)

For devices without browsers (e.g., Meeting SDK apps).

Prerequisites

Enable "Use App on Device" in: Features > Embed > Enable Meeting SDK

Step 1: Request Device Code

POST https://zoom.us/oauth/devicecode?client_id={CLIENT_ID}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "device_code": "DEVICE_CODE",
  "user_code": "abcd1234",
  "verification_uri": "https://zoom.us/oauth_device",
  "verification_uri_complete": "https://zoom.us/oauth/device/complete/{CODE}",
  "expires_in": 900,
  "interval": 5
}

Step 2: User Authorization

Direct user to:

  • verification_uri and display user_code for manual entry, OR
  • verification_uri_complete (user code prefilled)

User signs in and allows the app.

Step 3: Poll for Token

Poll at the interval (5 seconds) until user authorizes:

POST https://zoom.us/oauth/token?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code={DEVICE_CODE}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "refresh_token": "eyJ...",
  "expires_in": 3599,
  "scope": "user:read:user user:read:token",
  "api_url": "https://api.zoom.us"
}

Polling Responses

ResponseMeaningAction
Token returnedUser authorizedStore tokens, done
error: authorization_pendingUser hasn't authorized yetKeep polling at interval
error: slow_downPolling too fastIncrease interval by 5 seconds
error: expired_tokenDevice code expired (15 min)Restart flow from Step 1
error: access_deniedUser denied authorizationHandle denial, don't retry

Polling Implementation

async function pollForToken(deviceCode, interval) {
  while (true) {
    await sleep(interval * 1000);

    try {
      const response = await axios.post(
        `https://zoom.us/oauth/token?grant_type=urn:ietf:params:oauth:grant-type:device_code&device_code=${deviceCode}`,
        null,
        { headers: { 'Authorization': `Basic ${credentials}` } }
      );
      return response.data; // Success - got tokens
    } catch (error) {
      const err = error.response?.data?.error;
      if (err === 'authorization_pending') continue;
      if (err === 'slow_down') { interval += 5; continue; }
      throw error; // expired_token or access_denied
    }
  }
}

Refresh

Same as User Authorization. If refresh token expires, restart device flow from Step 1.


Client Authorization (Chatbot)

For chatbot message operations only.

Request Token

POST https://zoom.us/oauth/token?grant_type=client_credentials

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "access_token": "eyJ...",
  "token_type": "bearer",
  "expires_in": 3600,
  "scope": "imchat:bot",
  "api_url": "https://api.zoom.us"
}

Refresh

Tokens expire after 1 hour. No refresh flow - just request a new token.


Using Access Tokens

Call API

GET https://api.zoom.us/v2/users/me

Headers:
Authorization: Bearer {ACCESS_TOKEN}

Me Context

Replace userID with me to target the token's associated user:

EndpointMethods
/v2/users/meGET, PATCH
/v2/users/me/tokenGET
/v2/users/me/meetingsGET, POST

Revoke Access Token

Works for all authorization types.

POST https://zoom.us/oauth/revoke?token={ACCESS_TOKEN}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Response

{
  "status": "success"
}

PKCE (Proof Key for Code Exchange)

For public clients that can't securely store secrets (mobile apps, SPAs, desktop apps).

When to Use PKCE

Client TypeUse PKCE?Why
Mobile appYesCan't securely store client secret
Single Page App (SPA)YesJavaScript is visible to users
Desktop appYesBinary can be decompiled
Meeting SDK (client-side)YesRuns on user's device
Backend serverOptionalCan keep secrets, but PKCE adds security

How PKCE Works

┌──────────┐                              ┌──────────┐                    ┌──────────┐
│  Client  │                              │   Zoom   │                    │   Zoom   │
│   App    │                              │  Auth    │                    │  Token   │
└────┬─────┘                              └────┬─────┘                    └────┬─────┘
     │                                         │                              │
     │ 1. Generate code_verifier (random)      │                              │
     │ 2. Create code_challenge = SHA256(verifier)                            │
     │                                         │                              │
     │ ─────── /authorize + code_challenge ──► │                              │
     │                                         │                              │
     │ ◄────── authorization_code ──────────── │                              │
     │                                         │                              │
     │ ─────────────── /token + code_verifier ─┼────────────────────────────► │
     │                                         │                              │
     │                                         │     Verify: SHA256(verifier) │
     │                                         │            == challenge      │
     │                                         │                              │
     │ ◄───────────────────────────────────────┼─────── access_token ──────── │
     │                                         │                              │

Implementation (Node.js)

const crypto = require('crypto');

function generatePKCE() {
  const verifier = crypto.randomBytes(32).toString('base64url');
  const challenge = crypto.createHash('sha256').update(verifier).digest('base64url');
  return { verifier, challenge };
}

const pkce = generatePKCE();

const authUrl = `https://zoom.us/oauth/authorize?` +
  `response_type=code&` +
  `client_id=${CLIENT_ID}&` +
  `redirect_uri=${REDIRECT_URI}&` +
  `code_challenge=${pkce.challenge}&` +
  `code_challenge_method=S256`;

// Store pkce.verifier in session for callback

Token Exchange with PKCE

POST https://zoom.us/oauth/token?grant_type=authorization_code&code={CODE}&redirect_uri={REDIRECT_URI}&code_verifier={VERIFIER}

Headers:
Authorization: Basic {Base64(ClientID:ClientSecret)}

Deauthorization

When a user removes your app, Zoom sends a webhook to your Deauthorization Notification Endpoint URL.

Webhook Event

{
  "event": "app_deauthorized",
  "event_ts": 1740439732278,
  "payload": {
    "account_id": "ACCOUNT_ID",
    "user_id": "USER_ID",
    "signature": "SIGNATURE",
    "deauthorization_time": "2019-06-17T13:52:28.632Z",
    "client_id": "CLIENT_ID"
  }
}

Requirements

  • Delete all associated user data after receiving this event
  • Verify webhook signature (use secret token, verification token deprecated Oct 2023)
  • Only public apps receive deauthorization webhooks (not private/dev apps)

Pre-Approval Flow

Some Zoom accounts require Marketplace admin pre-approval before users can authorize apps.

  • Users can request pre-approval from their admin
  • Account-level apps (admin scopes) require appropriate role permissions

Active Apps Notifier (AAN)

In-meeting feature showing apps with real-time access to content.

  • Displays icon + tooltip with app info, content type being accessed, approving account
  • Supported: Zoom client 5.6.7+, Meeting SDK 5.9.0+

OAuth Scopes

Scope Types

TypeDescriptionFor
Classic scopesLegacy scopes (user, admin, master levels)Existing apps
Granular scopesNew fine-grained scopes with optional supportNew apps

Classic Scopes

For previously-created apps. Three levels:

  • User-level: Access to individual user's data
  • Admin-level: Account-wide access, requires admin role
  • Master-level: For master-sub account setups, requires account owner

Full list: https://developers.zoom.us/docs/integrations/oauth-scopes/

Granular Scopes

For new apps. Format: <service>:<action>:<data_claim>:<access>

ComponentValues
servicemeeting, webinar, user, recording, etc.
actionread, write, update, delete
data_claimData category (e.g., participants, settings)
accessempty (user), admin, master

Example: meeting:read:list_meetings:admin

Full list: https://developers.zoom.us/docs/integrations/oauth-scopes-granular/

Optional Scopes

Granular scopes can be marked as optional - users choose whether to grant them.

Basic authorization (uses build flow defaults):

https://zoom.us/oauth/authorize?response_type=code&client_id={CLIENT_ID}&redirect_uri={REDIRECT_URI}

Advanced authorization (custom scopes per request):

https://zoom.us/oauth/authorize?client_id={CLIENT_ID}&response_type=code&redirect_uri={REDIRECT_URI}&scope={required_scopes}&optional_scope={optional_scopes}

Include previously granted scopes:

https://zoom.us/oauth/authorize?...&include_granted_scopes&scope={additional_scopes}

Migrating Classic to Granular

  1. Manage > select app > edit
  2. Scope page > Development tab > click Migrate
  3. Review auto-assigned granular scopes, remove unnecessary, mark optional
  4. Test
  5. Production tab > click Migrate

Notes:

  • No review needed if only migrating or reducing scopes
  • Existing user tokens continue with classic scope values until re-authorization
  • New users get granular scopes after migration

Common Error Codes

CodeMessageSolution
4700Token cannot be emptyCheck Authorization header has valid token
4702/4704Invalid clientVerify Client ID and Client Secret
4705Grant type not supportedUse: account_credentials, authorization_code, urn:ietf:params:oauth:grant-type:device_code, or client_credentials
4706Client ID or secret missingAdd credentials to header or request params
4709Redirect URI mismatchEnsure redirect_uri matches app configuration exactly (including trailing slash)
4711Refresh token invalidToken scopes don't match client scopes
4717App has been disabledContact Zoom support
4733Code is expiredAuthorization codes expire in 5 minutes - restart flow
4734Invalid authorization codeRegenerate authorization code
4735Owner of token does not existUser was removed from account - re-authorize
4741Token has been revokedUse the most recent token from latest authorization

See references/oauth-errors.md for complete error list.


Quick Reference

FlowGrant TypeToken ExpiryRefresh
Account (S2S)account_credentials1 hourRequest new token
Userauthorization_code1 hourUse refresh_token (90 day expiry)
Deviceurn:ietf:params:oauth:grant-type:device_code1 hourUse refresh_token (90 day expiry)
Client (Chatbot)client_credentials1 hourRequest new token

Demo Guidance

If you build an OAuth demo app, document its runtime base URL in that demo project's own README or .env.example, not in this shared skill.

Resources


Integrated Index

*This section was migrated from SKILL.md.*

Quick Start Path

If you're new to Zoom OAuth, follow this order:

  1. Run preflight checks first → RUNBOOK.md
  2. Choose your OAuth flow → concepts/oauth-flows.md

- 4 flows: S2S (backend), User (SaaS), Device (no browser), Chatbot - Decision matrix: Which flow fits your use case?

  1. Understand token lifecycle → concepts/token-lifecycle.md

- CRITICAL: How tokens expire, refresh, and revoke - Common pitfalls: refresh token rotation

  1. Implement your flow → Jump to examples:

- Backend automation → examples/s2s-oauth-redis.md - SaaS app → examples/user-oauth-mysql.md - Mobile/SPA → examples/pkce-implementation.md - Device (TV/kiosk) → examples/device-flow.md

  1. Fix redirect URI issues → troubleshooting/redirect-uri-issues.md

- Most common OAuth error: Redirect URI mismatch

  1. Implement token refresh → examples/token-refresh.md

- Automatic middleware pattern - Handle refresh token rotation

  1. Troubleshoot errors → troubleshooting/common-errors.md

- Error code tables (4700-4741 range) - Quick diagnostic workflow


Documentation Structure

oauth/
├── SKILL.md                           # Main skill overview
├── SKILL.md                           # This file - navigation guide
│
├── concepts/                          # Core OAuth concepts
│   ├── oauth-flows.md                # 4 flows: S2S, User, Device, Chatbot
│   ├── token-lifecycle.md            # Expiration, refresh, revocation
│   ├── pkce.md                       # PKCE security for public clients
│   ├── scopes-architecture.md        # Classic vs Granular scopes
│   └── state-parameter.md            # CSRF protection with state
│
├── examples/                          # Complete working code
│   ├── s2s-oauth-basic.md            # S2S OAuth minimal example
│   ├── s2s-oauth-redis.md            # S2S OAuth with Redis caching (production)
│   ├── user-oauth-basic.md           # User OAuth minimal example
│   ├── user-oauth-mysql.md           # User OAuth with MySQL + encryption (production)
│   ├── device-flow.md                # Device authorization flow
│   ├── pkce-implementation.md        # PKCE for SPAs/mobile apps
│   └── token-refresh.md              # Auto-refresh middleware pattern
│
├── troubleshooting/                   # Problem solving guides
│   ├── common-errors.md              # Error codes 4700-4741
│   ├── redirect-uri-issues.md        # Most common OAuth error
│   ├── token-issues.md               # Expired, revoked, invalid tokens
│   └── scope-issues.md               # Scope mismatch errors
│
└── references/                        # Reference documentation
    ├── oauth-errors.md                # Complete error code reference
    ├── classic-scopes.md              # Classic scope reference
    └── granular-scopes.md             # Granular scope reference

By Use Case

I want to automate Zoom tasks on my own account

  1. OAuth Flows - S2S OAuth explained
  2. S2S OAuth Redis - Production pattern with Redis caching
  3. Token Lifecycle - 1hr token, no refresh

I want to build a SaaS app for other Zoom users

  1. OAuth Flows - User OAuth explained
  2. User OAuth MySQL - Production pattern with encryption
  3. Token Refresh - Automatic refresh middleware
  4. Redirect URI Issues - Fix most common error

I want to build a mobile or SPA app

  1. PKCE - Why PKCE is required for public clients
  2. PKCE Implementation - Complete code example
  3. State Parameter - CSRF protection

I want to build an app for devices without browsers (TV, kiosk)

  1. OAuth Flows - Device flow explained
  2. Device Flow Example - Complete polling implementation
  3. Common Errors - Device-specific errors

I'm building a Team Chat bot

  1. OAuth Flows - Chatbot flow explained
  2. S2S OAuth Basic - Similar pattern, different grant type
  3. Scopes Architecture - Chatbot-specific scopes

I'm getting redirect URI errors (4709)

  1. Redirect URI Issues - START HERE!
  2. Common Errors - Error details
  3. User OAuth Basic - See correct pattern

I'm getting token errors (4700-4741)

  1. Token Issues - Diagnostic workflow
  2. Token Lifecycle - Understand expiration
  3. Token Refresh - Implement auto-refresh
  4. Common Errors - Error code tables

I'm getting scope errors (4711)

  1. Scope Issues - Mismatch causes
  2. Scopes Architecture - Classic vs Granular
  3. Classic Scopes - Complete scope reference
  4. Granular Scopes - Granular scope reference

I need to refresh tokens

  1. Token Lifecycle - When to refresh
  2. Token Refresh - Middleware pattern
  3. Token Issues - Common mistakes

I want to understand the difference between Classic and Granular scopes

  1. Scopes Architecture - Complete comparison
  2. Classic Scopes - resource:level format
  3. Granular Scopes - service:action:data_claim:access format

I need to secure my OAuth implementation

  1. PKCE - Public client security
  2. State Parameter - CSRF protection
  3. User OAuth MySQL - Token encryption at rest

I want to migrate from JWT app to S2S OAuth

  1. S2S OAuth Redis - Modern replacement
  2. Token Lifecycle - Different token behavior
Note: JWT App Type was deprecated in June 2023. Migrate to S2S OAuth for server-to-server automation.

Most Critical Documents

1. OAuth Flows (DECISION DOCUMENT)

concepts/oauth-flows.md

Understand which of the 4 flows to use:

  • S2S OAuth: Backend automation (your account)
  • User OAuth: SaaS apps (users authorize you)
  • Device Flow: Devices without browsers
  • Chatbot: Team Chat bots only

2. Token Lifecycle (MOST COMMON ISSUE)

concepts/token-lifecycle.md

99% of OAuth issues stem from misunderstanding:

  • Token expiration (1 hour for all flows)
  • Refresh token rotation (must save new refresh token)
  • Revocation behavior (invalidates all tokens)

3. Redirect URI Issues (MOST COMMON ERROR)

troubleshooting/redirect-uri-issues.md

Error 4709 ("Redirect URI mismatch") is the #1 OAuth error. Must match EXACTLY (including trailing slash, http vs https).


Key Learnings

Critical Discoveries:

  1. Refresh Token Rotation

- Each refresh returns a NEW refresh token - Old refresh token becomes invalid - Failure to save new token causes 4735 errors - See: Token Refresh

  1. S2S OAuth Uses Redis, User OAuth Uses Database

- S2S: Single token for entire account → Redis (ephemeral) - User: Per-user tokens → Database (persistent) - See: S2S OAuth Redis vs User OAuth MySQL

  1. Redirect URI Must Match EXACTLY

- Trailing slash matters: /callback ≠ /callback/ - Protocol matters: http:// ≠ https:// - Port matters: :3000 ≠ :3001 - See: Redirect URI Issues

  1. PKCE Required for Public Clients

- Mobile apps CANNOT keep secrets - SPAs CANNOT keep secrets - PKCE prevents authorization code interception - See: PKCE

  1. State Parameter Prevents CSRF

- Generate random state before redirect - Store in session - Verify on callback - See: State Parameter

  1. Token Storage Must Be Encrypted

- NEVER store tokens in plain text - Use AES-256 minimum - See: User OAuth MySQL

  1. JWT App Type is Deprecated (June 2023)

- No new JWT apps can be created - Existing apps still work but will eventually be sunset - Migrate to S2S OAuth or User OAuth

  1. Scope Levels Determine Authorization Requirements

- No suffix (user-level): Any user can authorize - :admin: Requires admin role - :master: Requires account owner (multi-account) - See: Scopes Architecture

  1. Authorization Codes Expire in 5 Minutes

- Exchange code for token immediately - Don't cache authorization codes - See: Token Lifecycle

  1. Device Flow Requires Polling

- Poll at interval returned by /devicecode (usually 5s) - Handle authorization_pending, slow_down, expired_token - See: Device Flow


Quick Reference

"Which OAuth flow should I use?"

→ OAuth Flows

"Redirect URI mismatch error (4709)"

→ Redirect URI Issues

"Token expired or invalid"

→ Token Issues

"Refresh token invalid (4735)"

→ Token Refresh - Must save new refresh token

"Scope mismatch error (4711)"

→ Scope Issues

"How do I secure my OAuth app?"

→ PKCE + State Parameter

"How do I implement auto-refresh?"

→ Token Refresh

"What's the difference between Classic and Granular scopes?"

→ Scopes Architecture

"What error code means what?"

→ Common Errors


Document Version

Based on Zoom OAuth API v2 (2024+)

Deprecated: JWT App Type (June 2023)


Happy coding!

Remember: Start with OAuth Flows to understand which flow fits your use case!

Environment Variables

平台分布

Codex

39.89%
按下载量换算909

Claude

27.58%
按下载量换算629

Cursor

20.78%
按下载量换算474

Gemini CLI

8.91%
按下载量换算203

安全审计

Gen Agent Trust Hub

通过

Socket

通过

Snyk

通过

权限和风险

接触敏感数据

该 Skill 可能接触密钥、Token、环境变量或敏感配置,应进入高风险复核队列,默认不自动发布。

安装前确认

本站仅展示第三方公开信息,不托管安装包,不提供自动安装或运行环境。安装前应自行审查源码、依赖和命令行为。目前只有一个公开来源,建议同时核对源仓库。

继续浏览同类 Skills