PHPackages                             wramirez83/sjwt - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Authentication &amp; Authorization](/categories/authentication)
4. /
5. wramirez83/sjwt

ActiveLibrary[Authentication &amp; Authorization](/categories/authentication)

wramirez83/sjwt
===============

Simple and efficient JWT (JSON Web Token) generation and validation library for Laravel 12

v3.0.1(5mo ago)0250MITPHPPHP ^8.2CI passing

Since Jul 20Pushed 5mo ago1 watchersCompare

[ Source](https://github.com/wramirez83/SJWT)[ Packagist](https://packagist.org/packages/wramirez83/sjwt)[ RSS](/packages/wramirez83-sjwt/feed)WikiDiscussions main Synced 1mo ago

READMEChangelogDependencies (5)Versions (9)Used By (0)

SJWT - Simple JWT Library for Laravel
=====================================

[](#sjwt---simple-jwt-library-for-laravel)

[![PHP Version](https://camo.githubusercontent.com/c5e8da782b1a0673c08b4f474108036d2cc973470eed2d5d89d48e8c8475eee6/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f7068702d253345253344382e322d626c75652e737667)](https://www.php.net/)[![Laravel](https://camo.githubusercontent.com/ccb0953d3a08f2c992ee5bae1cbb03ebd101923f2401346e1b8a551b5197a41f/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c61726176656c2d31312e7825323025374325323031322e782d7265642e737667)](https://laravel.com/)[![License](https://camo.githubusercontent.com/8bb50fd2278f18fc326bf71f6e88ca8f884f72f179d3e555e20ed30157190d0d/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f6c6963656e73652d4d49542d677265656e2e737667)](LICENSE)

Una librería simple, eficiente y fácil de usar para generar y validar tokens JWT (JSON Web Tokens) en aplicaciones Laravel 11 y 12.

Características
---------------

[](#características)

- ✅ **Compatible con Laravel 11 y 12**
- ✅ **Alto rendimiento** con caché de secretos y optimizaciones
- ✅ **Fácil de usar** con API simple e intuitiva
- ✅ **Seguro** con validación de firmas y expiración
- ✅ **Bien documentado** con PHPDoc completo
- ✅ **Pruebas unitarias** completas con PHPUnit
- ✅ **Middleware listo para usar** para autenticación
- ✅ **Independiente de modelos** - funciona sin depender de Eloquent

Instalación
-----------

[](#instalación)

### Requisitos

[](#requisitos)

- PHP &gt;= 8.2
- Laravel &gt;= 11.0 o &gt;= 12.0
- Composer

### Instalación vía Composer

[](#instalación-vía-composer)

```
composer require wramirez83/sjwt
```

### Publicar configuración (Opcional)

[](#publicar-configuración-opcional)

```
php artisan vendor:publish --tag=sjwt-config
```

Esto creará el archivo `config/sjwt.php` donde puedes configurar:

- `secret`: Clave secreta para firmar tokens (por defecto usa `SECRET_JWT` del `.env`)
- `default_expiration`: Tiempo de expiración por defecto en minutos (60)
- `header_name`: Nombre del header HTTP (por defecto: `Authorization`)
- `token_index`: Índice del token en el header (por defecto: 1, para "Bearer {token}")

Configuración
-------------

[](#configuración)

### Variables de Entorno

[](#variables-de-entorno)

Agrega a tu archivo `.env`:

```
SECRET_JWT=tu-clave-secreta-muy-segura-aqui
JWT_EXPIRATION=60
JWT_HEADER_NAME=Authorization
JWT_TOKEN_INDEX=1
```

### Generar una Clave Secreta

[](#generar-una-clave-secreta)

Puedes generar una clave secreta segura usando:

```
php -r "echo bin2hex(random_bytes(32));"
```

O usar el script incluido:

```
php src/Tools/Generate.php
```

Uso Básico
----------

[](#uso-básico)

### Generar un Token JWT

[](#generar-un-token-jwt)

```
use Wramirez83\Sjwt\SJWT;

// Crear un token con datos del usuario
$payload = [
    'user_id' => 123,
    'email' => 'usuario@example.com',
    'name' => 'Juan Pérez',
];

// Token válido por 60 minutos (por defecto)
$token = SJWT::encode($payload);

// Token válido por 120 minutos
$token = SJWT::encode($payload, 120);
```

### Validar y Decodificar un Token

[](#validar-y-decodificar-un-token)

```
use Wramirez83\Sjwt\SJWT;

// Decodificar un token
$result = SJWT::decode($token);

// Verificar si el token es válido
if ($result->valid) {
    $userId = $result->payload->user_id;
    $email = $result->payload->email;

    echo "Usuario autenticado: $email";
} else {
    if ($result->tokenExpired) {
        echo "Token expirado";
    } elseif (!$result->signatureValid) {
        echo "Firma inválida";
    }
}
```

### Leer Token desde Headers HTTP

[](#leer-token-desde-headers-http)

```
// El método decode() puede leer automáticamente desde el header Authorization
$result = SJWT::decode(); // Lee de 'Authorization' header por defecto

// O especificar un header personalizado
$result = SJWT::decode('.', 'X-Auth-Token', 0);
```

Middleware de Autenticación
---------------------------

[](#middleware-de-autenticación)

### Registrar el Middleware

[](#registrar-el-middleware)

En `app/Http/Kernel.php` o `bootstrap/app.php` (Laravel 11+):

```
use Wramirez83\Sjwt\Tools\AuthJWTMiddleware;

// Laravel 11+
$middleware->alias([
    'auth.jwt' => AuthJWTMiddleware::class,
]);
```

### Usar en Rutas

[](#usar-en-rutas)

```
use Illuminate\Support\Facades\Route;
use Wramirez83\Sjwt\Tools\AuthJWTMiddleware;

// Proteger una ruta
Route::get('/api/user', function () {
    return UserAuth::user()->getAtt();
})->middleware(AuthJWTMiddleware::class);

// O con alias
Route::middleware(['auth.jwt'])->group(function () {
    Route::get('/api/profile', function () {
        return UserAuth::user()->getAtt();
    });
});
```

### Acceder a Datos del Usuario Autenticado

[](#acceder-a-datos-del-usuario-autenticado)

```
use Wramirez83\Sjwt\UserAuth;

// Obtener todos los atributos
$userData = UserAuth::user()->getAtt();

// Obtener atributos específicos
$userId = UserAuth::user()->id();
$email = UserAuth::user()->email();
$name = UserAuth::user()->name();

// Obtener cualquier atributo
$role = UserAuth::user()->get('role', 'user');

// Verificar si existe un atributo
if (UserAuth::user()->has('permissions')) {
    // ...
}
```

Ejemplos de Uso
---------------

[](#ejemplos-de-uso)

### Login con JWT

[](#login-con-jwt)

```
use Wramirez83\Sjwt\SJWT;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;

public function login(Request $request)
{
    $credentials = $request->validate([
        'email' => 'required|email',
        'password' => 'required',
    ]);

    if (Auth::attempt($credentials)) {
        $user = Auth::user();

        $token = SJWT::encode([
            'id' => $user->id,
            'email' => $user->email,
            'name' => $user->name,
        ], 120); // Válido por 2 horas

        return response()->json([
            'token' => $token,
            'user' => $user,
        ]);
    }

    return response()->json(['error' => 'Credenciales inválidas'], 401);
}
```

### Proteger API Endpoints

[](#proteger-api-endpoints)

```
Route::middleware([AuthJWTMiddleware::class])->group(function () {
    Route::get('/api/dashboard', function () {
        $user = UserAuth::user();
        return [
            'user_id' => $user->id(),
            'email' => $user->email(),
            'dashboard_data' => getDashboardData($user->id()),
        ];
    });
});
```

Estructura del Proyecto
-----------------------

[](#estructura-del-proyecto)

```
SJWT/
├── src/
│   ├── SJWT.php                    # Clase principal para encode/decode
│   ├── UserAuth.php                # Singleton para datos de usuario
│   ├── SjwtServiceProvider.php     # Service Provider de Laravel
│   └── Tools/
│       ├── AuthJWTMiddleware.php   # Middleware de autenticación
│       ├── StructJWT.php           # Constructor de estructura JWT
│       ├── UrlEncode.php           # Codificación Base64URL
│       └── Generate.php            # Generador de secretos
├── config/
│   └── sjwt.php                    # Archivo de configuración
├── tests/
│   ├── Unit/                        # Pruebas unitarias
│   └── Feature/                    # Pruebas de integración
└── composer.json

```

Pruebas
-------

[](#pruebas)

Ejecutar todas las pruebas:

```
composer test
```

O con PHPUnit directamente:

```
./vendor/bin/phpunit
```

Ejecutar pruebas específicas:

```
./vendor/bin/phpunit tests/Unit/SJWTTest.php
```

Mejoras de Rendimiento
----------------------

[](#mejoras-de-rendimiento)

Esta versión incluye varias optimizaciones:

1. **Caché de Secretos**: El secreto JWT se cachea para evitar búsquedas repetidas
2. **Validación Eficiente**: Uso de `hash_equals()` para comparación segura de firmas
3. **Manejo Optimizado de Headers**: Búsqueda eficiente de tokens en headers HTTP
4. **Eliminación de Duplicación**: Código consolidado sin clases duplicadas

Seguridad
---------

[](#seguridad)

- ✅ Validación de firmas con `hash_equals()` (timing-safe)
- ✅ Verificación de expiración de tokens
- ✅ Validación de formato JWT
- ✅ Manejo seguro de errores sin exponer información sensible
- ✅ Soporte para claves secretas configurables

Compatibilidad
--------------

[](#compatibilidad)

- **Laravel**: 11.x, 12.x
- **PHP**: &gt;= 8.2
- **Dependencias**:
    - `illuminate/support`: ^11.0|^12.0
    - `illuminate/http`: ^11.0|^12.0
    - `nesbot/carbon`: ^3.0

Contribuir
----------

[](#contribuir)

Las contribuciones son bienvenidas. Por favor:

1. Fork el proyecto
2. Crea una rama para tu feature (`git checkout -b feature/AmazingFeature`)
3. Commit tus cambios (`git commit -m 'Add some AmazingFeature'`)
4. Push a la rama (`git push origin feature/AmazingFeature`)
5. Abre un Pull Request

Licencia
--------

[](#licencia)

Este proyecto está licenciado bajo la Licencia MIT - ver el archivo [LICENSE](LICENSE) para más detalles.

Autor
-----

[](#autor)

**Wilson Ramirez Z**

- Email:

Changelog
---------

[](#changelog)

### v3.0.0

[](#v300)

- ✨ Compatibilidad con Laravel 12
- ⚡ Mejoras significativas de rendimiento
- 🧪 Pruebas unitarias completas
- 📚 Documentación mejorada
- 🔧 Refactorización del código
- 🛡️ Mejoras de seguridad

### v2.1.0

[](#v210)

- Versión anterior

Soporte
-------

[](#soporte)

Si encuentras algún problema o tienes preguntas, por favor abre un issue en el repositorio.

###  Health Score

40

—

FairBetter than 88% of packages

Maintenance70

Regular maintenance activity

Popularity12

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity61

Established project with proven stability

 Bus Factor1

Top contributor holds 100% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Every ~121 days

Recently: every ~37 days

Total

8

Last Release

174d ago

Major Versions

1.0.3 → 2.0.12025-06-20

2.1.0 → v3.0.02025-11-16

### Community

Maintainers

![](https://www.gravatar.com/avatar/dd11480feff23989c23a202a8601179e35a4dc5430c17fbcc67db23f3bbcac8e?d=identicon)[wramirez83](/maintainers/wramirez83)

---

Top Contributors

[![wramirez83](https://avatars.githubusercontent.com/u/14268794?v=4)](https://github.com/wramirez83 "wramirez83 (23 commits)")

---

Tags

jwtlaravellaravel 12AuthenticationJSON Web Token

###  Code Quality

TestsPHPUnit

### Embed Badge

![Health badge](/badges/wramirez83-sjwt/health.svg)

```
[![Health](https://phpackages.com/badges/wramirez83-sjwt/health.svg)](https://phpackages.com/packages/wramirez83-sjwt)
```

###  Alternatives

[tymon/jwt-auth

JSON Web Token Authentication for Laravel and Lumen

11.5k49.1M344](/packages/tymon-jwt-auth)[php-open-source-saver/jwt-auth

JSON Web Token Authentication for Laravel and Lumen

8359.8M52](/packages/php-open-source-saver-jwt-auth)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
