API’lerle, kimlik doğrulama ile ya da üçüncü taraf entegrasyonları ile çalıştıysanız, büyük ihtimalle JWT’lerle (JSON Web Tokens) karşılaşmışsınızdır.
JWT (Okunuşu: JOT), sistemler arasında veri iletimi için kullanılan kompakt bir dizedir. Üç adet base64url kodlu parça içerir ve bu parçalar nokta ile ayrılır: header, payload ve signature. Header, algoritma gibi meta verileri tanımlar, payload ise kullanıcı kimliği ve süresi gibi talepleri içerir. Signature ise bütünlüğü sağlar. Header ve payload, hızlı bir inceleme için JSON formatına çözülebilir.
Laravel uygulamanızda herhangi bir sınıfta JWT içeriğini okumak için kullanabileceğiniz basit bir trait oluşturalım:
namespace Quartzy\Illuminate\Support\Traits;
use Illuminate\Support\Str;
trait InspectsJwt
{
public function inspectJwt(string $jwt): array
{
if (!str_contains($jwt, '.')) {
return [];
}
return collect(explode('.', $jwt))
->map(function (string $segment) {
$decoded = base64_decode(
Str::of($segment)
->replace('_', "https://dev.to/")
->replace(, )
->__toString()
);
return json_decode($decoded, true) ?? [];
})
->filter() // removes empty payload elements from the array
->reduce(fn (array $carry, array $item) => array_merge($carry, $item), []);
}
}
JWT’nin içeriğini kolayca inceleyebilirsiniz! Kullanıcının uygulamamıza bir istek gönderdiği ve JWT token’ının istekte bir header olarak geçirildiği bir örneğe bakalım. İşte örnek bir JWT:
(Aşağıdaki JWT’yi kopyalayabilir ve JWT.io‘da inceleyebilirsiniz.eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiI2Nzg5MCIsInV1aWQiOiI1NTBlODQwMC1lMjliLTQxZDQtYTcxNi00NDY2NTU0NDAwMDAiLCJuYW1lIjoiTWFyayBUb3duc2VuZCIsImVtYWlsIjoibWFyay50b3duc2VuZEBleGFtcGxlLmNvbSIsInJvbGUiOiJkZXZlbG9wZXIiLCJpYXQiOjE3MTAwMDAwMDAsImV4cCI6MTcxMDAwMzYwMH0.signatureplaceholder
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
use Quartzy\Illuminate\Support\Traits\InspectsJwt;
use App\Models\User;
use Illuminate\Support\Facades\Log;
class AuthenticateWithJwtUuid
{
use InspectsJwt;
public function handle(Request $request, Closure $next)
{
$authorization = $request->header(, );
if (str_starts_with($authorization, )) {
$jwt = substr($authorization, 7);
$payload = $this->inspectJwt($jwt);
if (!empty($payload[])) {
// UUID yerine sayısal ID ile kullanıcıyı al
$user = User::where(, $payload[])->first();
if ($user) {
$request->attributes->set(, $user);
Log::info({$user->name}{$payload[]");
}
}
}
return $next($request);
}
}
Hepsi bu kadar! Umarım bu, JWT’lerin karmaşasını giderir ve uygulamanızda onlarla çalışmayı sadeleştirir!
Kaynak: Orijinal Makale


