95 lines
3.0 KiB
PHP
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() ?>
|