Skip to main content

verify-oidc-token

Python tool for verifying OpenID Connect (OIDC) ID Tokens. OAuth 2.0 access tokens are not supported; JWT access tokens explicitly identified by their typ header are rejected.

Installation

Install via PyPI:

pip install verify-oidc-token

Or, install from the source repository:

git clone https://github.com/ei-grad/verify-oidc-token
cd verify-oidc-token

# Optionally, create a virtual environment:
python3 -m venv venv
source venv/bin/activate  # Linux/MacOS
# venv\Scripts\activate  # Windows

pip install .

CLI Usage

Verify an OIDC ID Token directly from the command line. Example:

echo "<ID_TOKEN>" | verify-oidc-token --issuer https://example-issuer.com --client-id <CLIENT_ID>

Or, specify a file with the token:

verify-oidc-token --token-file /path/to/token.txt --issuer https://example-issuer.com --client-id <CLIENT_ID>

CLI Options:

  • --token-file : The file containing the OIDC ID Token (can be omitted if passed via stdin).
  • --issuer : The expected OIDC issuer. Required unless --unsafe is given; an empty value counts as missing.
  • --client-id : The expected OIDC client ID, which is matched against the ID Token aud claim. Required unless --unsafe is given; an empty value counts as missing.
  • --unsafe : Take a missing expected issuer or client audience from the unverified ID Token payload, making those two checks self-referential. Signature verification and the other token validation still run. Debugging only.
  • --with-header: Include the decoded JWT header alongside the verified claims.
  • --verbose: Enable verbose logging for debugging purposes.

Example:

verify-oidc-token --token-file token.txt --issuer https://accounts.google.com --client-id my-client-id

Example Output:

For a valid token:

{
  "sub": "1234567890",
  "name": "John Doe",
  "iat": 1516239022,
  ...
}

For an invalid token:

{
  "error": "Invalid issuer"
}

Output Format:

  • Valid tokens return decoded claims as a JSON object.

  • With --with-header, valid tokens return the decoded header and claims in a JSON object:

    {
      "header": {
        "alg": "RS256",
        "kid": "key-id"
      },
      "claims": {
        "sub": "1234567890"
      }
    }
    
  • If validation fails, an error message is returned as JSON:

    {
      "error": "Description of the validation error"
    }
    

Exit Codes:

  • 0 — the token is valid; decoded claims were printed.
  • 1 — token validation failed (a JSON error object is printed).
  • 2 — invocation error: bad command-line usage (e.g. missing --issuer / --client-id without --unsafe) or an unreadable --token-file; the token was not verified.

Library Usage

Use this tool as a library in Python code:

from verify_oidc_token import verify_token
import jwt

token = "eyJhbGciOiJSUzI1NiIsInR5..."
issuer = "https://accounts.google.com"
client_id = "my-client-id"

try:
    claims = verify_token(token, issuer, client_id)
    print("Token is valid. Claims:", claims)
except jwt.InvalidTokenError as e:
    print({"error": str(e)})

Library API:

  • verify_token(token: str, issuer, client_id) -> dict Verifies an OIDC ID Token, ensuring it matches the expected issuer and OIDC client audience, and returns the claims if valid. Validation requires the iss, sub, aud, exp, and iat claims. OAuth 2.0 access tokens are not supported.

    • Parameters:
      • token (str): The encoded OIDC ID Token to verify.
      • issuer (str or UNSAFE_FROM_TOKEN): Expected OIDC issuer.
      • client_id (str or UNSAFE_FROM_TOKEN): Expected OIDC client ID, matched against the ID Token aud claim.
    • Returns: Dictionary with the decoded claims.
    • Raises: jwt.InvalidTokenError if validation fails, TypeError if issuer or client_id is neither a string nor UNSAFE_FROM_TOKEN.

    Both issuer and client_id are required. Passing the UNSAFE_FROM_TOKEN sentinel (importable from verify_oidc_token) opts into deriving only that expected value from the unverified ID Token payload. Signature verification and the other token validation still run, but the corresponding issuer or audience check becomes self-referential. Use this only for debugging, or when the caller applies its own trust decision to the returned claims.

Development

The project is managed with uv. Run the tests:

uv run -m pytest

Linters and type checking (installed as the dev dependency group):

uv run flake8 src tests
uv run black --check src tests
uv run isort --check-only src tests
uv run mypy src

Use tox to run the tests against all supported Python versions.

License

This project is licensed under the MIT License. See the LICENSE file for details.

Author

Andrew Grigorev (andrew@ei-grad.ru)

Reach out with any questions or contribute to the project via the GitHub repository.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

verify_oidc_token-0.3.1.tar.gz (15.1 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

verify_oidc_token-0.3.1-py3-none-any.whl (9.2 kB view details)

Uploaded Python 3

File details

Details for the file verify_oidc_token-0.3.1.tar.gz.

File metadata

  • Download URL: verify_oidc_token-0.3.1.tar.gz
  • Upload date:
  • Size: 15.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for verify_oidc_token-0.3.1.tar.gz
Algorithm Hash digest
SHA256 5234525d4b648d6f781bea13529c34c8c25abe30edb0b947602874ee6220c8cc
MD5 9ae3a7f64b2b98e0b3bfeadfa5152fd8
BLAKE2b-256 e3d5133352ec5e68c3d02c35692e1085638b8cb4050d1dcdd12dd1423106c8b1

See more details on using hashes here.

Provenance

The following attestation bundles were made for verify_oidc_token-0.3.1.tar.gz:

Publisher: release.yml on ei-grad/verify-oidc-token

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file verify_oidc_token-0.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for verify_oidc_token-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 e30ed0a8efacf9fcff41c2eb691094a7e57b79c5e19bd243798620de2cdd30a8
MD5 eabfa9c14f20d829d0d30ee02ae343b4
BLAKE2b-256 8aa41c634854b46e7b2f007e6a37f055495d52460a9d1ad9b0b8890cedbf7731

See more details on using hashes here.

Provenance

The following attestation bundles were made for verify_oidc_token-0.3.1-py3-none-any.whl:

Publisher: release.yml on ei-grad/verify-oidc-token

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page