Name | tokenmint JSON |
Version |
0.1.1
JSON |
| download |
home_page | None |
Summary | A modern Python library for issuing and verifying limited-time, scoped, and replay-protected tokens. |
upload_time | 2025-09-13 06:21:27 |
maintainer | None |
docs_url | None |
author | None |
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
[](https://pypi.org/project/tokenmint/)
[](https://pypi.org/project/tokenmint/)
[](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[](https://pypi.org/project/tokenmint/)\n[](https://pypi.org/project/tokenmint/)\n[](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"
}