31 lines
995 B
PHP
31 lines
995 B
PHP
<?php
|
|
|
|
namespace App\Http\Middleware;
|
|
|
|
use App\Models\ApiToken;
|
|
use Closure;
|
|
use Illuminate\Http\Request;
|
|
use Symfony\Component\HttpFoundation\Response;
|
|
|
|
class AuthenticateApiToken
|
|
{
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
$plain = $request->bearerToken();
|
|
if (!$plain) {
|
|
return response()->json(['message' => 'Token akses tidak ditemukan.'], 401);
|
|
}
|
|
|
|
$token = ApiToken::with('user')->where('token_hash', hash('sha256', $plain))->first();
|
|
if (!$token || !$token->user || $token->user->is_active === false || ($token->expires_at && $token->expires_at->isPast())) {
|
|
return response()->json(['message' => 'Token akses tidak valid atau sudah kedaluwarsa.'], 401);
|
|
}
|
|
|
|
$token->forceFill(['last_used_at' => now()])->saveQuietly();
|
|
$request->setUserResolver(fn () => $token->user);
|
|
$request->attributes->set('api_token', $token);
|
|
|
|
return $next($request);
|
|
}
|
|
}
|