{"id":6141,"date":"2026-02-01T17:00:41","date_gmt":"2026-02-01T13:30:41","guid":{"rendered":"https:\/\/parmin.cloud\/blog\/?p=6141"},"modified":"2026-02-01T18:05:05","modified_gmt":"2026-02-01T14:35:05","slug":"%da%86%da%af%d9%88%d9%86%d9%87-%d8%a7%d8%ad%d8%b1%d8%a7%d8%b2-%d9%87%d9%88%db%8c%d8%aa-%d8%b1%d8%a7-%d8%af%d8%b1-%db%8c%da%a9-%d8%a7%d9%be%d9%84%db%8c%da%a9%db%8c%d8%b4%d9%86-nuxt-js-%d9%be%db%8c","status":"publish","type":"post","link":"https:\/\/parmin.cloud\/blog\/%da%86%da%af%d9%88%d9%86%d9%87-%d8%a7%d8%ad%d8%b1%d8%a7%d8%b2-%d9%87%d9%88%db%8c%d8%aa-%d8%b1%d8%a7-%d8%af%d8%b1-%db%8c%da%a9-%d8%a7%d9%be%d9%84%db%8c%da%a9%db%8c%d8%b4%d9%86-nuxt-js-%d9%be%db%8c\/","title":{"rendered":"\u0686\u06af\u0648\u0646\u0647 \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0631\u0627 \u062f\u0631 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Nuxt.js \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u06a9\u0646\u06cc\u0645\u061f"},"content":{"rendered":"<h2 data-start=\"263\" data-end=\"271\">\u0645\u0642\u062f\u0645\u0647<\/h2>\n<p data-start=\"273\" data-end=\"411\">\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0646\u062d\u0648\u0647\u200c\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc <strong data-start=\"305\" data-end=\"336\">\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a (Authentication)<\/strong> \u062f\u0631 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 <strong data-start=\"352\" data-end=\"363\">Nuxt.js<\/strong> \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 <strong data-start=\"378\" data-end=\"392\">\u0645\u0627\u0698\u0648\u0644 Auth<\/strong> \u0631\u0627 \u06cc\u0627\u062f \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u062f.<\/p>\n<p data-start=\"413\" data-end=\"496\">\u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0627\u0632 <strong data-start=\"438\" data-end=\"462\">JWT (JSON Web Token)<\/strong> \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f.<\/p>\n<p data-start=\"498\" data-end=\"543\">\u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0627\u06cc\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062f\u0631 <strong data-start=\"522\" data-end=\"532\">GitHub<\/strong> \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a.<\/p>\n<p data-start=\"545\" data-end=\"746\"><strong data-start=\"545\" data-end=\"555\">\u0647\u0634\u062f\u0627\u0631:<\/strong><br data-start=\"555\" data-end=\"558\" \/>\u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u06a9\u06cc\u062c\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u062f\u0627\u0631\u0627\u06cc \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631\u06cc\u200c\u0647\u0627\u06cc \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0647\u0633\u062a\u0646\u062f. \u062f\u0631 \u0645\u062d\u06cc\u0637 Production\u060c \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644\u0627\u062a \u0628\u0627 \u0628\u0647\u200c\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u06cc\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u062c\u0627\u06cc\u06af\u0632\u06cc\u0646\u200c\u0647\u0627 \u062d\u0644 \u0634\u0648\u0646\u062f. \u0627\u0645\u0627 \u0628\u0631\u0627\u06cc \u0622\u0645\u0648\u0632\u0634\u060c \u0647\u0645\u06cc\u0646 \u0646\u0633\u062e\u0647 \u06a9\u0627\u0641\u06cc \u0627\u0633\u062a.<\/p>\n<hr data-start=\"748\" data-end=\"751\" \/>\n<h2 data-start=\"753\" data-end=\"766\">\u067e\u06cc\u0634\u200c\u0646\u06cc\u0627\u0632\u0647\u0627<\/h2>\n<ul data-start=\"768\" data-end=\"894\">\n<li data-start=\"768\" data-end=\"802\">\n<p data-start=\"770\" data-end=\"802\">\u0646\u0635\u0628 <strong data-start=\"774\" data-end=\"785\">Node.js<\/strong> \u0631\u0648\u06cc \u0633\u06cc\u0633\u062a\u0645 \u0645\u062d\u0644\u06cc<\/p>\n<\/li>\n<li data-start=\"803\" data-end=\"849\">\n<p data-start=\"805\" data-end=\"849\">\u0646\u0635\u0628 <strong data-start=\"809\" data-end=\"816\">Git<\/strong> (\u0627\u062e\u062a\u06cc\u0627\u0631\u06cc\u060c \u0628\u0631\u0627\u06cc Clone \u06a9\u0631\u062f\u0646 API)<\/p>\n<\/li>\n<li data-start=\"850\" data-end=\"894\">\n<p data-start=\"852\" data-end=\"894\">\u0622\u0634\u0646\u0627\u06cc\u06cc \u0627\u0648\u0644\u06cc\u0647 \u0628\u0627 <strong data-start=\"868\" data-end=\"878\">Vue.js<\/strong> \u0648 <strong data-start=\"881\" data-end=\"892\">Nuxt.js<\/strong><\/p>\n<\/li>\n<\/ul>\n<p data-start=\"896\" data-end=\"913\">\u0646\u0633\u062e\u0647\u200c\u0647\u0627\u06cc \u062a\u0633\u062a\u200c\u0634\u062f\u0647:<\/p>\n<ul data-start=\"915\" data-end=\"981\">\n<li data-start=\"915\" data-end=\"932\">\n<p data-start=\"917\" data-end=\"932\">Node v13.13.0<\/p>\n<\/li>\n<li data-start=\"933\" data-end=\"948\">\n<p data-start=\"935\" data-end=\"948\">npm v6.14.4<\/p>\n<\/li>\n<li data-start=\"949\" data-end=\"964\">\n<p data-start=\"951\" data-end=\"964\">Vue v2.6.11<\/p>\n<\/li>\n<li data-start=\"965\" data-end=\"981\">\n<p data-start=\"967\" data-end=\"981\">Nuxt v2.12.2<\/p>\n<\/li>\n<\/ul>\n<hr data-start=\"983\" data-end=\"986\" \/>\n<h2 data-start=\"988\" data-end=\"1021\">\u0645\u0631\u062d\u0644\u0647 \u06f1 \u2014 \u0631\u0627\u0647\u200c\u0627\u0646\u062f\u0627\u0632\u06cc API \u0646\u0645\u0648\u0646\u0647<\/h2>\n<p data-start=\"1023\" data-end=\"1044\">Clone \u06a9\u0631\u062f\u0646 API \u0646\u0645\u0648\u0646\u0647:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">git <span class=\"hljs-built_in\">clone<\/span> https:\/\/github.com\/do-community\/jwt-auth-api.git<br \/>\n<span class=\"hljs-built_in\">cd<\/span> jwt-auth-api<br \/>\nnpm install<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1146\" data-end=\"1203\">\u0627\u06af\u0631 \u0628\u0627 <code data-start=\"1153\" data-end=\"1162\">sqlite3<\/code> \u0645\u0634\u06a9\u0644 \u062f\u0627\u0634\u062a\u06cc\u062f\u060c \u0631\u0648\u0634\u200c\u0647\u0627\u06cc \u0632\u06cc\u0631 \u067e\u06cc\u0634\u0646\u0647\u0627\u062f \u0645\u06cc\u200c\u0634\u0648\u062f:<\/p>\n<ol data-start=\"1205\" data-end=\"1341\">\n<li data-start=\"1205\" data-end=\"1240\">\n<p data-start=\"1208\" data-end=\"1240\">\u062f\u0627\u0648\u0646\u200c\u06af\u0631\u06cc\u062f Node \u0628\u0647 \u0646\u0633\u062e\u0647 10.20.1<\/p>\n<\/li>\n<li data-start=\"1241\" data-end=\"1282\">\n<p data-start=\"1244\" data-end=\"1282\">\u062d\u0630\u0641 <code data-start=\"1248\" data-end=\"1267\">package-lock.json<\/code> \u0648 \u0646\u0635\u0628 \u062f\u0648\u0628\u0627\u0631\u0647<\/p>\n<\/li>\n<li data-start=\"1283\" data-end=\"1341\">\n<p data-start=\"1286\" data-end=\"1341\">\u062a\u063a\u06cc\u06cc\u0631 \u0646\u0633\u062e\u0647 <code data-start=\"1297\" data-end=\"1306\">sqlite3<\/code> \u062f\u0631 <code data-start=\"1310\" data-end=\"1324\">package.json<\/code> \u0628\u0647 \u0646\u0633\u062e\u0647 \u0633\u0627\u0632\u06af\u0627\u0631<\/p>\n<\/li>\n<\/ol>\n<p data-start=\"1343\" data-end=\"1381\">\u0646\u0627\u0645 \u0641\u0627\u06cc\u0644 <code data-start=\"1352\" data-end=\"1366\">.env.example<\/code> \u0631\u0627 \u062a\u063a\u06cc\u06cc\u0631 \u062f\u0647\u06cc\u062f:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\"><span class=\"hljs-built_in\">mv<\/span> .env.example .<span class=\"hljs-built_in\">env<\/span><br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1417\" data-end=\"1431\">\u062a\u0648\u0644\u06cc\u062f APP_KEY:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">npx @adonisjs\/cli@4.0.12 key:generate<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1484\" data-end=\"1502\">\u0627\u062c\u0631\u0627\u06cc migration\u0647\u0627:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">npx @adonisjs\/cli@4.0.12 migration:run<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1556\" data-end=\"1565\">\u0634\u0631\u0648\u0639 API:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">npm start<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1590\" data-end=\"1598\">API \u0631\u0648\u06cc:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre!\">http:<span class=\"hljs-comment\">\/\/127.0.0.1:3333\/api<\/span><br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"1635\" data-end=\"1638\" \/>\n<h2 data-start=\"1640\" data-end=\"1674\">\u0645\u0631\u062d\u0644\u0647 \u06f2 \u2014 \u0633\u0627\u062e\u062a \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Nuxt.js<\/h2>\n<p data-start=\"1676\" data-end=\"1704\">\u0627\u06cc\u062c\u0627\u062f \u067e\u0631\u0648\u0698\u0647 Nuxt \u0628\u0627 vue-cli:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">npx vue-cli@2.9.6 init nuxt\/starter nuxt-auth<br \/>\n<span class=\"hljs-built_in\">cd<\/span> nuxt-auth<br \/>\nnpm install<br \/>\nnpm run dev<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1802\" data-end=\"1815\">\u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u0631\u0648\u06cc:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre!\">http:<span class=\"hljs-comment\">\/\/localhost:3000<\/span><br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"1848\" data-end=\"1851\" \/>\n<h2 data-start=\"1853\" data-end=\"1887\">\u0645\u0631\u062d\u0644\u0647 \u06f3 \u2014 \u0646\u0635\u0628 \u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627\u06cc Nuxt.js<\/h2>\n<p data-start=\"1889\" data-end=\"1916\">\u0646\u0635\u0628 \u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627\u06cc Auth \u0648 Axios:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-bash\">npm install @nuxtjs\/auth@4.5.1 @nuxtjs\/axios@5.3.1 --save<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"1989\" data-end=\"2025\">\u0627\u0641\u0632\u0648\u062f\u0646 \u0645\u0627\u0698\u0648\u0644\u200c\u0647\u0627 \u0628\u0647 <code data-start=\"2008\" data-end=\"2024\">nuxt.config.js<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-attr\">modules<\/span>: [<br \/>\n<span class=\"hljs-string\">'@nuxtjs\/axios'<\/span>,<br \/>\n<span class=\"hljs-string\">'@nuxtjs\/auth'<\/span><br \/>\n]<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"2087\" data-end=\"2108\">\u062a\u0646\u0638\u06cc\u0645\u0627\u062a Axios \u0648 Auth:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-attr\">axios<\/span>: {<br \/>\n<span class=\"hljs-attr\">baseURL<\/span>: <span class=\"hljs-string\">'http:\/\/127.0.0.1:3333\/api'<\/span><br \/>\n},<\/code><\/code><span class=\"hljs-attr\">auth<\/span>: {<br \/>\n<span class=\"hljs-attr\">strategies<\/span>: {<br \/>\n<span class=\"hljs-attr\">local<\/span>: {<br \/>\n<span class=\"hljs-attr\">endpoints<\/span>: {<br \/>\n<span class=\"hljs-attr\">login<\/span>: { <span class=\"hljs-attr\">url<\/span>: <span class=\"hljs-string\">&#8216;login&#8217;<\/span>, <span class=\"hljs-attr\">method<\/span>: <span class=\"hljs-string\">&#8216;post&#8217;<\/span>, <span class=\"hljs-attr\">propertyName<\/span>: <span class=\"hljs-string\">&#8216;data.token&#8217;<\/span> },<br \/>\n<span class=\"hljs-attr\">user<\/span>: { <span class=\"hljs-attr\">url<\/span>: <span class=\"hljs-string\">&#8216;me&#8217;<\/span>, <span class=\"hljs-attr\">method<\/span>: <span class=\"hljs-string\">&#8216;get&#8217;<\/span>, <span class=\"hljs-attr\">propertyName<\/span>: <span class=\"hljs-string\">&#8216;data&#8217;<\/span> },<br \/>\n<span class=\"hljs-attr\">logout<\/span>: <span class=\"hljs-literal\">false<\/span><br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<\/p>\n<\/div>\n<\/div>\n<hr data-start=\"2414\" data-end=\"2417\" \/>\n<h2 data-start=\"2419\" data-end=\"2443\">\u0645\u0631\u062d\u0644\u0647 \u06f4 \u2014 \u0633\u0627\u062e\u062a Navbar<\/h2>\n<p data-start=\"2445\" data-end=\"2486\">\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 Bulma CSS \u062f\u0631 <code data-start=\"2469\" data-end=\"2485\">nuxt.config.js<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">link<\/span><\/span> <span class=\"hljs-attr\">rel<\/span>=<span class=\"hljs-string\">\"stylesheet\"<\/span> <span class=\"hljs-attr\">href<\/span>=<span class=\"hljs-string\">\"https:\/\/cdnjs.cloudflare.com\/ajax\/libs\/bulma\/0.7.1\/css\/bulma.min.css\"<\/span>&gt;<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"2601\" data-end=\"2630\">\u0633\u0627\u062e\u062a <code data-start=\"2606\" data-end=\"2629\">components\/Navbar.vue<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nav<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar is-light\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar-brand\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nuxt-link<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"navbar-item\"<\/span> <span class=\"hljs-attr\">to<\/span>=<span class=\"hljs-string\">\"\/\"<\/span>&gt;Nuxt Auth<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">nuxt-link<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">nav<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"2862\" data-end=\"2887\">\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc layout \u067e\u06cc\u0634\u200c\u0641\u0631\u0636:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Navbar<\/span><\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">nuxt<\/span><\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<\/code><\/code><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-keyword\">import<\/span> <span class=\"hljs-title class_\">Navbar<\/span> <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">&#8216;~\/components\/Navbar&#8217;<\/span><\/p>\n<p><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><\/code><\/code><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {<br \/>\n<span class=\"hljs-attr\">components<\/span>: { <span class=\"hljs-title class_\">Navbar<\/span> }<br \/>\n}<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span><\/span>&gt;<\/p>\n<\/div>\n<\/div>\n<p data-start=\"3074\" data-end=\"3104\">\u0635\u0641\u062d\u0647 \u0627\u0635\u0644\u06cc (<code data-start=\"3085\" data-end=\"3102\">pages\/index.vue<\/code>):<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"section\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h1<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"title\"<\/span>&gt;Nuxt Auth<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h1<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"3261\" data-end=\"3264\" \/>\n<h2 data-start=\"3266\" data-end=\"3294\">\u0645\u0631\u062d\u0644\u0647 \u06f5 \u2014 \u062b\u0628\u062a\u200c\u0646\u0627\u0645 \u06a9\u0627\u0631\u0628\u0631\u0627\u0646<\/h2>\n<p data-start=\"3296\" data-end=\"3317\"><code data-start=\"3296\" data-end=\"3316\">pages\/register.vue<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"section\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"container\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span><\/span> @<span class=\"hljs-attr\">submit.prevent<\/span>=<span class=\"hljs-string\">\"register\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"text\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"username\"<\/span> <span class=\"hljs-attr\">required<\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"email\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"email\"<\/span> <span class=\"hljs-attr\">required<\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"password\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"password\"<\/span> <span class=\"hljs-attr\">required<\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span>&gt;Register<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<\/code><\/code><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {<br \/>\n<span class=\"hljs-title function_\">data<\/span>() {<br \/>\n<span class=\"hljs-keyword\">return<\/span> { <span class=\"hljs-attr\">username<\/span>: <span class=\"hljs-string\">&#8221;<\/span>, <span class=\"hljs-attr\">email<\/span>: <span class=\"hljs-string\">&#8221;<\/span>, <span class=\"hljs-attr\">password<\/span>: <span class=\"hljs-string\">&#8221;<\/span>, <span class=\"hljs-attr\">error<\/span>: <span class=\"hljs-literal\">null<\/span> }<br \/>\n},<br \/>\n<span class=\"hljs-attr\">methods<\/span>: {<br \/>\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-title function_\">register<\/span>() {<br \/>\n<span class=\"hljs-keyword\">try<\/span> {<br \/>\n<span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$axios<\/span>.<span class=\"hljs-title function_\">post<\/span>(<span class=\"hljs-string\">&#8216;register&#8217;<\/span>, { <span class=\"hljs-attr\">username<\/span>: <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">username<\/span>, <span class=\"hljs-attr\">email<\/span>: <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">email<\/span>, <span class=\"hljs-attr\">password<\/span>: <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">password<\/span> })<br \/>\n<span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$auth<\/span>.<span class=\"hljs-title function_\">loginWith<\/span>(<span class=\"hljs-string\">&#8216;local&#8217;<\/span>, { <span class=\"hljs-attr\">data<\/span>: { <span class=\"hljs-attr\">email<\/span>: <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">email<\/span>, <span class=\"hljs-attr\">password<\/span>: <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">password<\/span> } })<br \/>\n<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$router<\/span>.<span class=\"hljs-title function_\">push<\/span>(<span class=\"hljs-string\">&#8216;\/&#8217;<\/span>)<br \/>\n} <span class=\"hljs-keyword\">catch<\/span> (e) {<br \/>\n<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">error<\/span> = e.<span class=\"hljs-property\">response<\/span>.<span class=\"hljs-property\">data<\/span>.<span class=\"hljs-property\">message<\/span><br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span><\/span>&gt;<\/p>\n<\/div>\n<\/div>\n<p data-start=\"4211\" data-end=\"4228\">Notification.vue:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">div<\/span><\/span> <span class=\"hljs-attr\">class<\/span>=<span class=\"hljs-string\">\"notification is-danger\"<\/span>&gt;{{ message }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">div<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<\/code><\/code><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> { <span class=\"hljs-attr\">props<\/span>: [<span class=\"hljs-string\">&#8216;message&#8217;<\/span>] }<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span><\/span>&gt;<\/p>\n<\/div>\n<\/div>\n<hr data-start=\"4382\" data-end=\"4385\" \/>\n<h2 data-start=\"4387\" data-end=\"4418\">\u0645\u0631\u062d\u0644\u0647 \u06f6 \u2014 \u0645\u062f\u06cc\u0631\u06cc\u062a \u0648\u0636\u0639\u06cc\u062a \u0644\u0627\u06af\u06cc\u0646<\/h2>\n<p data-start=\"4420\" data-end=\"4437\"><code data-start=\"4420\" data-end=\"4436\">store\/index.js<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">const<\/span> getters = {<br \/>\n<span class=\"hljs-title function_\">isAuthenticated<\/span>(<span class=\"hljs-params\">state<\/span>) { <span class=\"hljs-keyword\">return<\/span> state.<span class=\"hljs-property\">auth<\/span>.<span class=\"hljs-property\">loggedIn<\/span> },<br \/>\n<span class=\"hljs-title function_\">loggedInUser<\/span>(<span class=\"hljs-params\">state<\/span>) { <span class=\"hljs-keyword\">return<\/span> state.<span class=\"hljs-property\">auth<\/span>.<span class=\"hljs-property\">user<\/span> }<br \/>\n}<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"4583\" data-end=\"4618\">Navbar.vue (\u0628\u0631\u0648\u0632\u0631\u0633\u0627\u0646\u06cc \u0628\u0627 computed):<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\">&lt;script&gt;<br \/>\n<span class=\"hljs-keyword\">import<\/span> { mapGetters } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">'vuex'<\/span><br \/>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {<br \/>\n<span class=\"hljs-attr\">computed<\/span>: { ...<span class=\"hljs-title function_\">mapGetters<\/span>([<span class=\"hljs-string\">'isAuthenticated'<\/span>, <span class=\"hljs-string\">'loggedInUser'<\/span>]) }<br \/>\n}<br \/>\n&lt;\/script&gt;<br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"4770\" data-end=\"4773\" \/>\n<h2 data-start=\"4775\" data-end=\"4800\">\u0645\u0631\u062d\u0644\u0647 \u06f7 \u2014 \u0648\u0631\u0648\u062f \u06a9\u0627\u0631\u0628\u0631\u0627\u0646<\/h2>\n<p data-start=\"4802\" data-end=\"4820\"><code data-start=\"4802\" data-end=\"4819\">pages\/login.vue<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">form<\/span><\/span> @<span class=\"hljs-attr\">submit.prevent<\/span>=<span class=\"hljs-string\">\"login\"<\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"email\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"email\"<\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">input<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"password\"<\/span> <span class=\"hljs-attr\">v-model<\/span>=<span class=\"hljs-string\">\"password\"<\/span>\/&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">button<\/span><\/span> <span class=\"hljs-attr\">type<\/span>=<span class=\"hljs-string\">\"submit\"<\/span>&gt;Log In<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">button<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">form<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<\/code><\/code><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> {<br \/>\n<span class=\"hljs-title function_\">data<\/span>() { <span class=\"hljs-keyword\">return<\/span> { <span class=\"hljs-attr\">email<\/span>:<span class=\"hljs-string\">&#8221;<\/span>, <span class=\"hljs-attr\">password<\/span>:<span class=\"hljs-string\">&#8221;<\/span>, <span class=\"hljs-attr\">error<\/span>:<span class=\"hljs-literal\">null<\/span> } },<br \/>\n<span class=\"hljs-attr\">methods<\/span>: {<br \/>\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-title function_\">login<\/span>() {<br \/>\n<span class=\"hljs-keyword\">try<\/span> {<br \/>\n<span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$auth<\/span>.<span class=\"hljs-title function_\">loginWith<\/span>(<span class=\"hljs-string\">&#8216;local&#8217;<\/span>, { <span class=\"hljs-attr\">data<\/span>: { <span class=\"hljs-attr\">email<\/span>:<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">email<\/span>, <span class=\"hljs-attr\">password<\/span>:<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">password<\/span> } })<br \/>\n<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$router<\/span>.<span class=\"hljs-title function_\">push<\/span>(<span class=\"hljs-string\">&#8216;\/&#8217;<\/span>)<br \/>\n} <span class=\"hljs-keyword\">catch<\/span>(e) {<br \/>\n<span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">error<\/span> = e.<span class=\"hljs-property\">response<\/span>.<span class=\"hljs-property\">data<\/span>.<span class=\"hljs-property\">message<\/span><br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n}<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span><\/span>&gt;<\/p>\n<\/div>\n<\/div>\n<hr data-start=\"5389\" data-end=\"5392\" \/>\n<h2 data-start=\"5394\" data-end=\"5420\">\u0645\u0631\u062d\u0644\u0647 \u06f8 \u2014 \u0646\u0645\u0627\u06cc\u0634 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644<\/h2>\n<p data-start=\"5422\" data-end=\"5442\"><code data-start=\"5422\" data-end=\"5441\">pages\/profile.vue<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">template<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">section<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">h2<\/span><\/span>&gt;My Profile<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">h2<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span><\/span>&gt;Username: {{ loggedInUser.username }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">p<\/span><\/span>&gt;Email: {{ loggedInUser.email }}<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">p<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">section<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">template<\/span><\/span>&gt;<\/code><\/code><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">script<\/span><\/span>&gt;<br \/>\n<span class=\"hljs-keyword\">import<\/span> { mapGetters } <span class=\"hljs-keyword\">from<\/span> <span class=\"hljs-string\">&#8216;vuex&#8217;<\/span><br \/>\n<span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> { <span class=\"hljs-attr\">computed<\/span>: { &#8230;<span class=\"hljs-title function_\">mapGetters<\/span>([<span class=\"hljs-string\">&#8216;loggedInUser&#8217;<\/span>]) } }<br \/>\n<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">script<\/span><\/span>&gt;<\/p>\n<\/div>\n<\/div>\n<hr data-start=\"5740\" data-end=\"5743\" \/>\n<h2 data-start=\"5745\" data-end=\"5770\">\u0645\u0631\u062d\u0644\u0647 \u06f9 \u2014 \u062e\u0631\u0648\u062c \u06a9\u0627\u0631\u0628\u0631\u0627\u0646<\/h2>\n<p data-start=\"5772\" data-end=\"5783\">Navbar.vue:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-html\"><span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">a<\/span><\/span> @<span class=\"hljs-attr\">click<\/span>=<span class=\"hljs-string\">\"logout\"<\/span>&gt;Logout<span class=\"hljs-tag\">&lt;\/<span class=\"hljs-name\">a<\/span><\/span>&gt;<br \/>\n<\/code><\/div>\n<\/div>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-attr\">methods<\/span>: {<br \/>\n<span class=\"hljs-keyword\">async<\/span> <span class=\"hljs-title function_\">logout<\/span>() { <span class=\"hljs-keyword\">await<\/span> <span class=\"hljs-variable language_\">this<\/span>.<span class=\"hljs-property\">$auth<\/span>.<span class=\"hljs-title function_\">logout<\/span>() }<br \/>\n}<br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"5899\" data-end=\"5902\" \/>\n<h2 data-start=\"5904\" data-end=\"5941\">\u0645\u0631\u062d\u0644\u0647 \u06f1\u06f0 \u2014 \u0645\u062d\u062f\u0648\u062f \u06a9\u0631\u062f\u0646 \u0635\u0641\u062d\u0647 \u067e\u0631\u0648\u0641\u0627\u06cc\u0644<\/h2>\n<p data-start=\"5943\" data-end=\"5963\"><code data-start=\"5943\" data-end=\"5962\">pages\/profile.vue<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> { <span class=\"hljs-attr\">middleware<\/span>: <span class=\"hljs-string\">'auth'<\/span> }<br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"6014\" data-end=\"6017\" \/>\n<h2 data-start=\"6019\" data-end=\"6049\">\u0645\u0631\u062d\u0644\u0647 \u06f1\u06f1 \u2014 Middleware \u0645\u0647\u0645\u0627\u0646<\/h2>\n<p data-start=\"6051\" data-end=\"6073\"><code data-start=\"6051\" data-end=\"6072\">middleware\/guest.js<\/code>:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> <span class=\"hljs-keyword\">function<\/span> (<span class=\"hljs-params\">{ store, redirect }<\/span>) {<br \/>\n<span class=\"hljs-keyword\">if<\/span> (store.<span class=\"hljs-property\">state<\/span>.<span class=\"hljs-property\">auth<\/span>.<span class=\"hljs-property\">loggedIn<\/span>) <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-title function_\">redirect<\/span>(<span class=\"hljs-string\">'\/'<\/span>)<br \/>\n}<br \/>\n<\/code><\/div>\n<\/div>\n<p data-start=\"6190\" data-end=\"6227\">\u0627\u0636\u0627\u0641\u0647 \u06a9\u0631\u062f\u0646 \u0628\u0647 \u0635\u0641\u062d\u0627\u062a Login \u0648 Register:<\/p>\n<div class=\"contain-inline-size rounded-2xl corner-superellipse\/1.1 relative bg-token-sidebar-surface-primary\">\n<div class=\"sticky top-[calc(var(--sticky-padding-top)+9*var(--spacing))]\">\n<div class=\"absolute end-0 bottom-0 flex h-9 items-center pe-2\">\n<div class=\"bg-token-bg-elevated-secondary text-token-text-secondary flex items-center gap-4 rounded-sm px-2 font-sans text-xs\"><\/div>\n<\/div>\n<\/div>\n<div class=\"overflow-y-auto p-4\" dir=\"ltr\"><code class=\"whitespace-pre! language-js\"><span class=\"hljs-keyword\">export<\/span> <span class=\"hljs-keyword\">default<\/span> { <span class=\"hljs-attr\">middleware<\/span>: <span class=\"hljs-string\">'guest'<\/span> }<br \/>\n<\/code><\/div>\n<\/div>\n<hr data-start=\"6279\" data-end=\"6282\" \/>\n<h2 data-start=\"6284\" data-end=\"6295\">\u062c\u0645\u0639\u200c\u0628\u0646\u062f\u06cc<\/h2>\n<p data-start=\"6297\" data-end=\"6321\">\u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634 \u06cc\u0627\u062f \u06af\u0631\u0641\u062a\u06cc\u062f:<\/p>\n<ul data-start=\"6323\" data-end=\"6480\">\n<li data-start=\"6323\" data-end=\"6387\">\n<p data-start=\"6325\" data-end=\"6387\">\u0646\u062d\u0648\u0647 \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc <strong data-start=\"6341\" data-end=\"6355\">\u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a<\/strong> \u062f\u0631 Nuxt.js \u0628\u0627 <strong data-start=\"6370\" data-end=\"6385\">Auth module<\/strong><\/p>\n<\/li>\n<li data-start=\"6388\" data-end=\"6434\">\n<p data-start=\"6390\" data-end=\"6434\">\u0645\u062f\u06cc\u0631\u06cc\u062a \u062c\u0631\u06cc\u0627\u0646 \u0648\u0631\u0648\u062f \u0648 \u062e\u0631\u0648\u062c \u0628\u0627 <strong data-start=\"6418\" data-end=\"6432\">middleware<\/strong><\/p>\n<\/li>\n<li data-start=\"6435\" data-end=\"6480\">\n<p data-start=\"6437\" data-end=\"6480\">\u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 JWT \u0648 Axios \u0628\u0631\u0627\u06cc \u0627\u0631\u062a\u0628\u0627\u0637 \u0628\u0627 API<\/p>\n<\/li>\n<\/ul>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>\u0627\u0632 \u0647\u0645\u0631\u0627\u0647\u06cc \u0634\u0645\u0627 \u0628\u0627 <strong><a href=\"https:\/\/parmin.cloud\/\">\u067e\u0627\u0631\u0645\u06cc\u0646 \u06a9\u0644\u0648\u062f<\/a><\/strong> \u0645\u062a\u0634\u06a9\u0631\u06cc\u0645.<\/p>\n<div style='text-align:center' class='yasr-auto-insert-visitor'><\/div>","protected":false},"excerpt":{"rendered":"<p>\u0645\u0642\u062f\u0645\u0647 \u062f\u0631 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0646\u062d\u0648\u0647\u200c\u06cc \u067e\u06cc\u0627\u062f\u0647\u200c\u0633\u0627\u0632\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a (Authentication) \u062f\u0631 \u06cc\u06a9 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 Nuxt.js \u0628\u0627 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0645\u0627\u0698\u0648\u0644 Auth \u0631\u0627 \u06cc\u0627\u062f \u0645\u06cc\u200c\u06af\u06cc\u0631\u06cc\u062f. \u0628\u0631\u0627\u06cc \u0627\u0647\u062f\u0627\u0641 \u0627\u06cc\u0646 \u0622\u0645\u0648\u0632\u0634\u060c \u0627\u0632 JWT (JSON Web Token) \u0628\u0631\u0627\u06cc \u0627\u062d\u0631\u0627\u0632 \u0647\u0648\u06cc\u062a \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0645\u06cc\u200c\u0634\u0648\u062f. \u0633\u0648\u0631\u0633\u200c\u06a9\u062f \u0627\u06cc\u0646 \u0627\u067e\u0644\u06cc\u06a9\u06cc\u0634\u0646 \u062f\u0631 GitHub \u0645\u0648\u062c\u0648\u062f \u0627\u0633\u062a. \u0647\u0634\u062f\u0627\u0631:\u0628\u0631\u062e\u06cc \u0627\u0632 \u067e\u06a9\u06cc\u062c\u200c\u0647\u0627\u06cc \u0627\u0633\u062a\u0641\u0627\u062f\u0647\u200c\u0634\u062f\u0647 \u062f\u0627\u0631\u0627\u06cc \u0622\u0633\u06cc\u0628\u200c\u067e\u0630\u06cc\u0631\u06cc\u200c\u0647\u0627\u06cc \u0634\u0646\u0627\u062e\u062a\u0647\u200c\u0634\u062f\u0647 \u0647\u0633\u062a\u0646\u062f. \u062f\u0631 \u0645\u062d\u06cc\u0637 Production\u060c \u0628\u0627\u06cc\u062f \u0627\u06cc\u0646 [&hellip;]<\/p>\n","protected":false},"author":9,"featured_media":6143,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"om_disable_all_campaigns":false,"_monsterinsights_skip_tracking":false,"yasr_overall_rating":0,"yasr_post_is_review":"","yasr_auto_insert_disabled":"","yasr_review_type":"","footnotes":""},"categories":[67,190],"tags":[854,853,856,559,855],"class_list":["post-6141","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-67","category-programming","tag-jwt","tag-nuxt-auth-module","tag-nuxt-js","tag-vue-js","tag---authentication"],"aioseo_notices":[],"yasr_visitor_votes":{"stars_attributes":{"read_only":false,"span_bottom":false},"number_of_votes":0,"sum_votes":0},"_links":{"self":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/6141","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/users\/9"}],"replies":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/comments?post=6141"}],"version-history":[{"count":2,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/6141\/revisions"}],"predecessor-version":[{"id":6144,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/posts\/6141\/revisions\/6144"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media\/6143"}],"wp:attachment":[{"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/media?parent=6141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/categories?post=6141"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/parmin.cloud\/blog\/wp-json\/wp\/v2\/tags?post=6141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}