{"id":232277,"date":"2023-01-11T09:59:00","date_gmt":"2023-01-11T06:59:00","guid":{"rendered":"https:\/\/wordpress.mediadoma.com\/?p=232277"},"modified":"2022-11-10T08:26:05","modified_gmt":"2022-11-10T05:26:05","slug":"firebase-kirjautumistunnuksen-luominen-ja-reactissa-rekisteroeityminen","status":"publish","type":"post","link":"https:\/\/wordpress.mediadoma.com\/fi\/firebase-kirjautumistunnuksen-luominen-ja-reactissa-rekisteroeityminen\/","title":{"rendered":"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen"},"content":{"rendered":"\n<p>Firebase on j\u00e4rjestelm\u00e4, joka tarjoaa kehitt\u00e4jille monia alustoja verkkosovellusten rakentamiseen. Yksi sovelluksen olennaisista osista on luoda k\u00e4ytt\u00e4ji\u00e4 ja antaa heid\u00e4n kirjautua sis\u00e4\u00e4n. Katsotaanpa, kuinka voimme kirjoittaa Firebase-sis\u00e4\u00e4nkirjautumisen, joka on t\u00e4ydellinen mutta eritt\u00e4in helppo toteuttaa.<\/p>\n<h2>Luo Firebase-sovellus<\/h2>\n<p>Sinun on ensin luotava Firebase-sovellusprojekti, joten siirry Firebase-konsoliin ja lis\u00e4\u00e4 uusi projekti. Lis\u00e4\u00e4t sovelluksen t\u00e4h\u00e4n.<\/p>\n<p><a href=\"https:\/\/console.firebase.google.com\/u\/0\/\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/console.firebase.google.com\/<\/a><\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bffde950b.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bffde950b.png\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Se k\u00e4ynnist\u00e4\u00e4 avustajan, joka kysyy projektin nime\u00e4.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bfffb1eed.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6bfffb1eed.png\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Seuraava n\u00e4ytt\u00f6 kysyy, haluatko ottaa analytiikan k\u00e4ytt\u00f6\u00f6n. Kytke se pois p\u00e4\u00e4lt\u00e4 ja napsauta <strong>Luo projekti<\/strong> -painiketta. Projektin valmistelu kest\u00e4\u00e4 hetken, ja sen j\u00e4lkeen saat <strong>Jatka<\/strong> -painikkeen, joka vie sinut projektin yleiskatsaukseen.<\/p>\n<p>Sinun on nyt lis\u00e4tt\u00e4v\u00e4 Firebase-sovellus Firebase-projektiin. K\u00e4yd\u00e4 j\u00e4rkeen? Firebase-projektin avulla voit sis\u00e4lt\u00e4\u00e4 useita Firebase-sovelluksia iOS:lle, Androidille, Webille ja Unitylle. Luodaan toistaiseksi verkkosovellus, koska k\u00e4yt\u00e4mme Firebase-kirjautumistunnuksemme luomiseen Reactia.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c001c1120.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c001c1120.png\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Sinua pyydet\u00e4\u00e4n nime\u00e4m\u00e4\u00e4n t\u00e4m\u00e4 sovellus, ja sinulle annetaan avaimet, joita sinun tulee k\u00e4ytt\u00e4\u00e4 muodostaaksesi yhteyden Firebaseen. Ne n\u00e4ytt\u00e4v\u00e4t t\u00e4lt\u00e4:<\/p>\n<pre><code>var firebaseConfig = {\n    apiKey: \"1A2B3C4D5E6F7G\",\n    authDomain: \"appname-a123b.firebaseapp.com\",\n    databaseURL: \"https:\/\/appname-a123b.firebaseio.com\",\n    projectId: \"appname-a123b\",\n    storageBucket: \"appname-a123b.appspot.com\",\n    messagingSenderId: \"1234567890\",\n};<\/code><\/pre>\n<p>K\u00e4yt\u00e4mme n\u00e4it\u00e4 avaimia <a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> -sovelluksessamme palveluntarjoajan m\u00e4\u00e4ritt\u00e4miseen, jotta voimme k\u00e4ytt\u00e4\u00e4 Firebasea miss\u00e4 tahansa palveluntarjoajan alaisuudessa olevassa komponentissa.<\/p>\n<p>Siirry lopuksi vasemman sivupalkin <strong>Todennus -kohtaan,<\/strong> <strong>Kirjautumistapa-<\/strong> v\u00e4lilehteen ja ota <strong>s\u00e4hk\u00f6posti-\/salasanatodennus<\/strong> k\u00e4ytt\u00f6\u00f6n .<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00385c64.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00385c64.png\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Olet valmis!<\/p>\n<h2>Asenna Firebase-riippuvuudet<\/h2>\n<p>Firebase on saatavilla erilaisille pinoille, mukaan lukien <a href=\"https:\/\/startfunction.com\/category\/javascript\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">JavaScript<\/a> ja <a href=\"https:\/\/startfunction.com\/tag\/node-js\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Node.js<\/a>, joita aiomme k\u00e4ytt\u00e4\u00e4 nyt. Asennamme vain kaksi riippuvuutta npm:ll\u00e4:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/firebase\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>firebase<\/code><\/a>, jonka avulla voimme k\u00e4ytt\u00e4\u00e4 asioita, kuten <code>auth<\/code>kirjastoa, jota k\u00e4yt\u00e4mme kirjautumiseen ja my\u00f6s uuden k\u00e4ytt\u00e4j\u00e4n luomiseen<\/li>\n<li><a href=\"https:\/\/www.npmjs.com\/package\/reactfire\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\"><code>reactfire<\/code><\/a>, kokoelma hy\u00f6dyllisi\u00e4 ty\u00f6kaluja Firebasen kanssa ty\u00f6skentelemiseen Reactissa. K\u00e4yt\u00e4mme niit\u00e4 <code>useFirebaseApp<\/code>yhteyden muodostamiseen kontekstiin ja Firebaseen<\/li>\n<\/ul>\n<p>Asennamme ne kanssa<\/p>\n<pre><code>npm i firebase reactfire<\/code><\/pre>\n<p><a href=\"https:\/\/startfunction.com\/tag\/react\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">React<\/a> -sovelluksen rakenne on hyvin yksinkertainen, seuraavasti:<\/p>\n<pre><code>|-- index.js\n|-- App.js\n|-- FirebaseUser\n    |-- index.js<\/code><\/pre>\n<p>ja ne liittyv\u00e4t seuraavasti:<\/p>\n<pre><code>index.js --import--&gt; .\/App.js --import--&gt; .\/FirebaseUser<\/code><\/pre>\n<h2>M\u00e4\u00e4rit\u00e4 Firebase-palveluntarjoaja<\/h2>\n<p>Kirjoitetaan ensimm\u00e4inen tiedosto Firebase-kirjautumista ja rekister\u00f6itymist\u00e4 varten! Meid\u00e4n ei itse asiassa tarvitse kirjoittaa sit\u00e4, koska t\u00e4m\u00e4 pit\u00e4isi lis\u00e4t\u00e4 tiedostoon, johon annat <code>ReactDOM.render()<\/code>, meid\u00e4n tapauksessamme se on <code>index.js<\/code>:<\/p>\n<pre><code>import { FirebaseAppProvider } from 'reactfire';\n\nconst firebaseConfig = {\n    apiKey: \"1A2B3C4D5E6F7G\",\n    authDomain: \"appname-a123b.firebaseapp.com\",\n    databaseURL: \"https:\/\/appname-a123b.firebaseio.com\",\n    projectId: \"appname-a123b\",\n    storageBucket: \"appname-a123b.appspot.com\",\n    messagingSenderId: \"925199572988\",\n    appId: \"1:123456789:web:12a34b56c78d90e\"\n};<\/code><\/pre>\n<p>T\u00e4m\u00e4 tuo <code>FirebaseAppProvider<\/code>ja lis\u00e4\u00e4 sille v\u00e4litett\u00e4v\u00e4t m\u00e4\u00e4ritysavaimet. Voit nyt k\u00e4\u00e4ri\u00e4 juurikomponentin, joka meid\u00e4n tapauksessamme on <code>App<\/code>palveluntarjoajan kanssa:<\/p>\n<pre><code>ReactDOM.render(, document.getElementById('root')\n);<\/code><\/pre>\n<p>Loistava! Nyt kaikki alla olevat komponentit p\u00e4\u00e4sev\u00e4t Firebaseen!<\/p>\n<h2>K\u00e4yt\u00e4 Firebasen kirjautumis- ja rekister\u00f6itymiskomponenttia<\/h2>\n<p>Kirjoita nyt <code>App<\/code>komponentti, johon tuomme ja k\u00e4yt\u00e4mme <code>FirebaseUser<\/code>komponenttia k\u00e4ytt\u00e4j\u00e4n luomiseen ja kirjautumiseen. T\u00e4ss\u00e4 ei ole varsinaisesti mit\u00e4\u00e4n <a href=\"https:\/\/startfunction.com\/tag\/firebase\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">Firebaseen<\/a> liittyv\u00e4\u00e4. Aiomme toteuttaa kirjautumisen ja kirjautumisen k\u00e4ytt\u00e4m\u00e4ll\u00e4 samaa komponenttia, jotta voit n\u00e4hd\u00e4, kuinka voimme k\u00e4ytt\u00e4\u00e4 koodia uudelleen, joten t\u00e4ss\u00e4 komponentissa toteutamme painikkeet, joita napsautettuna hahmonnetaan <code>FirebaseUser<\/code>sis\u00e4\u00e4nkirjautumistilassa tai kirjautumistila:<\/p>\n<pre><code>import React, { useState } from 'react';\nimport FirebaseUser from '.\/FirebaseUser';\n\nfunction App() {\n  const [ signInOrUp, setSignInOrUp ] = useState( '' );\n  return (Firebase login\n      {\n        signInOrUp?(): (&lt;&gt;\n             setSignInOrUp( 'signin') } &gt;Log in with existing user\n             setSignInOrUp( 'signup') } &gt;Create a new user) }\n\n  );\n}\n\nexport default App;\n<\/code><\/pre>\n<h2>M\u00e4\u00e4rit\u00e4 Firebase-kirjautuminen ja rekister\u00f6idy<\/h2>\n<p>Luomme t\u00e4t\u00e4 varten komponentin. Meid\u00e4n on ensin tuotava joitain moduuleja:<\/p>\n<pre><code>import React, { useState } from 'react';\nimport { useFirebaseApp } from 'reactfire';\nimport 'firebase\/auth';<\/code><\/pre>\n<p>Aiomme <code>useState<\/code>tehd\u00e4 muutamia asioita, kuten tiet\u00e4\u00e4, onko k\u00e4ytt\u00e4j\u00e4 todennettu, virheiden asettamiseen. K\u00e4yt\u00e4mme <code>useFirebaseApp<\/code>koukkua Firebase-yhteyden muodostamiseen. T\u00e4m\u00e4 on mahdollista vain, koska m\u00e4\u00e4ritimme Firebase-palveluntarjoajan edellisess\u00e4 vaiheessa, ja se on saatavilla vain siin\u00e4 hierarkiassa, johon se lis\u00e4ttiin. Lopuksi tuomme <code>auth<\/code>kirjaston, jotta voimme kutsua Firebase-menetelmi\u00e4 k\u00e4ytt\u00e4jien luomista ja kirjautumista varten. T\u00e4m\u00e4 on tehokas tapa, koska lataamme vain t\u00e4m\u00e4n kirjaston, emme muita, kuten <code>firestore<\/code>NoSQL-tietokantaa tai <code>messaging<\/code>viestej\u00e4 ja ilmoituksia varten.<\/p>\n<p>Seuraavaksi lis\u00e4\u00e4mme pikakoukun sy\u00f6tt\u00f6kenttien hallintaan:<\/p>\n<pre><code>const useField =() =&gt; {\n    const [ value, setValue ] = useState( '' );\n    return { value, onChange: x =&gt; setValue( 'string' === typeof x? x: x.target.value) };\n};<\/code><\/pre>\n<p>Ja lopuksi koko komponentti, jonka erittelemme alla osoittaaksemme kiinnostavimmat osat, jotka liittyv\u00e4t Firebase-kirjautumiseen ja rekister\u00f6itymiseen.<\/p>\n<pre><code>function FirebaseUser ({ action = 'signin' }) {\n    const email = useField();\n    const password = useField();\n    const [ auth, setAuth ] = useState( null );\n    const [ error, setError ] = useState( '' );\n    const firebase = useFirebaseApp();\n    const setReceivedData = data =&gt; setAuth( data );\n    const setReceivedError = error =&gt; setError( error.message );\n\n    const signIn = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .signInWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n    };\n\n    const signUp = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .createUserWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n    };\n\n    const manage = 'signin' === action? {\n            success: `Logged in as ${ auth?.user.email ?? '' }`,\n            method: signIn,\n            label: 'Sign In'\n        }: {\n            success: `Signed up as ${ auth?.user.email ?? '' }`,\n            method: signUp,\n            label: 'Sign Up'\n        };\n\n    return ({\n                auth? ({ manage.success }\n                ): (&lt;&gt;\n\n                            { manage.label }\n                            {\n                                error &amp;&amp; { error }\n                            }) }\n\n    );\n}\n\nexport default FirebaseUser;\n<\/code><\/pre>\n<p>Ensin kytket\u00e4\u00e4n Firebase-instanssiin:<\/p>\n<pre><code>const firebase = useFirebaseApp();<\/code><\/pre>\n<p>Kuten aiemmin mainittiin, t\u00e4m\u00e4 on mahdollista, koska olemme aiemmin paketoineet <code>App<\/code>komponentin Firebase-palveluntarjoajan kanssa. Nyt kun olemme koukussa Firebaseen, voimme k\u00e4ytt\u00e4\u00e4 <code>auth<\/code>toimintoa ja soittaa <code>signInWithEmailAndPassword<\/code>:<\/p>\n<pre><code>const signIn = e =&gt; {\n        e.preventDefault();\n        setError( '' );\n        firebase.auth()\n            .signInWithEmailAndPassword( email.value, password.value) .then( setReceivedData) .catch( setReceivedError );\n};<\/code><\/pre>\n<p>Kun se onnistuu, se asettaa palautetut tiedot ja lomakekent\u00e4t korvataan<\/p>\n<pre><code>Logged in as ${ auth?.user.email ?? '' }<\/code><\/pre>\n<p>Palautettu data on suuri objekti, jolla on eritt\u00e4in mielenkiintoisia ominaisuuksia, joten kannattaa lis\u00e4t\u00e4 <code>console.log()<\/code>funktioomme <code>setReceivedData()<\/code>n\u00e4hd\u00e4ksesi mit\u00e4 muuta se sis\u00e4lt\u00e4\u00e4.<\/p>\n<p>K\u00e4ytt\u00e4j\u00e4n luontiprosessi on samanlainen, paitsi ett\u00e4 k\u00e4yt\u00e4mme funktiota <code>createUserWithEmailAndPassword()<\/code>.<\/p>\n<h2>Johtop\u00e4\u00e4t\u00f6s<\/h2>\n<p>Testaaksesi Firebase-kirjautumista ja rekister\u00f6itymist\u00e4, voit yritt\u00e4\u00e4 kirjautua sis\u00e4\u00e4n sellaisen k\u00e4ytt\u00e4j\u00e4n kohdalla, jota ei ole olemassa, jotta n\u00e4et virheet. Luo sen j\u00e4lkeen k\u00e4ytt\u00e4j\u00e4 ja kirjaudu sis\u00e4\u00e4n k\u00e4ytt\u00e4j\u00e4n\u00e4.<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00594d08.gif\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c00594d08.gif\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Firebase-esittely kirjautumisesta ja rekister\u00f6itymisest\u00e4.<br \/>\nHauska tosiasia: Chrome valittaa, ett\u00e4 testaukseen k\u00e4ytt\u00e4m\u00e4ni salasana 123456 on vaarantunut, mik\u00e4 on totta.<\/p>\n<p>Jos palaat nyt Firebase-sovellukseen &gt; Todennus &gt; K\u00e4ytt\u00e4j\u00e4t, n\u00e4et uuden k\u00e4ytt\u00e4j\u00e4n (sinun on ehk\u00e4 k\u00e4ytett\u00e4v\u00e4 P\u00e4ivit\u00e4-painiketta Lis\u00e4\u00e4 k\u00e4ytt\u00e4j\u00e4 -kohdan vieress\u00e4).<\/p>\n<p><a href=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c007b1816.png\" data-rel=\"lightbox\"><img decoding=\"async\" class=\"SDStudio-light-box-enable SDStudio-editor-tools-md-imp\" src=\"https:\/\/wordpress.mediadoma.com\/wp-content\/uploads\/2022\/01\/post-157701-61e6c007b1816.png\" alt=\"Firebase-kirjautumistunnuksen luominen ja Reactissa rekister\u00f6ityminen\" ><\/a><\/p>\n<p>Yhteenvetona totean, ett\u00e4 Firebasen integroiminen React-sovellukseemme ovat seuraavat:<\/p>\n<ul>\n<li>m\u00e4\u00e4rit\u00e4 Firebase-palveluntarjoaja ja k\u00e4\u00e4ri juurikomponentti (tai hierarkian juuri, jossa haluat k\u00e4ytt\u00e4\u00e4 sit\u00e4)<\/li>\n<li>liit\u00e4 Firebase-palveluntarjoajaan k\u00e4ytt\u00e4m\u00e4ll\u00e4<code>useFirebaseApp<\/code><\/li>\n<li>k\u00e4yt\u00e4 todennustoimintoja!<\/li>\n<\/ul>\n<p>Tarkista GitHub-arkisto osoitteessa <a href=\"https:\/\/github.com\/eliorivero\/firebase-login-sign-up\" target=\"_blank\" rel=\"noopener nofollow\" class=\"external external_icon\">https:\/\/github.com\/eliorivero\/firebase-login-sign-up<\/a>. Ainoa ero t\u00e4ss\u00e4 on se, ett\u00e4 lataan Firebasen m\u00e4\u00e4ritysavaimet .env-tiedostosta, jotta v\u00e4ltyt\u00e4\u00e4n paljastamasta niit\u00e4 julkisesti.<\/p>\n<p>Jos sinulla on kysytt\u00e4v\u00e4\u00e4, kerro minulle alla olevissa kommenteissa!<\/p>\n<p><div id=\"PostUnique_PostSource\" style=\"padding-top: 50px\">:  <a target=\"_blank\" rel=\"noopener nofollow\" href=\"\/\/startfunction.com\" class=\"external external_icon\">startfunction.com<\/a><\/div><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Opi luomaan Firebase-sis\u00e4\u00e4nkirjautuminen ja rekister\u00f6itym\u00e4\u00e4n j\u00e4rjestelm\u00e4 Reactissa koukkujen avulla.<\/p>\n","protected":false},"author":1,"featured_media":157702,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":"","_wp_rev_ctl_limit":""},"categories":[782,750,719,895,834,843],"tags":[1166,1166],"class_list":["post-232277","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-avoimen-laehdekoodin-ohjelmisto","category-avoin-laehdekoodi","category-kehittaejae","category-koodi","category-opas-aloittelijoille","category-opetusohjelmia","tag-affiai-fi"],"_links":{"self":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232277","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/comments?post=232277"}],"version-history":[{"count":0,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/posts\/232277\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media\/157702"}],"wp:attachment":[{"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/media?parent=232277"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/categories?post=232277"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/wordpress.mediadoma.com\/fi\/wp-json\/wp\/v2\/tags?post=232277"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}