Managing API tokens across multiple providers can get messy — especially when it comes to securing them and handling expirations.
That’s why I built Token Vault — a Laravel package designed to securely store, encrypt, and manage all types of API tokens in a consistent and standardised way.
🧰 What Is Token Vault?
Token Vault is a Laravel package that provides a clean, encrypted, polymorphic way to store API tokens like:
- GitHub personal access tokens
- GitLab tokens
- Access keys for any third-party API
Everything is encrypted, scoped to a model (e.g. User
, Project
, etc).
🧩 Features
✅ Encrypted token storage (AES-256 encryption)
✅ Polymorphic support – attach tokens to any model
✅ Built-in expiration support
✅ Safe token masking for UI
✅ Enum support for provider names
🚀 Getting Started
Install the package via Composer:
composer require cleaniquecoders/token-vault
Publish the migration:
php artisan vendor:publish --tag="token-vault-migrations"
php artisan migrate
🔧 Usage
1. Use the Trait in Your Model
use CleaniqueCoders\TokenVault\Traits\InteractsWithTokenVault;
class User extends Authenticatable
{
use InteractsWithTokenVault;
}
2. Store a Token
use CleaniqueCoders\TokenVault\Enums\Provider;
$user->tokens()->create([
'provider' => Provider::GitHub,
'type' => 'access_token',
'token' => 'ghp_xxxx', // encrypted automatically
'meta' => ['label' => 'Deploy token'],
'expires_at' => now()->addDays(30),
]);
3. Retrieve & Use Tokens
$token = $user->tokens()->latest()->first();
$plainText = $token->getDecryptedToken(); // use cautiously
$masked = $token->getMaskedToken(); // safe for display
4. Check Expiry & Validation
$token->isExpired(); // true or false
🔄 Supported Providers
You can define your supported providers using enums via the built-in Provider
enum:
use CleaniqueCoders\TokenVault\Enums\Provider;
Provider::GitHub->label(); // "GitHub"
Provider::GitHub->description() // "GitHub API token"
You can also extend this enum to support additional providers as your app evolves.
🧪 Testing With Pest
This package includes Pest support out of the box with factories and migrations, so testing integration is straightforward.
it('stores encrypted token and decrypts correctly', function () {
$user = User::factory()->create();
$token = $user->tokens()->create([
'provider' => Provider::GitHub,
'type' => 'access_token',
'token' => 'ghp_test123456',
]);
expect($token->getDecryptedToken())->toBe('ghp_test123456');
});
📦 Ready to Use
The package is live and open source at:
👉 github.com/cleaniquecoders/token-vault
We welcome your feedback, pull requests, or ideas to improve!
💡 Why Token Vault?
In Laravel projects, it’s common to store and manage access tokens, but developers often:
- Store them unencrypted 😬
- Hardcode provider types
- Lack expiry logic
- Rebuild similar logic repeatedly
Token Vault solves these with a clean API, secure encryption, and standardised token model for any use case.
✨ What’s Next?
We plan to add:
- 🛠 Storing Webhook and validate it's signature for common providers
- 🔐 UI component for managing tokens
Give it a try, star the repo, and feel free to open issues or feature requests. We’d love your feedback!
👉 cleaniquecoders/token-vault on GitHub
Photo by rc.xyz NFT gallery on Unsplash
Top comments (0)