clqms-be/app/Views/v2/jwt-decoder.php
2025-12-22 16:54:19 +07:00

95 lines
3.0 KiB
PHP

<?= $this->extend('layouts/v2') ?>
<?= $this->section('content') ?>
<div class="card bg-base-100 shadow">
<div class="card-body">
<h2 class="card-title">Current JWT Token</h2>
<?php if ($token): ?>
<!-- Raw Token -->
<div class="mt-4">
<label class="label">
<span class="label-text">Raw Token</span>
</label>
<div class="flex items-center gap-2 bg-base-200 p-3 rounded-lg">
<code class="flex-1 text-sm font-mono truncate"><?= esc(substr($token, 0, 60)) ?>...</code>
<button
onclick="navigator.clipboard.writeText('<?= esc($token) ?>'); this.classList.add('btn-success'); setTimeout(() => this.classList.remove('btn-success'), 1000)"
class="btn btn-sm btn-ghost"
title="Copy"
>
<i data-lucide="copy" class="w-4 h-4"></i>
</button>
</div>
</div>
<?php if ($decoded): ?>
<!-- Decoded Header -->
<div class="mt-4">
<label class="label">
<span class="label-text">Header</span>
</label>
<pre class="bg-base-200 p-4 rounded-lg text-sm font-mono overflow-auto"><?= json_encode($decoded['header'], JSON_PRETTY_PRINT) ?></pre>
</div>
<!-- Decoded Payload -->
<div class="mt-4">
<label class="label">
<span class="label-text">Payload</span>
</label>
<pre class="bg-primary/10 border-l-4 border-primary p-4 rounded-lg text-sm font-mono overflow-auto"><?= json_encode($decoded['payload'], JSON_PRETTY_PRINT) ?></pre>
</div>
<!-- Token Info -->
<div class="mt-4">
<label class="label">
<span class="label-text">Token Info</span>
</label>
<div class="overflow-x-auto">
<table class="table table-zebra">
<tbody>
<?php if (isset($decoded['payload']['exp'])): ?>
<tr>
<td class="text-base-content/60">Expires</td>
<td>
<?= date('Y-m-d H:i:s', $decoded['payload']['exp']) ?>
<?php
$remaining = $decoded['payload']['exp'] - time();
if ($remaining > 0):
?>
<div class="badge badge-success ml-2"><?= round($remaining / 60) ?> min remaining</div>
<?php else: ?>
<div class="badge badge-error ml-2">Expired</div>
<?php endif; ?>
</td>
</tr>
<?php endif; ?>
<?php if (isset($decoded['payload']['iat'])): ?>
<tr>
<td class="text-base-content/60">Issued At</td>
<td><?= date('Y-m-d H:i:s', $decoded['payload']['iat']) ?></td>
</tr>
<?php endif; ?>
</tbody>
</table>
</div>
</div>
<?php endif; ?>
<?php else: ?>
<div class="flex flex-col items-center justify-center py-12 text-base-content/50">
<i data-lucide="key" class="w-12 h-12 mb-4"></i>
<p>No JWT token found</p>
</div>
<?php endif; ?>
</div>
</div>
<?= $this->endSection() ?>