{"id":37713,"date":"2026-01-13T12:41:17","date_gmt":"2026-01-13T09:41:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=37713"},"modified":"2026-01-13T12:41:17","modified_gmt":"2026-01-13T09:41:17","slug":"solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/","title":{"rendered":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu"},"content":{"rendered":"<p><body><\/p>\n<h2>SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu<\/h2>\n<p>SolidJS, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in performansl\u0131 ve reaktif bir JavaScript k\u00fct\u00fcphanesidir. Bile\u015fen tabanl\u0131 yap\u0131s\u0131 ve ince taneli reaktivite modeli sayesinde, \u00f6zellikle y\u00fcksek performans gerektiren uygulamalarda tercih edilmektedir. Di\u011fer yandan Supabase, a\u00e7\u0131k kaynakl\u0131 bir Firebase alternatifi olarak ortaya \u00e7\u0131km\u0131\u015f, geli\u015ftiricilere veritaban\u0131, kimlik do\u011frulama, depolama ve ger\u00e7ek zamanl\u0131 abonelikler gibi backend hizmetlerini kolayca sunan bir &#8220;Backend-as-a-Service&#8221; (BaaS) platformudur. Bir SolidJS uygulamas\u0131na kullan\u0131c\u0131 kimlik do\u011frulama \u00f6zelli\u011fi eklemek istedi\u011fimizde, Supabase sundu\u011fu zengin API&#8217;ler ve kullan\u0131m kolayl\u0131\u011f\u0131 ile m\u00fckemmel bir \u00e7\u00f6z\u00fcm orta\u011f\u0131 olabilir.<\/p>\n<p>Bu makalede, SolidJS tabanl\u0131 bir uygulamada Supabase&#8217;i kullanarak kullan\u0131c\u0131 kayd\u0131, giri\u015fi, \u00e7\u0131k\u0131\u015f\u0131, oturum y\u00f6netimi ve korunan rotalar gibi temel kimlik do\u011frulama ak\u0131\u015flar\u0131n\u0131 nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m ele alaca\u011f\u0131z. Amac\u0131m\u0131z, geli\u015ftiricilere bu iki g\u00fc\u00e7l\u00fc teknolojiyi bir araya getirerek h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde kullan\u0131c\u0131 kimlik do\u011frulama sistemleri olu\u015fturma konusunda kapsaml\u0131 bir rehber sunmakt\u0131r.<\/p>\n<h3>\u00d6n Ko\u015fullar<\/h3>\n<p>Bu makaledeki ad\u0131mlar\u0131 takip edebilmek i\u00e7in a\u015fa\u011f\u0131daki temel bilgilere ve ara\u00e7lara sahip olman\u0131z gerekmektedir:<\/p>\n<p>*   <strong>Temel JavaScript Bilgisi:<\/strong> ES6+ sentaks\u0131na ve asenkron programlamaya a\u015fina olmak.<br \/>\n*   <strong>SolidJS Temelleri:<\/strong> SolidJS&#8217;in reaktif primitifleri (createSignal, createEffect vb.) ve bile\u015fen yap\u0131s\u0131 hakk\u0131nda bilgi sahibi olmak.<br \/>\n*   <strong>Node.js ve npm\/yarn:<\/strong> Geli\u015ftirme ortam\u0131n\u0131zda kurulu olmas\u0131.<br \/>\n*   <strong>Git:<\/strong> Versiyon kontrol sistemi.<br \/>\n*   <strong>Supabase Hesab\u0131:<\/strong> \u00dccretsiz bir Supabase hesab\u0131 olu\u015fturmu\u015f olman\u0131z gerekmektedir.<\/p>\n<h3>Supabase Projesi Olu\u015fturma ve Yap\u0131land\u0131rma<\/h3>\n<p>SolidJS uygulamam\u0131zla etkile\u015fime ge\u00e7ecek bir Supabase backend&#8217;ine ihtiyac\u0131m\u0131z var. Bu b\u00f6l\u00fcmde, Supabase projemizi nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ve kimlik do\u011frulama i\u00e7in gerekli temel yap\u0131land\u0131rmalar\u0131 nas\u0131l yapaca\u011f\u0131m\u0131z\u0131 inceleyece\u011fiz.<\/p>\n<h4>Supabase Hesab\u0131 Olu\u015fturma ve Proje Yaratma<\/h4>\n<p>\u0130lk ad\u0131m, Supabase web sitesine (supabase.com) giderek \u00fccretsiz bir hesap olu\u015fturmak veya mevcut hesab\u0131n\u0131zla giri\u015f yapmakt\u0131r. Giri\u015f yapt\u0131ktan sonra, kontrol panelinde &#8220;New project&#8221; butonuna t\u0131klayarak yeni bir proje olu\u015fturabilirsiniz.<\/p>\n<p>Proje olu\u015fturma a\u015famas\u0131nda a\u015fa\u011f\u0131daki bilgileri girmeniz istenecektir:<\/p>\n<p>*   <strong>Organization:<\/strong> Projenizin ait olaca\u011f\u0131 organizasyonu se\u00e7in veya yeni bir tane olu\u015fturun.<br \/>\n*   <strong>Project name:<\/strong> Projenize a\u00e7\u0131klay\u0131c\u0131 bir isim verin (\u00f6rn. <code>solid-auth-app<\/code>).<br \/>\n*   <strong>Database Password:<\/strong> Veritaban\u0131n\u0131z i\u00e7in g\u00fc\u00e7l\u00fc bir \u015fifre belirleyin ve g\u00fcvenli bir yerde saklay\u0131n.<br \/>\n*   <strong>Region:<\/strong> Uygulaman\u0131z\u0131n kullan\u0131c\u0131lar\u0131na co\u011frafi olarak en yak\u0131n b\u00f6lgeyi se\u00e7erek gecikmeyi azaltabilirsiniz.<\/p>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda Supabase, sizin i\u00e7in bir PostgreSQL veritaban\u0131, kimlik do\u011frulama hizmetleri, depolama ve daha fazlas\u0131n\u0131 i\u00e7eren bir backend provizyonu yapacakt\u0131r. Bu i\u015flem birka\u00e7 dakika s\u00fcrebilir.<\/p>\n<h4>API Anahtarlar\u0131n\u0131 ve URL&#8217;yi Alma<\/h4>\n<p>Projeniz haz\u0131r oldu\u011funda, Supabase kontrol panelinizdeki &#8220;Project Settings&#8221; (Proje Ayarlar\u0131) b\u00f6l\u00fcm\u00fcne ve ard\u0131ndan &#8220;API&#8221; sekmesine gidin. Burada, SolidJS uygulaman\u0131z\u0131n Supabase ile ileti\u015fim kurmas\u0131 i\u00e7in gerekli olan <code>Project URL<\/code> ve <code>anon public<\/code> anahtar\u0131n\u0131 bulacaks\u0131n\u0131z.<\/p>\n<p>*   <strong>Project URL:<\/strong> Supabase hizmetinize yap\u0131lan t\u00fcm isteklerin g\u00f6nderilece\u011fi URL&#8217;dir.<br \/>\n*   <strong>anon public (Public Anon Key):<\/strong> Bu anahtar, istemci taraf\u0131nda g\u00fcvenle kullan\u0131labilir. Kullan\u0131c\u0131 kimlik do\u011frulamas\u0131 gerektirmeyen veya genel olarak eri\u015filebilir veriler i\u00e7in kullan\u0131l\u0131r. Kullan\u0131c\u0131 oturum a\u00e7t\u0131\u011f\u0131nda, bu anahtar kullan\u0131larak yap\u0131lan istekler kullan\u0131c\u0131n\u0131n kimli\u011fiyle ili\u015fkilendirilir.<\/p>\n<p><code>service_role<\/code> anahtar\u0131 ise yaln\u0131zca sunucu taraf\u0131nda kullan\u0131lmas\u0131 gereken, y\u00fcksek ayr\u0131cal\u0131kl\u0131 bir anahtard\u0131r. Asla istemci taraf\u0131nda (SolidJS uygulaman\u0131zda) kullanmamal\u0131s\u0131n\u0131z.<\/p>\n<h4>Kimlik Do\u011frulama Sa\u011flay\u0131c\u0131lar\u0131n\u0131 Yap\u0131land\u0131rma<\/h4>\n<p>Supabase, e-posta\/\u015fifre tabanl\u0131 kimlik do\u011frulaman\u0131n yan\u0131 s\u0131ra bir\u00e7ok sosyal medya ve OAuth sa\u011flay\u0131c\u0131s\u0131n\u0131 da destekler. Kimlik do\u011frulama ayarlar\u0131n\u0131 yap\u0131land\u0131rmak i\u00e7in Supabase kontrol panelinizdeki &#8220;Authentication&#8221; (Kimlik Do\u011frulama) b\u00f6l\u00fcm\u00fcne ve ard\u0131ndan &#8220;Providers&#8221; (Sa\u011flay\u0131c\u0131lar) sekmesine gidin.<\/p>\n<p>Varsay\u0131lan olarak, e-posta\/\u015fifre tabanl\u0131 kimlik do\u011frulama etkindir. E\u011fer kullan\u0131c\u0131lar\u0131n\u0131z\u0131n e-posta onay\u0131 yapmas\u0131n\u0131 istiyorsan\u0131z, &#8220;Email&#8221; sa\u011flay\u0131c\u0131s\u0131n\u0131n ayarlar\u0131ndan &#8220;Confirm email&#8221; se\u00e7ene\u011fini etkinle\u015ftirebilirsiniz. Bu, kullan\u0131c\u0131lar kaydolduktan sonra e-posta adreslerini do\u011frulamalar\u0131n\u0131 gerektirir.<\/p>\n<p>Sosyal medya ile giri\u015f yapmak istiyorsan\u0131z (\u00f6rn. Google, GitHub), ilgili sa\u011flay\u0131c\u0131y\u0131 etkinle\u015ftirip gerekli API anahtarlar\u0131n\u0131 ve geri arama (callback) URL&#8217;lerini yap\u0131land\u0131rman\u0131z gerekir. Bu i\u015flem, genellikle ilgili sa\u011flay\u0131c\u0131n\u0131n geli\u015ftirici konsolundan bir uygulama olu\u015fturmay\u0131 ve Supabase&#8217;e Client ID ile Client Secret&#8217;\u0131 sa\u011flamay\u0131 i\u00e7erir.<\/p>\n<h3>SolidJS Uygulamas\u0131 Olu\u015fturma ve Supabase Entegrasyonu<\/h3>\n<p>Supabase projemizi haz\u0131rlad\u0131\u011f\u0131m\u0131za g\u00f6re, \u015fimdi SolidJS uygulamam\u0131z\u0131 olu\u015ftural\u0131m ve Supabase istemcisini entegre edelim.<\/p>\n<h4>Yeni SolidJS Uygulamas\u0131 Olu\u015fturma<\/h4>\n<p>Vite kullanarak h\u0131zl\u0131ca yeni bir SolidJS projesi olu\u015fturabiliriz. Terminalinizde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">npm create vite@latest my-solid-auth-app -- --template solid\ncd my-solid-auth-app\nnpm install<\/code><\/pre>\n<p>Bu komut, <code>my-solid-auth-app<\/code> ad\u0131nda yeni bir SolidJS projesi olu\u015fturacak ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fckleyecektir.<\/p>\n<h4>Gerekli Paketleri Y\u00fckleme<\/h4>\n<p>Supabase ile etkile\u015fim kurmak i\u00e7in <code>@supabase\/supabase-js<\/code> paketini y\u00fcklememiz gerekiyor:<\/p>\n<pre><code class=\"language-bash\">npm install @supabase\/supabase-js<\/code><\/pre>\n<h4>Supabase \u0130stemcisini Yap\u0131land\u0131rma<\/h4>\n<p>Uygulamam\u0131z\u0131n herhangi bir yerinden Supabase&#8217;e kolayca eri\u015febilmek i\u00e7in Supabase istemcisini merkezi bir yerde ba\u015flatmal\u0131 ve yap\u0131land\u0131rmal\u0131y\u0131z. Genellikle bu i\u015flem, projenizin k\u00f6k dizininde veya bir <code>src\/lib<\/code> klas\u00f6r\u00fc i\u00e7inde <code>supabaseClient.js<\/code> veya <code>supabase.js<\/code> gibi bir dosyada yap\u0131l\u0131r.<\/p>\n<p>Supabase API anahtarlar\u0131m\u0131z\u0131 do\u011frudan kod i\u00e7ine yazmak yerine, g\u00fcvenlik amac\u0131yla ortam de\u011fi\u015fkenleri (environment variables) kullanmak en iyi y\u00f6ntemdir. Bunun i\u00e7in projenizin k\u00f6k dizininde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve Supabase URL&#8217;nizi ve anon public anahtar\u0131n\u0131z\u0131 buraya ekleyin:<\/p>\n<pre><code class=\"language-env\">VITE_SUPABASE_URL=\"https:\/\/your-project-ref.supabase.co\"\nVITE_SUPABASE_ANON_KEY=\"your-anon-public-key\"<\/code><\/pre>\n<p>Vite, ortam de\u011fi\u015fkenlerini <code>VITE_<\/code> \u00f6nekiyle ba\u015flayan de\u011fi\u015fkenler olarak otomatik olarak y\u00fckler ve istemci taraf\u0131nda eri\u015filebilir hale getirir. \u015eimdi, <code>src\/supabaseClient.js<\/code> (veya benzeri) dosyas\u0131n\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">import { createClient } from '@supabase\/supabase-js';\n\nconst supabaseUrl = import.meta.env.VITE_SUPABASE_URL;\nconst supabaseAnonKey = import.meta.env.VITE_SUPABASE_ANON_KEY;\n\nexport const supabase = createClient(supabaseUrl, supabaseAnonKey);<\/code><\/pre>\n<p>Art\u0131k <code>supabase<\/code> nesnesini uygulaman\u0131z\u0131n herhangi bir yerinde i\u00e7e aktararak Supabase API&#8217;sine eri\u015febilirsiniz.<\/p>\n<h3>Temel Kimlik Do\u011frulama Ak\u0131\u015f\u0131<\/h3>\n<p>\u015eimdi s\u0131ra geldi kullan\u0131c\u0131lar\u0131n uygulamam\u0131zda kay\u0131t olmas\u0131na, giri\u015f yapmas\u0131na ve \u00e7\u0131k\u0131\u015f yapmas\u0131na olanak tan\u0131yan temel kimlik do\u011frulama ak\u0131\u015flar\u0131n\u0131 uygulamaya.<\/p>\n<h4>Kay\u0131t Olma (Sign Up)<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n e-posta ve \u015fifre ile kaydolmas\u0131n\u0131 sa\u011flamak i\u00e7in bir kay\u0131t formu olu\u015ftural\u0131m.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Auth.jsx\nimport { createSignal } from 'solid-js';\nimport { supabase } from '..\/supabaseClient';\n\nfunction Auth() {\n  const [loading, setLoading] = createSignal(false);\n  const [email, setEmail] = createSignal('');\n  const [password, setPassword] = createSignal('');\n  const [message, setMessage] = createSignal('');\n\n  const handleSignUp = async (e) => {\n    e.preventDefault();\n    setLoading(true);\n    setMessage('');\n\n    try {\n      const { error } = await supabase.auth.signUp({\n        email: email(),\n        password: password(),\n      });\n\n      if (error) throw error;\n      setMessage('Kay\u0131t ba\u015far\u0131l\u0131! L\u00fctfen e-postan\u0131z\u0131 kontrol edin ve onaylay\u0131n.');\n    } catch (error) {\n      setMessage(<code>Hata: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2>Kay\u0131t Ol<\/h2>\n      <form onSubmit={handleSignUp}>\n        <div>\n          <label for=\"email\">E-posta:<\/label>\n          <input\n            id=\"email\"\n            type=\"email\"\n            placeholder=\"E-posta adresiniz\"\n            value={email()}\n            onInput={(e) => setEmail(e.target.value)}\n            required\n          \/>\n        <\/div>\n        <div>\n          <label for=\"password\">\u015eifre:<\/label>\n          <input\n            id=\"password\"\n            type=\"password\"\n            placeholder=\"\u015eifreniz\"\n            value={password()}\n            onInput={(e) => setPassword(e.target.value)}\n            required\n          \/>\n        <\/div>\n        <button type=\"submit\" disabled={loading()}>\n          {loading() ? 'Y\u00fckleniyor...' : 'Kay\u0131t Ol'}\n        <\/button>\n      <\/form>\n      {message() && <p>{message()}<\/p>}\n    <\/div>\n  );\n}\n\nexport default Auth;<\/code><\/pre>\n<p>Bu bile\u015fen, e-posta ve \u015fifre alanlar\u0131 i\u00e7eren basit bir form sunar. <code>handleSignUp<\/code> fonksiyonu, <code>supabase.auth.signUp<\/code> metodunu kullanarak Supabase&#8217;e yeni bir kullan\u0131c\u0131 kaydeder. E\u011fer Supabase&#8217;de e-posta onay\u0131 etkinse, kullan\u0131c\u0131ya bir onay e-postas\u0131 g\u00f6nderilir ve uygulama i\u00e7inde buna dair bir mesaj g\u00f6sterilir.<\/p>\n<h4>Giri\u015f Yapma (Sign In)<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n uygulamaya giri\u015f yapabilmeleri i\u00e7in benzer bir giri\u015f formu olu\u015fturaca\u011f\u0131z. Supabase, e-posta ve \u015fifre ile giri\u015f i\u00e7in <code>signInWithPassword<\/code> metodunu sunar.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Auth.jsx i\u00e7inde devam\n\/\/ ... (Auth bile\u015feninin \u00fcst k\u0131sm\u0131)\n\n  const handleSignIn = async (e) => {\n    e.preventDefault();\n    setLoading(true);\n    setMessage('');\n\n    try {\n      const { error } = await supabase.auth.signInWithPassword({\n        email: email(),\n        password: password(),\n      });\n\n      if (error) throw error;\n      setMessage('Giri\u015f ba\u015far\u0131l\u0131!');\n      \/\/ Ba\u015far\u0131l\u0131 giri\u015fte kullan\u0131c\u0131y\u0131 y\u00f6nlendirme yap\u0131labilir\n    } catch (error) {\n      setMessage(<code>Hata: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      {\/<em> Kay\u0131t Ol formu <\/em>\/}\n      <h2>Giri\u015f Yap<\/h2>\n      <form onSubmit={handleSignIn}>\n        {\/<em> E-posta ve \u015fifre inputlar\u0131 ayn\u0131 kal\u0131r <\/em>\/}\n        <div>\n          <label for=\"email-signin\">E-posta:<\/label>\n          <input\n            id=\"email-signin\"\n            type=\"email\"\n            placeholder=\"E-posta adresiniz\"\n            value={email()}\n            onInput={(e) => setEmail(e.target.value)}\n            required\n          \/>\n        <\/div>\n        <div>\n          <label for=\"password-signin\">\u015eifre:<\/label>\n          <input\n            id=\"password-signin\"\n            type=\"password\"\n            placeholder=\"\u015eifreniz\"\n            value={password()}\n            onInput={(e) => setPassword(e.target.value)}\n            required\n          \/>\n        <\/div>\n        <button type=\"submit\" disabled={loading()}>\n          {loading() ? 'Y\u00fckleniyor...' : 'Giri\u015f Yap'}\n        <\/button>\n      <\/form>\n      {message() && <p>{message()}<\/p>}\n    <\/div>\n  );\n}\n\nexport default Auth;<\/code><\/pre>\n<p>Bu \u00f6rnekte, <code>Auth<\/code> bile\u015feni hem kay\u0131t hem de giri\u015f formlar\u0131n\u0131 i\u00e7eriyor. Ger\u00e7ek bir uygulamada, bu formlar\u0131 ayr\u0131 bile\u015fenlere ay\u0131rmak ve bir y\u00f6nlendirme (routing) sistemi ile ge\u00e7i\u015f yapmak daha iyi bir yakla\u015f\u0131m olacakt\u0131r.<\/p>\n<h4>\u00c7\u0131k\u0131\u015f Yapma (Sign Out)<\/h4>\n<p>Kullan\u0131c\u0131lar\u0131n oturumlar\u0131n\u0131 sonland\u0131rmalar\u0131 i\u00e7in basit bir \u00e7\u0131k\u0131\u015f butonu ekleyelim. Bu i\u015flem, <code>supabase.auth.signOut<\/code> metodu ile ger\u00e7ekle\u015ftirilir.<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Account.jsx\nimport { createSignal, onMount } from 'solid-js';\nimport { supabase } from '..\/supabaseClient';\n\nfunction Account() {\n  const [loading, setLoading] = createSignal(false);\n  const [user, setUser] = createSignal(null);\n\n  onMount(async () => {\n    const { data: { user } } = await supabase.auth.getUser();\n    setUser(user);\n  });\n\n  const handleSignOut = async () => {\n    setLoading(true);\n    try {\n      const { error } = await supabase.auth.signOut();\n      if (error) throw error;\n      \/\/ Kullan\u0131c\u0131y\u0131 giri\u015f sayfas\u0131na y\u00f6nlendirme veya durumu g\u00fcncelleme\n    } catch (error) {\n      console.error('\u00c7\u0131k\u0131\u015f yaparken hata olu\u015ftu:', error.message);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2>Hesab\u0131m<\/h2>\n      {user() ? (\n        <>\n          <p>Ho\u015f geldiniz, {user().email}!<\/p>\n          <button onClick={handleSignOut} disabled={loading()}>\n            {loading() ? '\u00c7\u0131k\u0131\u015f Yap\u0131l\u0131yor...' : '\u00c7\u0131k\u0131\u015f Yap'}\n          <\/button>\n        <\/>\n      ) : (\n        <p>Giri\u015f yapmad\u0131n\u0131z.<\/p>\n      )}\n    <\/div>\n  );\n}\n\nexport default Account;<\/code><\/pre>\n<p>Bu <code>Account<\/code> bile\u015feni, mevcut kullan\u0131c\u0131y\u0131 g\u00f6sterir ve bir \u00e7\u0131k\u0131\u015f butonu sunar. <code>onMount<\/code> kullanarak bile\u015fen y\u00fcklendi\u011finde mevcut kullan\u0131c\u0131 bilgisini al\u0131r\u0131z.<\/p>\n<h3>Kullan\u0131c\u0131 Oturumunu Y\u00f6netme<\/h3>\n<p>Bir kullan\u0131c\u0131n\u0131n oturum durumunu (giri\u015f yapm\u0131\u015f m\u0131, kimdir?) uygulaman\u0131n genelinde takip etmek ve buna g\u00f6re UI&#8217;\u0131 g\u00fcncellemek kritik \u00f6neme sahiptir. SolidJS&#8217;in reaktif yap\u0131s\u0131 ve Supabase&#8217;in oturum dinleyicileri bu s\u00fcreci olduk\u00e7a kolayla\u015ft\u0131r\u0131r.<\/p>\n<h4><code>supabase.auth.onAuthStateChange<\/code> Dinleyicisi<\/h4>\n<p>Supabase, kimlik do\u011frulama durumundaki de\u011fi\u015fiklikleri dinlemek i\u00e7in <code>onAuthStateChange<\/code> metodunu sa\u011flar. Bu metod, oturum a\u00e7ma, oturum kapatma, jeton yenileme gibi olaylarda tetiklenir.<\/p>\n<pre><code class=\"language-javascript\">\/\/ src\/AuthContext.jsx\nimport { createContext, useContext, createSignal, onMount, onCleanup } from 'solid-js';\nimport { supabase } from '.\/supabaseClient';\n\nconst AuthContext = createContext();\n\nexport function AuthProvider(props) {\n  const [session, setSession] = createSignal(null);\n  const [user, setUser] = createSignal(null);\n  const [loading, setLoading] = createSignal(true);\n\n  onMount(() => {\n    supabase.auth.getSession().then(({ data: { session } }) => {\n      setSession(session);\n      setUser(session?.user || null);\n      setLoading(false);\n    });\n\n    const { data: authListener } = supabase.auth.onAuthStateChange(\n      (event, currentSession) => {\n        setSession(currentSession);\n        setUser(currentSession?.user || null);\n        setLoading(false);\n      }\n    );\n\n    onCleanup(() => {\n      authListener.subscription.unsubscribe();\n    });\n  });\n\n  const store = {\n    session,\n    user,\n    loading,\n    \/\/ Di\u011fer auth i\u015flemleri burada sa\u011flanabilir\n  };\n\n  return (\n    <AuthContext.Provider value={store}>\n      {props.children}\n    <\/AuthContext.Provider>\n  );\n}\n\nexport function useAuth() {\n  return useContext(AuthContext);\n}<\/code><\/pre>\n<p>Bu <code>AuthProvider<\/code> bile\u015feni:<br \/>\n1.  <code>createContext<\/code> kullanarak bir ba\u011flam (Context) olu\u015fturur.<br \/>\n2.  <code>createSignal<\/code> ile <code>session<\/code>, <code>user<\/code> ve <code>loading<\/code> durumlar\u0131n\u0131 tutar.<br \/>\n3.  <code>onMount<\/code> i\u00e7inde, ilk olarak mevcut oturumu Supabase&#8217;den al\u0131r.<br \/>\n4.  Ard\u0131ndan <code>supabase.auth.onAuthStateChange<\/code> metodunu kullanarak oturum de\u011fi\u015fikliklerini dinlemeye ba\u015flar. Her de\u011fi\u015fiklikte <code>session<\/code> ve <code>user<\/code> sinyallerini g\u00fcnceller.<br \/>\n5.  <code>onCleanup<\/code> kullanarak bile\u015fen DOM&#8217;dan kald\u0131r\u0131ld\u0131\u011f\u0131nda dinleyiciyi temizler, bellek s\u0131z\u0131nt\u0131lar\u0131n\u0131 \u00f6nler.<br \/>\n6.  <code>AuthContext.Provider<\/code> arac\u0131l\u0131\u011f\u0131yla <code>session<\/code>, <code>user<\/code> ve <code>loading<\/code> durumlar\u0131n\u0131 alt bile\u015fenlere sa\u011flar.<br \/>\n7.  <code>useAuth<\/code> hook&#8217;u, bu ba\u011flama kolayca eri\u015fim sa\u011flar.<\/p>\n<p>Uygulaman\u0131z\u0131n k\u00f6k bile\u015fenini (genellikle <code>App.jsx<\/code> veya <code>index.jsx<\/code>) bu <code>AuthProvider<\/code> ile sarmalaman\u0131z gerekir:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/App.jsx\nimport { AuthProvider } from '.\/AuthContext';\nimport Auth from '.\/components\/Auth';\nimport Account from '.\/components\/Account';\n\nfunction App() {\n  return (\n    <AuthProvider>\n      <header>\n        \n      <\/header>\n      <main>\n        <Auth \/>\n        <Account \/>\n      <\/main>\n    <\/AuthProvider>\n  );\n}\n\nexport default App;<\/code><\/pre>\n<p>Art\u0131k uygulaman\u0131z\u0131n herhangi bir yerinde <code>useAuth<\/code> hook&#8217;unu kullanarak mevcut oturum ve kullan\u0131c\u0131 bilgilerine eri\u015febilirsiniz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/SomeComponent.jsx\nimport { useAuth } from '..\/AuthContext';\n\nfunction SomeComponent() {\n  const { user, loading } = useAuth();\n\n  return (\n    <div>\n      {loading() ? (\n        <p>Y\u00fckleniyor...<\/p>\n      ) : user() ? (\n        <p>Ho\u015f geldiniz, {user().email}!<\/p>\n      ) : (\n        <p>L\u00fctfen giri\u015f yap\u0131n.<\/p>\n      )}\n    <\/div>\n  );\n}<\/code><\/pre>\n<h3>Korunan Rotalar (Protected Routes)<\/h3>\n<p>\u00c7o\u011fu uygulamada, belirli sayfalar\u0131n yaln\u0131zca oturum a\u00e7m\u0131\u015f kullan\u0131c\u0131lar taraf\u0131ndan eri\u015filebilir olmas\u0131 gerekir. SolidJS y\u00f6nlendirme k\u00fct\u00fcphanesi (\u00f6rne\u011fin Solid Router) kullanarak korunan rotalar\u0131 kolayca uygulayabiliriz.<\/p>\n<p>\u00d6nce Solid Router&#8217;\u0131 kural\u0131m:<\/p>\n<pre><code class=\"language-bash\">npm install @solidjs\/router<\/code><\/pre>\n<p>Ard\u0131ndan, korunan bir rota bile\u015feni olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/PrivateRoute.jsx\nimport { Navigate } from '@solidjs\/router';\nimport { useAuth } from '..\/AuthContext';\n\nfunction PrivateRoute(props) {\n  const { user, loading } = useAuth();\n\n  if (loading()) {\n    return <p>Y\u00fckleniyor...<\/p>; \/\/ Y\u00fckleme durumunu g\u00f6ster\n  }\n\n  if (!user()) {\n    \/\/ Kullan\u0131c\u0131 oturum a\u00e7mam\u0131\u015fsa giri\u015f sayfas\u0131na y\u00f6nlendir\n    return <Navigate href=\"\/login\" \/>;\n  }\n\n  \/\/ Kullan\u0131c\u0131 oturum a\u00e7m\u0131\u015fsa, \u00e7ocuk bile\u015fenleri render et\n  return <>{props.children}<\/>;\n}\n\nexport default PrivateRoute;<\/code><\/pre>\n<p>\u015eimdi <code>App.jsx<\/code> dosyam\u0131z\u0131 g\u00fcncelleyerek y\u00f6nlendirmeyi ve korunan rotalar\u0131 ekleyelim:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/App.jsx\nimport { AuthProvider, useAuth } from '.\/AuthContext';\nimport { Router, Routes, Route, A } from '@solidjs\/router';\nimport Auth from '.\/components\/Auth';\nimport Account from '.\/components\/Account';\nimport Home from '.\/components\/Home'; \/\/ Yeni Home bile\u015feni\nimport PrivateRoute from '.\/components\/PrivateRoute';\n\nfunction AppRoutes() {\n  const { user, loading, session } = useAuth(); \/\/ AuthContext'ten user ve loading al\n\n  return (\n    <>\n      <nav>\n        <A href=\"\/\">Ana Sayfa<\/A>\n        {!loading() && (\n          session() ? (\n            <>\n              <A href=\"\/account\">Hesab\u0131m<\/A>\n              {\/<em> \u00c7\u0131k\u0131\u015f butonu burada veya Account bile\u015feninde olabilir <\/em>\/}\n            <\/>\n          ) : (\n            <A href=\"\/login\">Giri\u015f \/ Kay\u0131t<\/A>\n          )\n        )}\n      <\/nav>\n      <main>\n        <Routes>\n          <Route path=\"\/\" component={Home} \/>\n          <Route path=\"\/login\" component={Auth} \/>\n          <Route\n            path=\"\/account\"\n            element={\n              <PrivateRoute>\n                <Account \/>\n              <\/PrivateRoute>\n            }\n          \/>\n          {\/<em> Di\u011fer rotalar <\/em>\/}\n        <\/Routes>\n      <\/main>\n    <\/>\n  );\n}\n\nfunction App() {\n  return (\n    <AuthProvider>\n      <Router>\n        <AppRoutes \/>\n      <\/Router>\n    <\/AuthProvider>\n  );\n}\n\nexport default App;\n\n\/\/ src\/components\/Home.jsx\nfunction Home() {\n  return <h2>Ana Sayfa<\/h2>;\n}<\/code><\/pre>\n<p>Bu yap\u0131land\u0131rma ile <code>\/account<\/code> rotas\u0131na eri\u015fmek isteyen bir kullan\u0131c\u0131, e\u011fer oturum a\u00e7mam\u0131\u015fsa otomatik olarak <code>\/login<\/code> sayfas\u0131na y\u00f6nlendirilecektir.<\/p>\n<h3>Kullan\u0131c\u0131 Verilerine Eri\u015fim ve Y\u00f6netim<\/h3>\n<p>Supabase Auth, temel kullan\u0131c\u0131 bilgilerini (UUID, e-posta, olu\u015fturma tarihi vb.) <code>auth.users<\/code> tablosunda saklar. Ancak, kullan\u0131c\u0131lar\u0131n profil resimleri, kullan\u0131c\u0131 adlar\u0131 veya di\u011fer \u00f6zel bilgileri gibi ek verileri genellikle ayr\u0131 bir veritaban\u0131 tablosunda saklamak istenir.<\/p>\n<h4><code>profiles<\/code> Tablosu Olu\u015fturma<\/h4>\n<p>Supabase kontrol panelinizdeki &#8220;Table Editor&#8221; (Tablo D\u00fczenleyici) b\u00f6l\u00fcm\u00fcne giderek yeni bir tablo olu\u015ftural\u0131m:<\/p>\n<p>*   <strong>Table name:<\/strong> <code>profiles<\/code><br \/>\n*   <strong>Columns:<\/strong><br \/>\n    *   <code>id<\/code>: <code>uuid<\/code> tipinde, <code>Primary Key<\/code> ve <code>is unique<\/code> olarak i\u015faretleyin. Varsay\u0131lan de\u011fer olarak <code>auth.uid()<\/code> fonksiyonunu ayarlay\u0131n. Bu, yeni bir kullan\u0131c\u0131 kaydoldu\u011funda <code>profiles<\/code> tablosuna otomatik olarak bir giri\u015f eklenmesini sa\u011flar ve <code>id<\/code>&#8216;yi kullan\u0131c\u0131n\u0131n Supabase Auth UUID&#8217;si ile e\u015fle\u015ftirir.<br \/>\n    *   <code>username<\/code>: <code>text<\/code> tipinde, <code>is unique<\/code> olabilir.<br \/>\n    *   <code>avatar_url<\/code>: <code>text<\/code> tipinde.<br \/>\n    *   <code>updated_at<\/code>: <code>timestampz<\/code> tipinde, varsay\u0131lan olarak <code>now()<\/code>.<\/p>\n<h4>Row Level Security (RLS) Politikalar\u0131<\/h4>\n<p><code>profiles<\/code> tablosundaki verilere g\u00fcvenli bir \u015fekilde eri\u015fmek ve bunlar\u0131 y\u00f6netmek i\u00e7in RLS (Sat\u0131r Seviyesi G\u00fcvenli\u011fi) politikalar\u0131n\u0131 etkinle\u015ftirmemiz ve yap\u0131land\u0131rmam\u0131z gerekir. Supabase, yeni bir tablo olu\u015fturdu\u011funuzda RLS&#8217;yi varsay\u0131lan olarak kapal\u0131 tutar. <code>profiles<\/code> tablonuzun ayarlar\u0131ndan &#8220;Enable Row Level Security&#8221; se\u00e7ene\u011fini etkinle\u015ftirin.<\/p>\n<p>Ard\u0131ndan, a\u015fa\u011f\u0131daki politikalar\u0131 ekleyin:<\/p>\n<p>1.  <strong>Select Policy (Okuma):<\/strong> Herkes kendi profilini okuyabilir.<br \/>\n    *   <strong>Name:<\/strong> <code>Enable read access for all users<\/code><br \/>\n    *   <strong>For operations:<\/strong> <code>SELECT<\/code><br \/>\n    *   <strong>Using expression:<\/strong> <code>auth.uid() = id<\/code><br \/>\n    *   Bu politika, yaln\u0131zca oturum a\u00e7m\u0131\u015f bir kullan\u0131c\u0131n\u0131n kendi profil verilerini okumas\u0131na izin verir. Anonim kullan\u0131c\u0131lar profil verilerini okuyamaz.<\/p>\n<p>2.  <strong>Insert Policy (Ekleme):<\/strong> Kullan\u0131c\u0131lar kendi profillerini olu\u015fturabilir.<br \/>\n    *   <strong>Name:<\/strong> <code>Enable insert for authenticated users only<\/code><br \/>\n    *   <strong>For operations:<\/strong> <code>INSERT<\/code><br \/>\n    *   <strong>With check expression:<\/strong> <code>auth.uid() = id<\/code><br \/>\n    *   Bu politika, yeni bir kullan\u0131c\u0131 kaydoldu\u011funda ve <code>profiles<\/code> tablosuna otomatik olarak bir giri\u015f eklendi\u011finde (id alan\u0131 <code>auth.uid()<\/code> ile varsay\u0131lan olarak ayarland\u0131\u011f\u0131 i\u00e7in) veya kullan\u0131c\u0131 istemci taraf\u0131nda kendi profilini olu\u015fturmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>3.  <strong>Update Policy (G\u00fcncelleme):<\/strong> Kullan\u0131c\u0131lar kendi profillerini g\u00fcncelleyebilir.<br \/>\n    *   <strong>Name:<\/strong> <code>Enable update for users based on id<\/code><br \/>\n    *   <strong>For operations:<\/strong> <code>UPDATE<\/code><br \/>\n    *   <strong>Using expression:<\/strong> <code>auth.uid() = id<\/code><br \/>\n    *   Bu politika, bir kullan\u0131c\u0131n\u0131n yaln\u0131zca kendi profil verilerini g\u00fcncellemesine izin verir.<\/p>\n<p>Bu politikalar, kullan\u0131c\u0131lar\u0131n yaln\u0131zca kendi verileri \u00fczerinde i\u015flem yapabilmesini sa\u011flayarak uygulaman\u0131z\u0131n g\u00fcvenli\u011fini art\u0131r\u0131r.<\/p>\n<h4>Profil Verilerini Y\u00f6netme<\/h4>\n<p><code>Account<\/code> bile\u015fenimizde kullan\u0131c\u0131 profil bilgilerini g\u00f6sterebilir ve g\u00fcncelleyebiliriz:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Account.jsx i\u00e7inde devam\nimport { createSignal, onMount, createEffect } from 'solid-js';\nimport { supabase } from '..\/supabaseClient';\nimport { useAuth } from '..\/AuthContext';\n\nfunction Account() {\n  const { user, session } = useAuth(); \/\/ AuthContext'ten user ve session al\n  const [loading, setLoading] = createSignal(true);\n  const [username, setUsername] = createSignal(null);\n  const [website, setWebsite] = createSignal(null);\n  const [avatarUrl, setAvatarUrl] = createSignal(null);\n  const [message, setMessage] = createSignal('');\n\n  \/\/ user sinyali de\u011fi\u015fti\u011finde profili getir\n  createEffect(async () => {\n    if (user()) {\n      await getProfile();\n    } else {\n      \/\/ Kullan\u0131c\u0131 \u00e7\u0131k\u0131\u015f yapt\u0131\u011f\u0131nda veya oturum yoksa formu temizle\n      setUsername(null);\n      setWebsite(null);\n      setAvatarUrl(null);\n      setLoading(false);\n    }\n  });\n\n  const getProfile = async () => {\n    try {\n      setLoading(true);\n      setMessage('');\n      if (!user()) throw new Error('Kullan\u0131c\u0131 bulunamad\u0131!');\n\n      let { data, error, status } = await supabase\n        .from('profiles')\n        .select(<code>username, website, avatar_url<\/code>)\n        .eq('id', user().id)\n        .single();\n\n      if (error && status !== 406) {\n        throw error;\n      }\n\n      if (data) {\n        setUsername(data.username);\n        setWebsite(data.website);\n        setAvatarUrl(data.avatar_url);\n      }\n    } catch (error) {\n      setMessage(<code>Profil bilgileri al\u0131n\u0131rken hata olu\u015ftu: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const updateProfile = async (e) => {\n    e.preventDefault();\n    setLoading(true);\n    setMessage('');\n\n    try {\n      if (!user()) throw new Error('Kullan\u0131c\u0131 bulunamad\u0131!');\n\n      const updates = {\n        id: user().id,\n        username: username(),\n        website: website(),\n        avatar_url: avatarUrl(),\n        updated_at: new Date().toISOString(),\n      };\n\n      let { error } = await supabase.from('profiles').upsert(updates);\n      if (error) throw error;\n      setMessage('Profil ba\u015far\u0131yla g\u00fcncellendi!');\n    } catch (error) {\n      setMessage(<code>Profil g\u00fcncellenirken hata olu\u015ftu: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  const handleSignOut = async () => {\n    setLoading(true);\n    try {\n      const { error } = await supabase.auth.signOut();\n      if (error) throw error;\n      setMessage('\u00c7\u0131k\u0131\u015f ba\u015far\u0131l\u0131!');\n    } catch (error) {\n      setMessage(<code>\u00c7\u0131k\u0131\u015f yaparken hata olu\u015ftu: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      <h2>Hesab\u0131m<\/h2>\n      {loading() ? (\n        <p>Y\u00fckleniyor...<\/p>\n      ) : user() ? (\n        <form onSubmit={updateProfile}>\n          <div>\n            <label for=\"email\">E-posta<\/label>\n            <input id=\"email\" type=\"text\" value={user().email} disabled \/>\n          <\/div>\n          <div>\n            <label for=\"username\">Kullan\u0131c\u0131 Ad\u0131<\/label>\n            <input\n              id=\"username\"\n              type=\"text\"\n              value={username() || ''}\n              onInput={(e) => setUsername(e.target.value)}\n            \/>\n          <\/div>\n          <div>\n            <label for=\"website\">Web Sitesi<\/label>\n            <input\n              id=\"website\"\n              type=\"url\"\n              value={website() || ''}\n              onInput={(e) => setWebsite(e.target.value)}\n            \/>\n          <\/div>\n          <button type=\"submit\" disabled={loading()}>\n            {loading() ? 'G\u00fcncelleniyor...' : 'Profili G\u00fcncelle'}\n          <\/button>\n          <button type=\"button\" onClick={handleSignOut} disabled={loading()}>\n            \u00c7\u0131k\u0131\u015f Yap\n          <\/button>\n          {message() && <p>{message()}<\/p>}\n        <\/form>\n      ) : (\n        <p>L\u00fctfen giri\u015f yap\u0131n.<\/p>\n      )}\n    <\/div>\n  );\n}\n\nexport default Account;<\/code><\/pre>\n<p>Bu <code>Account<\/code> bile\u015feni, <code>useAuth<\/code> hook&#8217;unu kullanarak mevcut kullan\u0131c\u0131y\u0131 al\u0131r. <code>createEffect<\/code> ile kullan\u0131c\u0131 de\u011fi\u015fti\u011finde veya bile\u015fen y\u00fcklendi\u011finde profil verilerini Supabase&#8217;den getirir. Kullan\u0131c\u0131 ad\u0131n\u0131 ve web sitesini g\u00fcncellemek i\u00e7in bir form sunar ve <code>supabase.from('profiles').upsert<\/code> metodunu kullanarak veritaban\u0131ndaki <code>profiles<\/code> tablosunu g\u00fcnceller.<\/p>\n<h3>Sosyal Medya ile Kimlik Do\u011frulama<\/h3>\n<p>Supabase, Google, GitHub, Facebook gibi bir\u00e7ok OAuth sa\u011flay\u0131c\u0131s\u0131 ile kimlik do\u011frulamay\u0131 destekler. Bu, kullan\u0131c\u0131lar i\u00e7in daha h\u0131zl\u0131 ve kolay bir giri\u015f deneyimi sunar.<\/p>\n<h4>Supabase Ayarlar\u0131nda Sa\u011flay\u0131c\u0131lar\u0131 Etkinle\u015ftirme<\/h4>\n<p>Supabase kontrol panelinizdeki &#8220;Authentication&#8221; -> &#8220;Providers&#8221; b\u00f6l\u00fcm\u00fcne gidin. Burada etkinle\u015ftirmek istedi\u011finiz sa\u011flay\u0131c\u0131y\u0131 se\u00e7in (\u00f6rne\u011fin Google). Sa\u011flay\u0131c\u0131n\u0131n ayarlar\u0131nda, genellikle bir <code>Client ID<\/code> ve <code>Client Secret<\/code> girmeniz istenir. Bu bilgileri, ilgili sa\u011flay\u0131c\u0131n\u0131n geli\u015ftirici konsolundan (\u00f6rne\u011fin Google Cloud Console) bir proje veya uygulama olu\u015fturarak alman\u0131z gerekir.<\/p>\n<p>Ayr\u0131ca, sa\u011flay\u0131c\u0131n\u0131n geri arama (callback) URL&#8217;sini Supabase projenizin &#8220;Authentication&#8221; -> &#8220;Settings&#8221; b\u00f6l\u00fcm\u00fcndeki <code>Site URL<\/code> ile veya &#8220;Providers&#8221; b\u00f6l\u00fcm\u00fcndeki sa\u011flay\u0131c\u0131n\u0131n kendi ayarlar\u0131ndaki <code>Callback URL<\/code> ile e\u015fle\u015ftirdi\u011finizden emin olun. Genellikle bu URL, Supabase projenizin URL&#8217;si ile otomatik olarak yap\u0131land\u0131r\u0131l\u0131r.<\/p>\n<h4><code>supabase.auth.signInWithOAuth<\/code> Kullan\u0131m\u0131<\/h4>\n<p>Sosyal medya ile giri\u015f yapmak i\u00e7in <code>supabase.auth.signInWithOAuth<\/code> metodunu kullan\u0131r\u0131z:<\/p>\n<pre><code class=\"language-jsx\">\/\/ src\/components\/Auth.jsx i\u00e7inde devam\n\/\/ ... (Auth bile\u015feninin \u00fcst k\u0131sm\u0131)\n\n  const handleOAuthSignIn = async (provider) => {\n    setLoading(true);\n    setMessage('');\n\n    try {\n      const { error } = await supabase.auth.signInWithOAuth({\n        provider: provider,\n        options: {\n          redirectTo: window.location.origin + '\/account', \/\/ Giri\u015f sonras\u0131 y\u00f6nlendirilecek URL\n        },\n      });\n\n      if (error) throw error;\n      \/\/ Y\u00f6nlendirme Supabase taraf\u0131ndan otomatik olarak yap\u0131l\u0131r\n    } catch (error) {\n      setMessage(<code>Hata: ${error.message}<\/code>);\n    } finally {\n      setLoading(false);\n    }\n  };\n\n  return (\n    <div>\n      {\/<em> Kay\u0131t Ol ve Giri\u015f Yap formlar\u0131 <\/em>\/}\n\n      <h2>Sosyal Medya ile Giri\u015f<\/h2>\n      <button onClick={() => handleOAuthSignIn('google')} disabled={loading()}>\n        Google ile Giri\u015f Yap\n      <\/button>\n      <button onClick={() => handleOAuthSignIn('github')} disabled={loading()}>\n        GitHub ile Giri\u015f Yap\n      <\/button>\n      {message() && <p>{message()}<\/p>}\n    <\/div>\n  );\n}<\/code><\/pre>\n<p>Bu kod par\u00e7as\u0131, Google ve GitHub ile giri\u015f yapmak i\u00e7in iki d\u00fc\u011fme ekler. <code>handleOAuthSignIn<\/code> fonksiyonu, <code>signInWithOAuth<\/code> metodunu \u00e7a\u011f\u0131rarak kullan\u0131c\u0131y\u0131 se\u00e7ilen sa\u011flay\u0131c\u0131n\u0131n kimlik do\u011frulama sayfas\u0131na y\u00f6nlendirir. Ba\u015far\u0131l\u0131 kimlik do\u011frulamas\u0131ndan sonra, kullan\u0131c\u0131 <code>redirectTo<\/code> se\u00e7ene\u011finde belirtilen URL&#8217;ye geri y\u00f6nlendirilir ve Supabase oturumunu otomatik olarak y\u00f6netir.<\/p>\n<h3>Hata Y\u00f6netimi ve Kullan\u0131c\u0131 Deneyimi<\/h3>\n<p>Sa\u011flam bir uygulama geli\u015ftirmek i\u00e7in hata y\u00f6netimi ve kullan\u0131c\u0131ya geri bildirim sa\u011flamak \u00e7ok \u00f6nemlidir.<\/p>\n<p>*   <strong><code>try-catch<\/code> Bloklar\u0131:<\/strong> T\u00fcm asenkron Supabase i\u015flemlerini <code>try-catch<\/code> bloklar\u0131 i\u00e7ine al\u0131n. Bu, a\u011f hatalar\u0131n\u0131 veya API&#8217;den d\u00f6nen hatalar\u0131 yakalaman\u0131z\u0131 sa\u011flar.<br \/>\n*   <strong>Kullan\u0131c\u0131ya Geri Bildirim:<\/strong> Hata mesajlar\u0131n\u0131 veya ba\u015far\u0131 bildirimlerini (\u00f6rne\u011fin, bir toast mesaj\u0131 k\u00fct\u00fcphanesi kullanarak) kullan\u0131c\u0131ya anla\u015f\u0131l\u0131r bir \u015fekilde g\u00f6sterin. Makaledeki \u00f6rneklerde <code>message<\/code> sinyali bu ama\u00e7la kullan\u0131lm\u0131\u015ft\u0131r.<br \/>\n*   <strong>Y\u00fckleme Durumlar\u0131:<\/strong> Uzun s\u00fcrebilecek i\u015flemler s\u0131ras\u0131nda (API \u00e7a\u011fr\u0131lar\u0131 gibi) kullan\u0131c\u0131ya bir y\u00fckleme g\u00f6stergesi (spinner, &#8220;Y\u00fckleniyor&#8230;&#8221; metni) sunun. Bu, kullan\u0131c\u0131n\u0131n uygulaman\u0131n donmad\u0131\u011f\u0131n\u0131 anlamas\u0131n\u0131 sa\u011flar. <code>loading<\/code> sinyali bu ama\u00e7la kullan\u0131lm\u0131\u015ft\u0131r.<br \/>\n*   <strong>Form Do\u011frulama:<\/strong> Form alanlar\u0131n\u0131n ge\u00e7erlili\u011fini istemci taraf\u0131nda do\u011frulay\u0131n (\u00f6rn. e-posta format\u0131, \u015fifre uzunlu\u011fu).<\/p>\n<h3>G\u00fcvenlik \u0130pu\u00e7lar\u0131<\/h3>\n<p>Supabase ile \u00e7al\u0131\u015f\u0131rken g\u00fcvenli\u011fi g\u00f6z \u00f6n\u00fcnde bulundurman\u0131z gereken birka\u00e7 \u00f6nemli nokta vard\u0131r:<\/p>\n<p>*   <strong>Ortam De\u011fi\u015fkenleri:<\/strong> API anahtarlar\u0131n\u0131z\u0131 ve di\u011fer hassas bilgileri asla do\u011frudan kod i\u00e7ine yazmay\u0131n. Her zaman ortam de\u011fi\u015fkenleri kullan\u0131n (<code>.env<\/code> dosyalar\u0131 gibi).<br \/>\n*   <strong>Row Level Security (RLS):<\/strong> Veritaban\u0131 tablolar\u0131n\u0131zda RLS&#8217;yi her zaman etkinle\u015ftirin ve uygun politikalar\u0131 uygulay\u0131n. Bu, yetkisiz kullan\u0131c\u0131lar\u0131n verilere eri\u015fmesini veya de\u011fi\u015ftirmesini engeller.<br \/>\n*   <strong><code>anon public<\/code> Anahtar\u0131:<\/strong> Bu anahtar istemci taraf\u0131nda g\u00fcvenle kullan\u0131labilir, ancak yaln\u0131zca genel eri\u015filebilir veriler veya oturum a\u00e7ma\/kay\u0131t gibi kimlik do\u011frulama i\u015flemleri i\u00e7in kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong><code>service_role<\/code> Anahtar\u0131:<\/strong> Bu anahtar\u0131n asla istemci taraf\u0131nda (SolidJS uygulaman\u0131zda) kullan\u0131lmad\u0131\u011f\u0131ndan emin olun. Bu anahtar, t\u00fcm RLS politikalar\u0131n\u0131 atlayabilir ve tam veritaban\u0131 eri\u015fimi sa\u011flar. Yaln\u0131zca g\u00fcvenli sunucu ortamlar\u0131nda veya Supabase fonksiyonlar\u0131nda kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>\u015eifre Politikalar\u0131:<\/strong> Supabase Auth, \u015fifre karma\u015f\u0131kl\u0131\u011f\u0131 gereksinimlerini yap\u0131land\u0131rman\u0131za olanak tan\u0131r. Kullan\u0131c\u0131lar\u0131n\u0131z\u0131n g\u00fc\u00e7l\u00fc \u015fifreler kullanmas\u0131n\u0131 te\u015fvik edin.<br \/>\n*   <strong>E-posta Onay\u0131:<\/strong> Yeni kay\u0131t olan kullan\u0131c\u0131lar\u0131n e-posta adreslerini do\u011frulamalar\u0131n\u0131 isteyerek sahte hesaplar\u0131 ve spam&#8217;\u0131 azaltabilirsiniz.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Bu makalede, SolidJS&#8217;in reaktif yap\u0131s\u0131 ile Supabase&#8217;in g\u00fc\u00e7l\u00fc backend hizmetlerini birle\u015ftirerek modern bir web uygulamas\u0131nda kullan\u0131c\u0131 kimlik do\u011frulamas\u0131n\u0131 nas\u0131l entegre edece\u011fimizi ayr\u0131nt\u0131l\u0131 bir \u015fekilde inceledik. Supabase&#8217;in sundu\u011fu basit API&#8217;ler sayesinde, kay\u0131t, giri\u015f, \u00e7\u0131k\u0131\u015f, oturum y\u00f6netimi, korunan rotalar ve hatta sosyal medya ile kimlik do\u011frulama gibi karma\u015f\u0131k g\u00f6r\u00fcnen \u00f6zellikleri SolidJS uygulamam\u0131za h\u0131zla ekleyebildik.<\/p>\n<p>SolidJS&#8217;in ince taneli reaktivitesi, Supabase&#8217;in <code>onAuthStateChange<\/code> dinleyicisi ile birle\u015fti\u011finde, kullan\u0131c\u0131 oturum durumundaki de\u011fi\u015fikliklere an\u0131nda tepki veren ve UI&#8217;\u0131 sorunsuz bir \u015fekilde g\u00fcncelleyen son derece performansl\u0131 uygulamalar olu\u015fturmam\u0131z\u0131 sa\u011flar. Ayr\u0131ca, RLS politikalar\u0131 ve ortam de\u011fi\u015fkenleri gibi g\u00fcvenlik uygulamalar\u0131n\u0131 benimseyerek, kullan\u0131c\u0131 verilerini koruma alt\u0131na alman\u0131n \u00f6nemini vurgulad\u0131k.<\/p>\n<p>Bu entegrasyon, geli\u015ftiricilere hem frontend hem de backend taraf\u0131nda h\u0131zl\u0131 geli\u015ftirme ve y\u00fcksek performans sunan g\u00fc\u00e7l\u00fc bir kombinasyon sa\u011flar. Supabase&#8217;in sundu\u011fu depolama, ger\u00e7ek zamanl\u0131 abonelikler ve Edge Fonksiyonlar\u0131 gibi di\u011fer \u00f6zelliklerini ke\u015ffederek SolidJS uygulaman\u0131z\u0131n yeteneklerini daha da geni\u015fletebilirsiniz. Bu rehberin, SolidJS ve Supabase ile kimlik do\u011frulama sistemleri olu\u015fturmak isteyen geli\u015ftiriciler i\u00e7in sa\u011flam bir ba\u015flang\u0131\u00e7 noktas\u0131 olmas\u0131n\u0131 umuyoruz.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu\nSolidJS, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in performansl\u0131 ve","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-37713","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/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:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu\" \/>\n<meta property=\"og:description\" content=\"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu SolidJS, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in performansl\u0131 ve\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-13T09:41:17+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"20 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu\",\"datePublished\":\"2026-01-13T09:41:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\"},\"wordCount\":2825,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\",\"name\":\"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-13T09:41:17+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","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:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/","og_locale":"tr_TR","og_type":"article","og_title":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu","og_description":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu SolidJS, modern web uygulamalar\u0131 geli\u015ftirmek i\u00e7in performansl\u0131 ve","og_url":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-13T09:41:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"20 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu","datePublished":"2026-01-13T09:41:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/"},"wordCount":2825,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/","url":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/","name":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-13T09:41:17+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/solidjs-uygulamasinda-supabase-ile-kullanici-kimlik-dogrulama-entegrasyonu\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"SolidJS Uygulamas\u0131nda Supabase ile Kullan\u0131c\u0131 Kimlik Do\u011frulama Entegrasyonu"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37713","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=37713"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37713\/revisions"}],"predecessor-version":[{"id":37714,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37713\/revisions\/37714"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37713"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37713"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37713"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}