timestamp; $ttl = (int) config('jwt.ttl', 3600); $payload = [ 'iss' => config('jwt.issuer', config('app.name')), 'sub' => (string) $user->id, 'iat' => $now, 'nbf' => $now, 'exp' => $now + $ttl, // App-specific claims 'character_id' => $user->character_id, 'character_name' => $user->character_name, 'character_owner_hash' => $user->character_owner_hash, ]; return JWT::encode($payload, $secret, 'HS256'); } public function decode(string $token): object { $secret = config('jwt.secret'); if (! $secret) { throw new RuntimeException('JWT secret is not configured.'); } return JWT::decode($token, new Key($secret, 'HS256')); } }