Home/Tools/Security/OAuth/OIDC Debugger

OAuth/OIDC Debugger

Comprehensive OAuth 2.0 and OpenID Connect debugging tool. Decode JWT tokens, generate PKCE challenges, test authorization flows, validate redirect URIs, and troubleshoot common OAuth errors - all in your browser.

100% Private - Runs Entirely in Your Browser
No data is sent to any server. All processing happens locally on your device.
Loading OAuth/OIDC Debugger...
Loading interactive tool...

Need Help Implementing OAuth/OIDC?

Our security experts can help you implement secure OAuth 2.0 and OpenID Connect authentication in your applications. We provide architecture review, implementation guidance, and security audits for your authentication systems.

Debug OAuth and OIDC Flows

Test OAuth 2.0 authorization flows and decode OIDC tokens. Essential for authentication troubleshooting.

Supported Flows

  • Authorization Code (with PKCE)
  • Client Credentials
  • Implicit (legacy)
  • Device Code

Token Analysis

Decode access tokens and ID tokens. Verify signatures, check claims, validate expiration.

How JWT Decoding Works

JWT Token Structure

A JWT token consists of three parts separated by dots (.):

  1. Header - Contains metadata about the token type and signing algorithm
  2. Payload - Contains claims (statements about the user and additional data)
  3. Signature - Used to verify the token hasn't been tampered with

Decoding Process

Each part is Base64URL encoded. To decode a JWT:

  1. Split the token by the dot (.) separator
  2. Base64URL decode each part
  3. Parse the header and payload as JSON
  4. The signature remains as a Base64URL string

Important Security Note

Decoding a JWT does not verify its signature. Anyone can decode a JWT and read its contents. Always verify the signature server-side before trusting the claims in a token.

PKCE Implementation Guide

Implementing PKCE in Your Application

PKCE (Proof Key for Code Exchange) adds security to the OAuth authorization code flow. Here's how to implement it:

Step 1: Generate Code Verifier

Create a cryptographically random string (43-128 characters):

  • Use a secure random number generator
  • Encode as Base64URL
  • Store securely in your application

Step 2: Create Code Challenge

Compute the SHA-256 hash of the code verifier and encode it as Base64URL:

code_challenge = BASE64URL(SHA256(code_verifier))

Step 3: Authorization Request

Include these parameters in your authorization URL:

  • code_challenge - The computed challenge
  • code_challenge_method - Set to "S256"

Step 4: Token Exchange

When exchanging the authorization code for tokens, include:

  • code_verifier - The original verifier (NOT the challenge)

The authorization server will verify that SHA256(code_verifier) matches the code_challenge from the authorization request.

Common OAuth Error Solutions

Troubleshooting OAuth Errors

invalid_grant

Most Common Causes:

  1. Authorization code expired (typically >10 minutes)
  2. Code was already used (single-use only)
  3. Redirect URI mismatch

Solutions:

  • Ensure code exchange happens quickly
  • Never reuse authorization codes
  • Use exact redirect_uri in both requests

invalid_client

Most Common Causes:

  1. Wrong client_id or client_secret
  2. Client authentication method mismatch

Solutions:

  • Verify credentials match your provider dashboard
  • Check if using correct auth method (basic, post, jwt)

unauthorized_client

Most Common Causes:

  1. Grant type not enabled for client
  2. Redirect URI not registered

Solutions:

  • Enable required grant types in provider settings
  • Register all redirect URIs (exact match required)

access_denied

Most Common Causes:

  1. User clicked "Deny" on consent screen
  2. User lacks required permissions

Solutions:

  • Handle denial gracefully in your app
  • Request only necessary scopes
  • Provide clear explanation of why permissions are needed

OAuth Security Best Practices

Securing Your OAuth Implementation

1. Always Use PKCE

PKCE is no longer just for public clients. Use it for all OAuth flows to prevent authorization code interception attacks.

2. Short-Lived Access Tokens

Keep access tokens short-lived (5-15 minutes). Use refresh tokens for longer sessions.

3. Validate State Parameter

Always generate a unique state parameter for each authorization request and validate it on callback. This prevents CSRF attacks.

4. Exact Redirect URI Matching

Never use wildcards or regex for redirect URIs. OAuth requires exact string matching for security.

5. Verify Token Signatures

Always verify JWT signatures server-side before trusting token contents. Don't skip this step!

6. Check Token Expiration

Validate the exp claim and reject expired tokens. Don't accept tokens without expiration.

7. Secure Token Storage

  • Never store tokens in localStorage (vulnerable to XSS)
  • Use httpOnly cookies for refresh tokens
  • Store access tokens in memory when possible

8. Use HTTPS Everywhere

Never use OAuth over unencrypted HTTP in production. All endpoints must use HTTPS.

9. Implement Token Rotation

Rotate refresh tokens on each use to limit exposure if compromised.

10. Limit Scope Permissions

Request only the minimum scopes your application needs. Follow the principle of least privilege.

References & Citations

  1. Internet Engineering Task Force (IETF). (2012). RFC 6749: The OAuth 2.0 Authorization Framework. Retrieved from https://datatracker.ietf.org/doc/html/rfc6749 (accessed January 2025)
  2. Internet Engineering Task Force (IETF). (2015). RFC 7636: Proof Key for Code Exchange by OAuth Public Clients (PKCE). Retrieved from https://datatracker.ietf.org/doc/html/rfc7636 (accessed January 2025)
  3. Internet Engineering Task Force (IETF). (2015). RFC 7519: JSON Web Token (JWT). Retrieved from https://datatracker.ietf.org/doc/html/rfc7519 (accessed January 2025)
  4. Internet Engineering Task Force (IETF). (2015). RFC 7515: JSON Web Signature (JWS). Retrieved from https://datatracker.ietf.org/doc/html/rfc7515 (accessed January 2025)
  5. OpenID Foundation. (2014). OpenID Connect Core 1.0. Retrieved from https://openid.net/specs/openid-connect-core-1_0.html (accessed January 2025)
  6. Internet Engineering Task Force (IETF). (2020). RFC 8725: JSON Web Token Best Current Practices. Retrieved from https://datatracker.ietf.org/doc/html/rfc8725 (accessed January 2025)
  7. Internet Engineering Task Force (IETF). (2022). OAuth 2.0 Security Best Current Practice. Retrieved from https://datatracker.ietf.org/doc/html/draft-ietf-oauth-security-topics (accessed January 2025)
  8. OWASP Foundation. OWASP Authentication Cheat Sheet. Retrieved from https://cheatsheetseries.owasp.org/cheatsheets/Authentication_Cheat_Sheet.html (accessed January 2025)

Note: These citations are provided for informational and educational purposes. Always verify information with the original sources and consult with qualified professionals for specific advice related to your situation.

Frequently Asked Questions

Common questions about the OAuth/OIDC Debugger

Paste your JWT token into the "JWT Decoder" tab. The tool will automatically decode the header, payload, and signature. You'll see all claims with syntax highlighting, validation status, and expiration warnings. Optionally provide a secret to verify the signature. All decoding happens in your browser - tokens are never sent to any server.

PKCE (Proof Key for Code Exchange) is a security extension to OAuth 2.0 that prevents authorization code interception attacks. It's required for mobile and single-page applications (SPAs) and recommended for all OAuth clients. Use the "PKCE Generator" tab to create a code verifier and code challenge. Send the challenge during authorization and the verifier during token exchange.

Go to the "Flow Tester" tab, select your OAuth flow type (Authorization Code, PKCE, etc.), fill in the required parameters (client_id, redirect_uri, scope), and click "Generate Authorization URL". Copy the URL and open it in a new tab to start the OAuth flow. The tool will help you understand each step and provide examples for token exchange.

OAuth requires exact string matching for redirect URIs. Common issues include: trailing slash differences (/callback vs /callback/), protocol mismatches (http vs https), port numbers (localhost:3000 vs localhost:8080), and query parameters. Use the "Redirect Validator" tab to compare your URIs character-by-character and see exactly what's different.

'invalid_grant' is the most common OAuth error with multiple possible causes. The top three are: (1) authorization code expired (usually >10 minutes old), (2) code was already used (codes are single-use), and (3) redirect_uri mismatch between authorization and token requests. Use the "Error Debugger" tab for detailed troubleshooting steps ranked by likelihood.

Yes - all token processing happens entirely in your browser using JavaScript. No tokens, secrets, or sensitive data are sent to any server or stored permanently. The tool uses browser sessionStorage (cleared when you close the tab) and never logs data to analytics. However, always be cautious with production secrets and use development/test tokens when possible.

JWT signature verification requires access to the secret key (for HMAC algorithms like HS256) or the public key (for asymmetric algorithms like RS256/ES256). Since this is a client-side tool and we never store, transmit, or have access to your signing keys, we cannot verify signatures. This tool is designed for inspecting and understanding JWT structure, debugging claims, and analyzing algorithms - not for production authentication. Always verify JWT signatures server-side using proper cryptographic libraries before trusting the token contents.

For server-side web apps: Authorization Code Flow (with client secret). For mobile apps and SPAs: Authorization Code Flow with PKCE. For backend service-to-service: Client Credentials Flow. Avoid legacy flows: Implicit Flow and Resource Owner Password Flow are deprecated due to security concerns. See the "Flow Tester" tab for detailed descriptions.

Go to the "PKCE Generator" tab and click "Generate New PKCE Pair". The tool creates a cryptographically random code verifier (256 bits of entropy) and computes the code challenge using SHA-256 (S256 method, recommended) or plain method. Copy the challenge for your authorization request and keep the verifier for token exchange.

Major JWT vulnerabilities include: (1) Algorithm confusion attacks - changing "alg" to "none" or switching from RS256 to HS256 to forge tokens. (2) Weak signing secrets - short or common secrets that can be brute-forced. (3) Missing signature verification - accepting tokens without validating signatures. (4) Missing expiration claims - tokens that never expire, allowing indefinite access if stolen. (5) Token storage issues - storing JWTs in localStorage where XSS attacks can steal them. (6) Accepting untrusted algorithms - not enforcing algorithm allowlists. Always use strong algorithms (RS256, ES256), verify signatures, include expiration claims, and store tokens securely.

Use JWTs when: You need stateless authentication across distributed systems, APIs, or microservices; implementing single sign-on (SSO); mobile apps need offline access; scaling horizontally without shared session storage. Use session tokens when: You need instant token revocation (logout); managing long-lived sessions; security is paramount (JWTs can't be invalidated once issued until expiration); working with traditional server-rendered apps. JWTs are self-contained and stateless (don't require server-side session storage), while session tokens require a session store but offer better revocation control.

HS256 (HMAC-SHA256) is a symmetric algorithm where the same secret key is used for both signing and verifying tokens. This means anyone who can verify tokens can also create them, making key distribution risky. RS256 (RSA-SHA256) is an asymmetric algorithm where a private key signs tokens and a separate public key verifies them. Only the authorization server with the private key can create tokens, but any service can verify tokens using the widely-distributed public key. RS256 is recommended for distributed systems, while HS256 may be acceptable for simple, single-server applications where the secret never leaves the server.

JWT access tokens should have short lifespans (5-15 minutes) to limit exposure if stolen. When the access token expires, applications use a separate refresh token (stored securely, often in httpOnly cookies) to obtain a new access token without requiring the user to log in again. Refresh tokens have longer lifespans (days to weeks) and are used only with the authorization server, never sent to resource APIs. This two-token pattern balances security (short-lived access) with user experience (no constant re-authentication). The refresh token can be revoked server-side for instant logout, while access tokens remain stateless.

⚠️ Security Notice

This tool is provided for educational and authorized security testing purposes only. Always ensure you have proper authorization before testing any systems or networks you do not own. Unauthorized access or security testing may be illegal in your jurisdiction. All processing happens client-side in your browser - no data is sent to our servers.