inisiatif/user
inisiatif/user adalah paket autentikasi untuk aplikasi Inisiatif Zakat Indonesia. Mendukung Laravel 9–11 dan PHP 8.1–8.3, menyediakan migrasi, konfigurasi nama tabel, serta opsi mengganti model (User, Branch, Employee, dll).
Installation
composer require inisiatif/user
php artisan vendor:publish --tag=user-migrations
php artisan vendor:publish --tag=user-config
php artisan migrate
Configure Authentication Provider
Update config/auth.php:
'providers' => [
'users' => [
'driver' => 'eloquent',
'model' => Inisiatif\Package\User\Models\User::class,
],
],
Register Routes
Add to routes/api.php:
use Inisiatif\Package\User;
User\Routes::authToken();
User\Routes::userToken();
User\Routes::userProfile();
User\Routes::personalIdentification();
Login via Token API
POST /auth/token
Headers: Accept: application/json
Body: { "email": "user@example.com", "password": "password123" }
Create/Update Users
Extend Inisiatif\Package\User\Models\User or use its traits for custom logic.
$user = new \Inisiatif\Package\User\Models\User();
$user->name = 'John Doe';
$user->email = 'john@example.com';
$user->password = bcrypt('password123');
$user->save();
Role-Based Access
Use branch_id and employee_id/volunteer_id fields to associate users with roles:
$user->branch()->associate($branch);
$user->employee()->associate($employee); // or volunteer()
$user->save();
Generate/Revoke Tokens
// Generate token (via API POST /auth/token)
$token = $user->createToken('API Token')->accessToken;
// Revoke token (via API DELETE /auth/token)
$user->tokens()->where('id', $tokenId)->delete();
List User Tokens
$tokens = auth()->user()->tokens;
$user->update(['pin' => '1234']);
Validate via API PUT /personal-identification-number with:
{
"current_pin": "old_pin",
"new_pin": "new_pin"
}
config/services.php:
'passport' => [
'client_id' => env('INISIATIF_PASSPORT_CLIENT_ID'),
'callback_url' => env('INISIATIF_PASSPORT_CALLBACK_URL'),
'base_url' => env('INISIATIF_PASSPORT_BASE_URL', 'http://me.inisiatif.id'),
],
Register routes in routes/web.php:
User\Routes::passport();
Redirect users to /oauth/passport/redirect for OAuth flow..env:
INISIATIF_PASSPORT_SSL_DISABLE=true
Configure Sanctum middleware in app/Http/Kernel.php:
'api' => [
\Laravel\Sanctum\Http\Middleware\EnsureFrontendRequestsAreStateful::class,
'throttle:api',
\Inisiatif\Package\User\Http\Middleware\VerifyUser::class,
],
app/Providers/AuthServiceProvider.php:
public function boot()
{
$this->app['auth']->extend('custom', function ($app) {
return new \Inisiatif\Package\User\Auth\CustomGuard(
$app['auth']->createUserProvider(),
$app['request']
);
});
}
app/Http/Kernel.php:
'api' => [
\Illuminate\Routing\Middleware\ThrottleRequests::class.':api',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
Configure in app/Providers/RouteServiceProvider.php:
RateLimiter::for('api', function (Request $request) {
return Limit::perMinute(60)->by($request->user()?->id ?: $request->ip());
});
Migration Conflicts
php artisan migrate without publishing migrations may cause conflicts if table names differ.php artisan vendor:publish --tag=user-migrations
PIN Validation Bypass
pin in the database bypasses validation (e.g., max attempts).PUT /personal-identification-number or call the updatePin method in the service layer.Passport SSL Errors (Dev)
INISIATIF_PASSPORT_SSL_DISABLE=true in .env (for development only).Model Binding Quirks
auth()->user() may return null if the guard isn’t properly configured.auth.providers.users.model points to Inisiatif\Package\User\Models\User.Token Expiry Handling
expired_at = null never expire.createToken call:
$token = $user->createToken('API Token')->accessToken;
$token = $user->createToken('API Token', ['expires_at' => now()->addDays(30)])->accessToken;
Log Failed Logins
.env:
APP_DEBUG=true
tail -f storage/logs/laravel.log | grep "pin_attempt"
Inspect Token Generation
$token = auth()->user()->createToken('Test')->plainTextToken;
\Log::info('Token Payload:', ['token' => $token]);
Verify Route Registration
php artisan route:list | grep "auth/token\|user-token\|user-information"
Custom User Attributes
User model:
namespace App\Models;
use Inisiatif\Package\User\Models\User as BaseUser;
class User extends BaseUser
{
protected $casts = [
'is_active' => 'boolean',
'custom_field' => 'string',
];
}
config/user.php:
'models' => [
'user' => App\Models\User::class,
],
Override PIN Logic
PinAttempt logic in app/Providers/AppServiceProvider.php:
use Inisiatif\Package\User\Services\PinService;
public function register()
{
$this->app->bind(PinService::class, function ($app) {
return new class extends PinService {
protected function maxAttempts(): int
{
return 5; // Custom max attempts
}
};
});
}
Add Custom Routes
Routes class:
namespace App\Providers;
use Inisiatif\Package\User\Routes as BaseRoutes;
class RouteServiceProvider extends ServiceProvider
{
public function boot()
{
BaseRoutes::authToken();
Route::prefix('custom')->group(function () {
Route::get('/profile', [UserController::class, 'customProfile']);
});
}
}
Custom Passport Scopes
User model:
use Laravel\Passport\HasApiTokens;
class User extends BaseUser
{
use HasApiTokens;
public function getScopesAttribute()
{
return ['read', 'write']; // Custom scopes
}
}
INISIATIF_USER_TABLE_NAME_USERS=public.users
How can I help you explore Laravel packages today?