{"id":5410,"date":"2025-07-13T10:29:17","date_gmt":"2025-07-13T09:29:17","guid":{"rendered":"https:\/\/www.utilewebsites.nl\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/"},"modified":"2025-07-13T11:18:32","modified_gmt":"2025-07-13T10:18:32","slug":"een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api","status":"publish","type":"wz_knowledgebase","link":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/","title":{"rendered":"Secure Headless Architecture with Ionic Vue and a PHP JWT API"},"content":{"rendered":"<p>A guide to securing headless systems with JSON Web Tokens.<\/p>\n<h3 class=\"wp-block-heading\"><strong>Introduction: Why JWT for Headless Security?<\/strong><\/h3>\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-1024x877.jpg\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"877\" src=\"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-1024x877.jpg\" alt=\"JWT headless app architecture diagram\" class=\"wp-image-5401\" style=\"width:360px;height:auto\" srcset=\"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-1024x877.jpg 1024w, https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-300x257.jpg 300w, https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-768x658.jpg 768w, https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3-1536x1316.jpg 1536w, https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue3.jpg 2048w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n<p><strong>Headless<\/strong> means your backend exclusively provides data without a presentation layer\u2014for example, a PHP API that only returns JSON to a mobile app or JavaScript frontend. In such a stateless environment, traditional session authentication doesn't work smoothly: the server must process each request independently without tracking user sessions.<\/p>\n<p>JSON Web Tokens (JWT) offer a compact, self-contained, and secure way to transmit authorization information. After logging in, the client receives a token that is sent with every API call, allowing your backend to easily verify if the user is authorized.<\/p>\n<h3 class=\"wp-block-heading\"><strong>The Anatomy of a JWT<\/strong><\/h3>\n<ul class=\"wp-block-list\">\n<li><strong>Header:<\/strong> Contains metadata such as the algorithm (<code>alg<\/code>) and the token type (<code>typ<\/code>).<\/li>\n<li><strong>Payload:<\/strong> Contains the \"claims\"\u2014data about the user (<code>sub<\/code>), the issuer (<code>iss<\/code>), and the expiration (<code>exp<\/code>). You can also add roles or permissions here.<\/li>\n<li><strong>Signature:<\/strong> A cryptographic signature over the header and payload, using your secret key, to prevent tampering.<\/li>\n<\/ul>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n<h3 class=\"wp-block-heading\"><strong>Part 1: The PHP Backend \u2013 Building a JWT API<\/strong><\/h3>\n<p>In this part, we'll build the PHP backend that issues and validates tokens. We will use <code>firebase\/php-jwt<\/code> to create and verify JWTs, ensuring strict claim and algorithm validation.<\/p>\n<ul class=\"wp-block-list\">\n<li><strong>Structure:<\/strong>\n<ul class=\"wp-block-list\">\n<li><code>api\/login.php<\/code>: Validates login credentials and returns a JWT (access + refresh).<\/li>\n<li><code>api\/refresh.php<\/code>: Refreshes the access token using a valid refresh token.<\/li>\n<li><code>api\/secure-data.php<\/code>: Secure endpoint; only accessible with a valid access token.<\/li>\n<li><code>.env<\/code>: Contains your secret keys (<code>JWT_SECRET<\/code> and <code>JWT_REFRESH_SECRET<\/code>).<\/li>\n<\/ul>\n<\/li>\n<li><strong>Installation:<\/strong><br \/>\u00a0 \u00a0\n<pre class=\"wp-block-code\"><code>composer require firebase\/php-jwt<\/code><\/pre>\n<p>\u00a0 <\/li>\n<\/ul>\n<h4 class=\"wp-block-heading\"><strong>1. Generating a Token (login.php)<\/strong><\/h4>\n<pre class=\"wp-block-code\"><code>&lt;?php\nrequire __DIR__ . '\/vendor\/autoload.php';\nuse Firebase\\JWT\\JWT;\n\n\/\/ Load secret from .env\n$secret       = getenv('JWT_SECRET');\n$refreshSecret= getenv('JWT_REFRESH_SECRET');\n\n\/\/ Validate user...\nif (validUser($_POST['email'], $_POST['password'])) {\n    $now = time();\n    $accessPayload = [\n        'iss' => 'https:\/\/your-domain.com',\n        'aud' => 'https:\/\/your-domain.com',\n        'iat' => $now,\n        'exp' => $now + 900,      \/\/ 15 minutes\n        'sub' => getUserId(),\n        'role'=> 'user'\n    ];\n    $refreshPayload = [\n        'iss' => 'https:\/\/your-domain.com',\n        'aud' => 'https:\/\/your-domain.com',\n        'iat' => $now,\n        'exp' => $now + 604800,   \/\/ 1 week\n        'sub' => getUserId()\n    ];\n    $accessToken  = JWT::encode($accessPayload, $secret, 'HS256');\n    $refreshToken = JWT::encode($refreshPayload, $refreshSecret, 'HS256');\n    echo json_encode(['accessToken'=>$accessToken, 'refreshToken'=>$refreshToken]);\n    exit;\n}\nhttp_response_code(401);\necho json_encode(['error'=>'Invalid credentials']);\n<\/code><\/pre>\n<h4 class=\"wp-block-heading\"><strong>2. Validating a Token (secure-data.php)<\/strong><\/h4>\n<pre class=\"wp-block-code\"><code>&lt;?php\nrequire __DIR__ . '\/vendor\/autoload.php';\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$secret = getenv('JWT_SECRET');\n$auth   = $_SERVER['HTTP_AUTHORIZATION'] ?? '';\nif (preg_match('\/Bearer\\s(\\S+)\/', $auth, $m)) {\n    try {\n        $token = $m[1];\n        $decoded = JWT::decode($token, new Key($secret, 'HS256'));\n        \/\/ Check iss and aud\n        if ($decoded->iss !== 'https:\/\/your-domain.com' || $decoded->aud !== 'https:\/\/your-domain.com') {\n            throw new Exception('Invalid token issuer or audience');\n        }\n        echo json_encode(['data'=>'Secure information']);\n        exit;\n    } catch (Exception $e) {\n        http_response_code(401);\n        echo json_encode(['error'=>'Access denied']);\n        exit;\n    }\n}\nhttp_response_code(401);\necho json_encode(['error'=>'No token found']);\n<\/code><\/pre>\n<h4 class=\"wp-block-heading\"><strong>3. Refresh Endpoint (refresh.php)<\/strong><\/h4>\n<pre class=\"wp-block-code\"><code>&lt;?php\nrequire __DIR__ . '\/vendor\/autoload.php';\nuse Firebase\\JWT\\JWT;\nuse Firebase\\JWT\\Key;\n\n$refreshSecret = getenv('JWT_REFRESH_SECRET');\n$body = json_decode(file_get_contents('php:\/\/input'), true);\ntry {\n    $decoded = JWT::decode($body['refreshToken'], new Key($refreshSecret, 'HS256'));\n    $now = time();\n    $newAccess = [\n        'iss'=>'https:\/\/your-domain.com','aud'=>'https:\/\/your-domain.com',\n        'iat'=>$now,'exp'=>$now+900,'sub'=>$decoded->sub\n    ];\n    $token = JWT::encode($newAccess, getenv('JWT_SECRET'), 'HS256');\n    echo json_encode(['accessToken'=>$token]);\n} catch (Exception $e) {\n    http_response_code(401);\n    echo json_encode(['error'=>'Invalid refresh token']);\n}\n<\/code><\/pre>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n<h3 class=\"wp-block-heading\"><strong>Part 2: The Ionic Vue App \u2013 API Communication with Axios<\/strong><\/h3>\n<p>In this part, we'll build the frontend in Ionic Vue. We will install Axios, create a service for all our API calls including refresh token rotation, and implement secure storage.<\/p>\n<h4 class=\"wp-block-heading\"><strong>1. Secure Storage &amp; Axios Setup<\/strong><\/h4>\n<p>First, install the secure storage plugin for Capacitor:<\/p>\n<pre class=\"wp-block-code\"><code>npm install @capacitor-community\/secure-storage<\/code><\/pre>\n<pre class=\"wp-block-code\"><code>\/\/ src\/services\/AxiosService.js\nimport axios from 'axios';\nimport { SecureStoragePlugin } from '@capacitor-community\/secure-storage';\n\nconst API_URL = import.meta.env.VITE_API_URL || 'https:\/\/your-domain.com\/api';\nconst storage = new SecureStoragePlugin();\n\nconst axiosInstance = axios.create({ baseURL: API_URL, headers:{'Content-Type':'application\/json'} });\n\naxiosInstance.interceptors.request.use(async config => {\n  const token = await storage.get({ key:'accessToken' });\n  if (token.value) config.headers.Authorization = `Bearer ${token.value}`;\n  return config;\n});\n\nexport default axiosInstance;\n<\/code><\/pre>\n<h4 class=\"wp-block-heading\"><strong>2. Login &amp; Token Storage (<code>LoginPage.vue<\/code>)<\/strong><\/h4>\n<pre class=\"wp-block-code\"><code>&lt;script setup&gt;\nimport { SecureStoragePlugin } from '@capacitor-community\/secure-storage';\nimport axiosService from '@\/services\/AxiosService';\nconst storage = new SecureStoragePlugin();\n\nasync function handleLogin() {\n  const resp = await axiosService.post('\/login.php', params);\n  await storage.set({ key:'accessToken', value:resp.data.accessToken });\n  await storage.set({ key:'refreshToken', value:resp.data.refreshToken });\n  router.push('\/tabs\/dashboard');\n}\n&lt;\/script&gt;\n<\/code><\/pre>\n<h4 class=\"wp-block-heading\"><strong>3. Refresh Logic<\/strong><\/h4>\n<p>In your interceptor, you can automatically make a refresh call on a 401 error:<\/p>\n<pre class=\"wp-block-code\"><code>axiosInstance.interceptors.response.use(null, async error => {\n  if (error.response?.status === 401) {\n    const refresh = await storage.get({key:'refreshToken'});\n    const { data } = await axios.post('\/refresh.php', { refreshToken: refresh.value });\n    await storage.set({key:'accessToken', value:data.accessToken});\n    error.config.headers.Authorization = `Bearer ${data.accessToken}`;\n    return axiosInstance.request(error.config);\n  }\n  return Promise.reject(error);\n});<\/code><\/pre>\n<hr class=\"wp-block-separator has-alpha-channel-opacity\"\/>\n<h3 class=\"wp-block-heading\"><strong>Best Practices &amp; Security<\/strong><\/h3>\n<ul class=\"wp-block-list\">\n<li>Always use HTTPS for transport security.<\/li>\n<li>Store tokens in secure storage (e.g., Capacitor Secure Storage), not in localStorage.<\/li>\n<li>Implement access and refresh token rotation for short-lived sessions.<\/li>\n<li>Always validate <code>iss<\/code>, <code>aud<\/code>, and <code>alg<\/code> on the server side.<\/li>\n<li>Limit the token payload to the minimum necessary data.<\/li>\n<\/ul>\n<h3 class=\"wp-block-heading\"><strong>Conclusion<\/strong><\/h3>\n<p>This guide highlights that true security starts with a \"security-first\" architecture: short-lived tokens, a dual-token strategy, secure client-side storage, and strict server-side validation. With this layered approach, you can build a resilient, production-ready headless application that is resistant to modern threats.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>A guide to securing headless systems with JSON Web Tokens. Introduction: Why JWT for Headless Security? Headless means your backend exclusively provides data without a presentation layer\u2014for example, a PHP API that only returns JSON to a mobile app or JavaScript frontend. In such a stateless environment, traditional session authentication doesn't work smoothly: the server must process each request independently without tracking user sessions. JSON Web Tokens (JWT) offer a compact, self-contained, and secure way to transmit authorization information. After logging in, the client receives a token that is sent with every API call, allowing your backend to easily verify&nbsp;<a href=\"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/\" class=\"read-more\">Continue Reading<\/a><\/p>\n","protected":false},"author":2,"featured_media":5397,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"wzkb_category":[98],"wzkb_tag":[],"class_list":["post-5410","wz_knowledgebase","type-wz_knowledgebase","status-publish","has-post-thumbnail","hentry","wzkb_category-ionic-vue"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites\" \/>\n<meta property=\"og:description\" content=\"A guide to securing headless systems with JSON Web Tokens. Introduction: Why JWT for Headless Security? Headless means your backend exclusively provides data without a presentation layer\u2014for example, a PHP API that only returns JSON to a mobile app or JavaScript frontend. In such a stateless environment, traditional session authentication doesn&#039;t work smoothly: the server must process each request independently without tracking user sessions. JSON Web Tokens (JWT) offer a compact, self-contained, and secure way to transmit authorization information. After logging in, the client receives a token that is sent with every API call, allowing your backend to easily verify&nbsp;Continue Reading\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/\" \/>\n<meta property=\"og:site_name\" content=\"Utilewebsites\" \/>\n<meta property=\"article:modified_time\" content=\"2025-07-13T10:18:32+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue-e1752400088395.jpg\" \/>\n\t<meta property=\"og:image:width\" content=\"2048\" \/>\n\t<meta property=\"og:image:height\" content=\"1680\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/jpeg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"3 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/\",\"url\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/\",\"name\":\"Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.utilewebsites.nl\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/jwt_headless_app_ionic_vue-e1752400088395.jpg\",\"datePublished\":\"2025-07-13T09:29:17+00:00\",\"dateModified\":\"2025-07-13T10:18:32+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.utilewebsites.nl\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/jwt_headless_app_ionic_vue-e1752400088395.jpg\",\"contentUrl\":\"https:\\\/\\\/www.utilewebsites.nl\\\/wp-content\\\/uploads\\\/2025\\\/07\\\/jwt_headless_app_ionic_vue-e1752400088395.jpg\",\"width\":2048,\"height\":1680},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Knowledge Base\",\"item\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/knowledgebase\\\/\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Secure Headless Architecture with Ionic Vue and a PHP JWT API\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/\",\"name\":\"Utilewebsites\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#organization\",\"name\":\"Utilewebsites\",\"url\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/www.utilewebsites.nl\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/logo-Utilewebsites-2017.png\",\"contentUrl\":\"https:\\\/\\\/www.utilewebsites.nl\\\/wp-content\\\/uploads\\\/2019\\\/08\\\/logo-Utilewebsites-2017.png\",\"width\":3000,\"height\":593,\"caption\":\"Utilewebsites\"},\"image\":{\"@id\":\"https:\\\/\\\/www.utilewebsites.nl\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/","og_locale":"en_US","og_type":"article","og_title":"Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites","og_description":"A guide to securing headless systems with JSON Web Tokens. Introduction: Why JWT for Headless Security? Headless means your backend exclusively provides data without a presentation layer\u2014for example, a PHP API that only returns JSON to a mobile app or JavaScript frontend. In such a stateless environment, traditional session authentication doesn't work smoothly: the server must process each request independently without tracking user sessions. JSON Web Tokens (JWT) offer a compact, self-contained, and secure way to transmit authorization information. After logging in, the client receives a token that is sent with every API call, allowing your backend to easily verify&nbsp;Continue Reading","og_url":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/","og_site_name":"Utilewebsites","article_modified_time":"2025-07-13T10:18:32+00:00","og_image":[{"width":2048,"height":1680,"url":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue-e1752400088395.jpg","type":"image\/jpeg"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"3 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/","url":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/","name":"Secure Headless Architecture with Ionic Vue and a PHP JWT API - Utilewebsites","isPartOf":{"@id":"https:\/\/www.utilewebsites.nl\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/#primaryimage"},"image":{"@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/#primaryimage"},"thumbnailUrl":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue-e1752400088395.jpg","datePublished":"2025-07-13T09:29:17+00:00","dateModified":"2025-07-13T10:18:32+00:00","breadcrumb":{"@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/#primaryimage","url":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue-e1752400088395.jpg","contentUrl":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2025\/07\/jwt_headless_app_ionic_vue-e1752400088395.jpg","width":2048,"height":1680},{"@type":"BreadcrumbList","@id":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/een-veilige-ionic-vue-app-bouwen-met-een-php-jwt-api\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.utilewebsites.nl\/en\/"},{"@type":"ListItem","position":2,"name":"Knowledge Base","item":"https:\/\/www.utilewebsites.nl\/en\/knowledgebase\/"},{"@type":"ListItem","position":3,"name":"Secure Headless Architecture with Ionic Vue and a PHP JWT API"}]},{"@type":"WebSite","@id":"https:\/\/www.utilewebsites.nl\/en\/#website","url":"https:\/\/www.utilewebsites.nl\/en\/","name":"Utilewebsites","description":"","publisher":{"@id":"https:\/\/www.utilewebsites.nl\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.utilewebsites.nl\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/www.utilewebsites.nl\/en\/#organization","name":"Utilewebsites","url":"https:\/\/www.utilewebsites.nl\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.utilewebsites.nl\/en\/#\/schema\/logo\/image\/","url":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2019\/08\/logo-Utilewebsites-2017.png","contentUrl":"https:\/\/www.utilewebsites.nl\/wp-content\/uploads\/2019\/08\/logo-Utilewebsites-2017.png","width":3000,"height":593,"caption":"Utilewebsites"},"image":{"@id":"https:\/\/www.utilewebsites.nl\/en\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wz_knowledgebase\/5410","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wz_knowledgebase"}],"about":[{"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/types\/wz_knowledgebase"}],"author":[{"embeddable":true,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/comments?post=5410"}],"version-history":[{"count":2,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wz_knowledgebase\/5410\/revisions"}],"predecessor-version":[{"id":5412,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wz_knowledgebase\/5410\/revisions\/5412"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/media\/5397"}],"wp:attachment":[{"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/media?parent=5410"}],"wp:term":[{"taxonomy":"wzkb_category","embeddable":true,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wzkb_category?post=5410"},{"taxonomy":"wzkb_tag","embeddable":true,"href":"https:\/\/www.utilewebsites.nl\/en\/wp-json\/wp\/v2\/wzkb_tag?post=5410"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}