tokenmint


Nametokenmint JSON
Version 0.1.1 PyPI version JSON
download
home_pageNone
SummaryA modern Python library for issuing and verifying limited-time, scoped, and replay-protected tokens.
upload_time2025-09-13 06:21:27
maintainerNone
docs_urlNone
authorNone
requires_python>=3.13
license# MIT License Copyright (c) 2025 Shailesh Pandit Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
keywords ed25519 eddsa redis api-security auth authentication authorization cryptography email-verification ephemeral-tokens jwt key-rotation magic-link password-reset replay-protection scoped-tokens secure-tokens session time-limited-tokens token-auth tokens
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # πŸͺ™ Tokenmint

[![PyPI version](https://img.shields.io/pypi/v/tokenmint.svg)](https://pypi.org/project/tokenmint/)
[![Python versions](https://img.shields.io/pypi/pyversions/tokenmint.svg)](https://pypi.org/project/tokenmint/)
[![License](https://img.shields.io/pypi/l/tokenmint.svg)](https://github.com/shaileshpandit141/tokenmint/blob/main/LICENSE)

**Tokenmint** is a modern Python library for issuing and verifying **limited-time, scoped, and replay-protected tokens**.
Built for 2025 and beyond, it provides a **production-grade token system** with features like **key rotation, purpose scoping, Redis-backed replay prevention, and secure Ed25519 signatures**.

## ✨ Features

* πŸ”‘ **Key rotation** with `kid` headers for zero-downtime upgrades
* ⏳ **Limited-time tokens** (short-lived, scoped, expiring)
* πŸ›‘ **Replay protection** using Redis-backed JTI tracking
* 🎯 **Strict purpose scoping** (e.g., `email-verify`, `password-reset`)
* πŸ–‹ **EdDSA (Ed25519)** signatures for modern cryptographic security
* πŸ— Production-ready: structured errors, leeway for clock skew, revocation support
* ⚑ Works with Django, FastAPI, Flask, or standalone services

## πŸ“¦ Installation

You can install **Tokenmint** via **pip** or **uv**:

* **Using uv**

```bash
uv add tokenmint
```

* **Using pip**

```bash
pip install tokenmint
```

## πŸš€ Quick Start

```python
from datetime import timedelta
from tokenmint.settings import Settings
from tokenmint.services import TokenMint

# Define token settings
settings = Settings(
    issuer="myapp.io",
    audience="myapp.web",
    purpose="email-verify",
    expiry_duration=timedelta(minutes=15),
)

# Create token mint (auto-loads keys from environment, uses Redis for replay prevention)
mint = TokenMint(settings)

# Generate a token
token = mint.generate_token(
    subject="20",
    extra_claims={"email": "alice@example.com"},
)

print("Issued token:", token)

# Validate a token
claims = mint.validate_token(token)
print("Decoded claims:", claims)
```

## πŸ” Key Management

tokenmint uses **Ed25519 key pairs** with support for **key rotation**.
Keys are loaded from environment variables:

```bash
export TOKEN_ACTIVE_KEY_ID="2025-08-rot-1"
export TOKEN_PRIVATE_KEY_2025-08-rot-1="$(cat ed25519-private.pem)"
```

* Rotate by adding a new private key (`TOKEN_PRIVATE_KEY_<new_id>`)
* Update `TOKEN_ACTIVE_KEY_ID` to the new key id
* Old tokens remain valid until expiry since their public keys are still available

## πŸ“– Detailed Use Cases

tokenmint is designed to fit common security-sensitive flows. Below are example implementations.

### 1. πŸ”‘ **Email Verification**

Send a time-limited verification link when a user signs up:

```python
from datetime import timedelta
from tokenmint.settings import Settings
from tokenmint.services import TokenMint

settings = Settings(
    issuer="myapp.io",
    audience="myapp.web",
    purpose="email-verify",
    expiry_duration=timedelta(minutes=10),
)

mint = TokenMint(settings)

# Issue a token for user
token = mint.generate_token(
    subject="20",
    extra_claims={"email": "alice@example.com"},
)

# Send via email link
verification_url = f"https://myapp.io/verify-email?token={token}"
print("Verification URL:", verification_url)

# Later, when user clicks the link
claims = mint.validate_token(token)
print("Verified email:", claims["email"])
```

βœ” Prevents token replay
βœ” Short lifetime
βœ” Scoped to `"email-verify"`

### 2. πŸ”’ **Password Reset**

```python
settings = Settings(
    issuer="myapp.io",
    audience="myapp.web",
    purpose="password-reset",
    expiry_duration=timedelta(minutes=5),
)

mint = TokenMint(settings)

# Issue reset token
reset_token = mint.generate_token(subject="20")

# User submits new password with token
claims = mint.validate_token(reset_token)

# Force revoke once used
mint.revoke_token(reset_token)
```

βœ” Ensures token can’t be reused
βœ” Scoped only for password reset flow

### 3. πŸ“© **Magic Login Links**

No passwords β€” just a one-time-use link:

```python
settings = Settings(
    issuer="myapp.io",
    audience="myapp.web",
    purpose="magic-login",
    expiry_duration=timedelta(minutes=2),
)

mint = TokenMint(settings)

login_token = mint.generate_token(subject="20")

# When clicked
claims = mint.validate_token(login_token)
print("User logged in:", claims["sub"])
```

βœ” Very short-lived
βœ” One-time login enforcement via replay cache

### 4. βš™οΈ **Scoped API Access**

Issue short-lived tokens for microservice-to-microservice communication:

```python
settings = Settings(
    issuer="auth.myapp.io",
    audience="payments.myapp.io",
    purpose="service-access",
    expiry_duration=timedelta(minutes=1),
)

mint = TokenMint(settings)

api_token = mint.generate_token(subject="user@gmail.com")

# Receiving service validates
claims = mint.validate_token(api_token)
print("Authorized service:", claims["sub"])
```

βœ” Audience restriction
βœ” Purpose scoping ensures the token is useless elsewhere

### 5. 🎟 **One-Time Session Tokens**

Great for **single-use sensitive operations** (like transferring funds):

```python
settings = Settings(
    issuer="myapp.io",
    audience="myapp.api",
    purpose="txn-approval",
    expiry_duration=timedelta(minutes=3),
    prevent_replay=True,
)

mint = TokenMint(settings)

txn_token = mint.generate_token(
    subject="20",
    extra_claims={"amount": "100.00", "currency": "USD"},
)

# Validate (once only)
claims = mint.validate_token(txn_token)

# Reuse attempt β†’ raises InvalidTokenError
mint.validate_token(txn_token)
```

### 6. πŸ— One-Time Payment Approval Token

**Scenario:**
Your app allows users to approve payments securely. Each token must:

* Be valid only for a single payment request
* Expire quickly (e.g., 3 minutes)
* Include extra claims like `amount` and `currency`
* Prevent token replay using Redis
* Support production-grade key rotation

#### Environment Setup

```bash
export TOKEN_ACTIVE_KEY_ID="2025-08-rot-1"
export TOKEN_PRIVATE_KEY_2025-08-rot-1="$(cat prod-ed25519-rot1.pem)"
export TOKEN_PRIVATE_KEY_2025-05-rot-0="$(cat prod-ed25519-rot0.pem)"
export REDIS_URL="redis://prod-redis-server:6379/3"
```

#### Define Token Settings

```python
from datetime import timedelta
from tokenmint.settings import Settings

settings = Settings(
    issuer="payments.myapp.io",
    audience="payments.api",
    purpose="payment-approval",     # scoped to payment approval
    expiry_duration=timedelta(minutes=3),
    clock_skew_leeway=5,            # allow 5 seconds for clock differences
    prevent_replay=True,            # single-use enforcement
)
```

#### Configure Redis Replay Cache

```python
from tokenmint.cache import ReplayCache
import os

redis_url = os.getenv("REDIS_URL")
replay_cache = ReplayCache(redis_url=redis_url, key_prefix="prod:payment:jti:")
```

βœ… This isolates payment tokens in Redis to prevent collisions with other token types.

#### Initialize TokenMint

```python
from tokenmint.services import TokenMint

mint = TokenMint(
    settings=settings,
    replay_cache=replay_cache,
)
```

#### Generate Payment Approval Token

```python
payment_token = mint.generate_token(
    subject="20",
    extra_claims={"amount": "250.00", "currency": "USD", "payment_id": "txn_1001"}
)

print("Send this token to the frontend for approval:", payment_token)
```

βœ… Includes `amount`, `currency`, and `payment_id` claims, ensuring the token is **specific to one payment**.

#### Validate Token During Approval

```python
from tokenmint.exceptions import InvalidTokenError

try:
    claims = mint.validate_token(payment_token)
    print("Payment approved for:", claims["sub"])
    print("Amount:", claims["amount"], claims["currency"])
except InvalidTokenError as e:
    print("Invalid or reused token:", str(e))
```

βœ… Checks signature, issuer, audience, expiry, and **prevents reuse**.

#### Revoke Token Explicitly (Optional)

```python
mint.revoke_token(payment_token)
```

βœ… Ensures a token can never be reused even before natural expiry.

### Production Notes

* Use **dedicated Redis DBs or key prefixes** for different token types (`prod:payment:jti:`).
* **Rotate keys** safely with old keys kept in `KeyStore` for verification of existing tokens.
* **ReplayCache TTL** matches token expiry, no manual cleanup needed.
* Purpose scoping (`payment-approval`) prevents tokens from being misused for other actions.

## πŸ”‘ Build Any Tokenized Flow with Replay Protection

tokenmint enforces **true single-use tokens** with Redis-backed replay prevention.  
With these building blocks, you can implement **any tokenized flow** - from user onboarding to secure inter-service communication.

## 🀝 Contributing

Contributions are welcome! Please open an issue or PR for any improvements.

## πŸ“œ License

MIT License β€” See [LICENSE](LICENSE).

## πŸ‘€ Author

**Shailesh Pandit**  

* 🌐 Website: [https://github.com/shaileshpandit141](https://github.com/shaileshpandit141)  
* πŸ™ GitHub: [https://github.com/shaileshpandit141](https://github.com/shaileshpandit141)  
* πŸ’Ό LinkedIn: [https://www.linkedin.com/in/shaileshpandit141](https://www.linkedin.com/in/shaileshpandit141)  
* βœ‰οΈ Email: [shaileshpandit141@gmail.com](mailto:shaileshpandit141@gmail.com)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "tokenmint",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.13",
    "maintainer_email": null,
    "keywords": "Ed25519, EdDSA, Redis, api-security, auth, authentication, authorization, cryptography, email-verification, ephemeral-tokens, jwt, key-rotation, magic-link, password-reset, replay-protection, scoped-tokens, secure-tokens, session, time-limited-tokens, token-auth, tokens",
    "author": null,
    "author_email": "shaileshpandit141 <shaileshpandit141@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/76/82/041a95fae582633d9c6477e40d3f0a7556487351589e54e9514e874a9963/tokenmint-0.1.1.tar.gz",
    "platform": null,
    "description": "# \ud83e\ude99 Tokenmint\n\n[![PyPI version](https://img.shields.io/pypi/v/tokenmint.svg)](https://pypi.org/project/tokenmint/)\n[![Python versions](https://img.shields.io/pypi/pyversions/tokenmint.svg)](https://pypi.org/project/tokenmint/)\n[![License](https://img.shields.io/pypi/l/tokenmint.svg)](https://github.com/shaileshpandit141/tokenmint/blob/main/LICENSE)\n\n**Tokenmint** is a modern Python library for issuing and verifying **limited-time, scoped, and replay-protected tokens**.\nBuilt for 2025 and beyond, it provides a **production-grade token system** with features like **key rotation, purpose scoping, Redis-backed replay prevention, and secure Ed25519 signatures**.\n\n## \u2728 Features\n\n* \ud83d\udd11 **Key rotation** with `kid` headers for zero-downtime upgrades\n* \u23f3 **Limited-time tokens** (short-lived, scoped, expiring)\n* \ud83d\udee1 **Replay protection** using Redis-backed JTI tracking\n* \ud83c\udfaf **Strict purpose scoping** (e.g., `email-verify`, `password-reset`)\n* \ud83d\udd8b **EdDSA (Ed25519)** signatures for modern cryptographic security\n* \ud83c\udfd7 Production-ready: structured errors, leeway for clock skew, revocation support\n* \u26a1 Works with Django, FastAPI, Flask, or standalone services\n\n## \ud83d\udce6 Installation\n\nYou can install **Tokenmint** via **pip** or **uv**:\n\n* **Using uv**\n\n```bash\nuv add tokenmint\n```\n\n* **Using pip**\n\n```bash\npip install tokenmint\n```\n\n## \ud83d\ude80 Quick Start\n\n```python\nfrom datetime import timedelta\nfrom tokenmint.settings import Settings\nfrom tokenmint.services import TokenMint\n\n# Define token settings\nsettings = Settings(\n    issuer=\"myapp.io\",\n    audience=\"myapp.web\",\n    purpose=\"email-verify\",\n    expiry_duration=timedelta(minutes=15),\n)\n\n# Create token mint (auto-loads keys from environment, uses Redis for replay prevention)\nmint = TokenMint(settings)\n\n# Generate a token\ntoken = mint.generate_token(\n    subject=\"20\",\n    extra_claims={\"email\": \"alice@example.com\"},\n)\n\nprint(\"Issued token:\", token)\n\n# Validate a token\nclaims = mint.validate_token(token)\nprint(\"Decoded claims:\", claims)\n```\n\n## \ud83d\udd10 Key Management\n\ntokenmint uses **Ed25519 key pairs** with support for **key rotation**.\nKeys are loaded from environment variables:\n\n```bash\nexport TOKEN_ACTIVE_KEY_ID=\"2025-08-rot-1\"\nexport TOKEN_PRIVATE_KEY_2025-08-rot-1=\"$(cat ed25519-private.pem)\"\n```\n\n* Rotate by adding a new private key (`TOKEN_PRIVATE_KEY_<new_id>`)\n* Update `TOKEN_ACTIVE_KEY_ID` to the new key id\n* Old tokens remain valid until expiry since their public keys are still available\n\n## \ud83d\udcd6 Detailed Use Cases\n\ntokenmint is designed to fit common security-sensitive flows. Below are example implementations.\n\n### 1. \ud83d\udd11 **Email Verification**\n\nSend a time-limited verification link when a user signs up:\n\n```python\nfrom datetime import timedelta\nfrom tokenmint.settings import Settings\nfrom tokenmint.services import TokenMint\n\nsettings = Settings(\n    issuer=\"myapp.io\",\n    audience=\"myapp.web\",\n    purpose=\"email-verify\",\n    expiry_duration=timedelta(minutes=10),\n)\n\nmint = TokenMint(settings)\n\n# Issue a token for user\ntoken = mint.generate_token(\n    subject=\"20\",\n    extra_claims={\"email\": \"alice@example.com\"},\n)\n\n# Send via email link\nverification_url = f\"https://myapp.io/verify-email?token={token}\"\nprint(\"Verification URL:\", verification_url)\n\n# Later, when user clicks the link\nclaims = mint.validate_token(token)\nprint(\"Verified email:\", claims[\"email\"])\n```\n\n\u2714 Prevents token replay\n\u2714 Short lifetime\n\u2714 Scoped to `\"email-verify\"`\n\n### 2. \ud83d\udd12 **Password Reset**\n\n```python\nsettings = Settings(\n    issuer=\"myapp.io\",\n    audience=\"myapp.web\",\n    purpose=\"password-reset\",\n    expiry_duration=timedelta(minutes=5),\n)\n\nmint = TokenMint(settings)\n\n# Issue reset token\nreset_token = mint.generate_token(subject=\"20\")\n\n# User submits new password with token\nclaims = mint.validate_token(reset_token)\n\n# Force revoke once used\nmint.revoke_token(reset_token)\n```\n\n\u2714 Ensures token can\u2019t be reused\n\u2714 Scoped only for password reset flow\n\n### 3. \ud83d\udce9 **Magic Login Links**\n\nNo passwords \u2014 just a one-time-use link:\n\n```python\nsettings = Settings(\n    issuer=\"myapp.io\",\n    audience=\"myapp.web\",\n    purpose=\"magic-login\",\n    expiry_duration=timedelta(minutes=2),\n)\n\nmint = TokenMint(settings)\n\nlogin_token = mint.generate_token(subject=\"20\")\n\n# When clicked\nclaims = mint.validate_token(login_token)\nprint(\"User logged in:\", claims[\"sub\"])\n```\n\n\u2714 Very short-lived\n\u2714 One-time login enforcement via replay cache\n\n### 4. \u2699\ufe0f **Scoped API Access**\n\nIssue short-lived tokens for microservice-to-microservice communication:\n\n```python\nsettings = Settings(\n    issuer=\"auth.myapp.io\",\n    audience=\"payments.myapp.io\",\n    purpose=\"service-access\",\n    expiry_duration=timedelta(minutes=1),\n)\n\nmint = TokenMint(settings)\n\napi_token = mint.generate_token(subject=\"user@gmail.com\")\n\n# Receiving service validates\nclaims = mint.validate_token(api_token)\nprint(\"Authorized service:\", claims[\"sub\"])\n```\n\n\u2714 Audience restriction\n\u2714 Purpose scoping ensures the token is useless elsewhere\n\n### 5. \ud83c\udf9f **One-Time Session Tokens**\n\nGreat for **single-use sensitive operations** (like transferring funds):\n\n```python\nsettings = Settings(\n    issuer=\"myapp.io\",\n    audience=\"myapp.api\",\n    purpose=\"txn-approval\",\n    expiry_duration=timedelta(minutes=3),\n    prevent_replay=True,\n)\n\nmint = TokenMint(settings)\n\ntxn_token = mint.generate_token(\n    subject=\"20\",\n    extra_claims={\"amount\": \"100.00\", \"currency\": \"USD\"},\n)\n\n# Validate (once only)\nclaims = mint.validate_token(txn_token)\n\n# Reuse attempt \u2192 raises InvalidTokenError\nmint.validate_token(txn_token)\n```\n\n### 6. \ud83c\udfd7 One-Time Payment Approval Token\n\n**Scenario:**\nYour app allows users to approve payments securely. Each token must:\n\n* Be valid only for a single payment request\n* Expire quickly (e.g., 3 minutes)\n* Include extra claims like `amount` and `currency`\n* Prevent token replay using Redis\n* Support production-grade key rotation\n\n#### Environment Setup\n\n```bash\nexport TOKEN_ACTIVE_KEY_ID=\"2025-08-rot-1\"\nexport TOKEN_PRIVATE_KEY_2025-08-rot-1=\"$(cat prod-ed25519-rot1.pem)\"\nexport TOKEN_PRIVATE_KEY_2025-05-rot-0=\"$(cat prod-ed25519-rot0.pem)\"\nexport REDIS_URL=\"redis://prod-redis-server:6379/3\"\n```\n\n#### Define Token Settings\n\n```python\nfrom datetime import timedelta\nfrom tokenmint.settings import Settings\n\nsettings = Settings(\n    issuer=\"payments.myapp.io\",\n    audience=\"payments.api\",\n    purpose=\"payment-approval\",     # scoped to payment approval\n    expiry_duration=timedelta(minutes=3),\n    clock_skew_leeway=5,            # allow 5 seconds for clock differences\n    prevent_replay=True,            # single-use enforcement\n)\n```\n\n#### Configure Redis Replay Cache\n\n```python\nfrom tokenmint.cache import ReplayCache\nimport os\n\nredis_url = os.getenv(\"REDIS_URL\")\nreplay_cache = ReplayCache(redis_url=redis_url, key_prefix=\"prod:payment:jti:\")\n```\n\n\u2705 This isolates payment tokens in Redis to prevent collisions with other token types.\n\n#### Initialize TokenMint\n\n```python\nfrom tokenmint.services import TokenMint\n\nmint = TokenMint(\n    settings=settings,\n    replay_cache=replay_cache,\n)\n```\n\n#### Generate Payment Approval Token\n\n```python\npayment_token = mint.generate_token(\n    subject=\"20\",\n    extra_claims={\"amount\": \"250.00\", \"currency\": \"USD\", \"payment_id\": \"txn_1001\"}\n)\n\nprint(\"Send this token to the frontend for approval:\", payment_token)\n```\n\n\u2705 Includes `amount`, `currency`, and `payment_id` claims, ensuring the token is **specific to one payment**.\n\n#### Validate Token During Approval\n\n```python\nfrom tokenmint.exceptions import InvalidTokenError\n\ntry:\n    claims = mint.validate_token(payment_token)\n    print(\"Payment approved for:\", claims[\"sub\"])\n    print(\"Amount:\", claims[\"amount\"], claims[\"currency\"])\nexcept InvalidTokenError as e:\n    print(\"Invalid or reused token:\", str(e))\n```\n\n\u2705 Checks signature, issuer, audience, expiry, and **prevents reuse**.\n\n#### Revoke Token Explicitly (Optional)\n\n```python\nmint.revoke_token(payment_token)\n```\n\n\u2705 Ensures a token can never be reused even before natural expiry.\n\n### Production Notes\n\n* Use **dedicated Redis DBs or key prefixes** for different token types (`prod:payment:jti:`).\n* **Rotate keys** safely with old keys kept in `KeyStore` for verification of existing tokens.\n* **ReplayCache TTL** matches token expiry, no manual cleanup needed.\n* Purpose scoping (`payment-approval`) prevents tokens from being misused for other actions.\n\n## \ud83d\udd11 Build Any Tokenized Flow with Replay Protection\n\ntokenmint enforces **true single-use tokens** with Redis-backed replay prevention.  \nWith these building blocks, you can implement **any tokenized flow** - from user onboarding to secure inter-service communication.\n\n## \ud83e\udd1d Contributing\n\nContributions are welcome! Please open an issue or PR for any improvements.\n\n## \ud83d\udcdc License\n\nMIT License \u2014 See [LICENSE](LICENSE).\n\n## \ud83d\udc64 Author\n\n**Shailesh Pandit**  \n\n* \ud83c\udf10 Website: [https://github.com/shaileshpandit141](https://github.com/shaileshpandit141)  \n* \ud83d\udc19 GitHub: [https://github.com/shaileshpandit141](https://github.com/shaileshpandit141)  \n* \ud83d\udcbc LinkedIn: [https://www.linkedin.com/in/shaileshpandit141](https://www.linkedin.com/in/shaileshpandit141)  \n* \u2709\ufe0f Email: [shaileshpandit141@gmail.com](mailto:shaileshpandit141@gmail.com)\n",
    "bugtrack_url": null,
    "license": "# MIT License  Copyright (c) 2025 Shailesh Pandit  Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:  The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.",
    "summary": "A modern Python library for issuing and verifying limited-time, scoped, and replay-protected tokens.",
    "version": "0.1.1",
    "project_urls": {
        "Documentation": "https://shaileshpandit141.github.io/tokenmint",
        "Homepage": "https://github.com/shaileshpandit141/tokenmint",
        "Issues": "https://github.com/shaileshpandit141/tokenmint/issues",
        "License": "https://github.com/shaileshpandit141/tokenmint/blob/main/LICENSE",
        "Source": "https://github.com/shaileshpandit141/tokenmint"
    },
    "split_keywords": [
        "ed25519",
        " eddsa",
        " redis",
        " api-security",
        " auth",
        " authentication",
        " authorization",
        " cryptography",
        " email-verification",
        " ephemeral-tokens",
        " jwt",
        " key-rotation",
        " magic-link",
        " password-reset",
        " replay-protection",
        " scoped-tokens",
        " secure-tokens",
        " session",
        " time-limited-tokens",
        " token-auth",
        " tokens"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "8833f143b4ea29d61d21264189d5308bdcc3316a37021f34da87983ce8b98585",
                "md5": "4d67e8ba878175bfb373bcff6a03d931",
                "sha256": "211ac89f678283235e5b147d3719ddaac6fe6666358fb08484ca240fae149939"
            },
            "downloads": -1,
            "filename": "tokenmint-0.1.1-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "4d67e8ba878175bfb373bcff6a03d931",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.13",
            "size": 13852,
            "upload_time": "2025-09-13T06:21:23",
            "upload_time_iso_8601": "2025-09-13T06:21:23.834181Z",
            "url": "https://files.pythonhosted.org/packages/88/33/f143b4ea29d61d21264189d5308bdcc3316a37021f34da87983ce8b98585/tokenmint-0.1.1-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "7682041a95fae582633d9c6477e40d3f0a7556487351589e54e9514e874a9963",
                "md5": "29aad58b827f8948c8dafc0dc53dc2b8",
                "sha256": "212baab693c2ac95351a2af6c8578a256ddde012f5b22b840a700b1ad063b626"
            },
            "downloads": -1,
            "filename": "tokenmint-0.1.1.tar.gz",
            "has_sig": false,
            "md5_digest": "29aad58b827f8948c8dafc0dc53dc2b8",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.13",
            "size": 21803,
            "upload_time": "2025-09-13T06:21:27",
            "upload_time_iso_8601": "2025-09-13T06:21:27.039741Z",
            "url": "https://files.pythonhosted.org/packages/76/82/041a95fae582633d9c6477e40d3f0a7556487351589e54e9514e874a9963/tokenmint-0.1.1.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-09-13 06:21:27",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "shaileshpandit141",
    "github_project": "tokenmint",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": false,
    "lcname": "tokenmint"
}
        
Elapsed time: 1.77986s