{"id":32731,"date":"2025-10-25T08:31:17","date_gmt":"2025-10-25T05:31:17","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/"},"modified":"2025-10-25T08:31:17","modified_gmt":"2025-10-25T05:31:17","slug":"auth-series-5-passport-js-ile-yetkilendirme-uygulamasi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/","title":{"rendered":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131"},"content":{"rendered":"<p><body><\/p>\n<p>Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware&#8217;i olan Passport.js&#8217;i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.<\/p>\n<p>Passport.js, temelde bir kimlik do\u011frulama k\u00fct\u00fcphanesi olsa da, esnek yap\u0131s\u0131 sayesinde yetkilendirme mant\u0131\u011f\u0131n\u0131 entegre etmek i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar. \u00d6zellikle Express.js tabanl\u0131 uygulamalarda yayg\u0131n olarak kullan\u0131lan Passport.js, farkl\u0131 kimlik do\u011frulama stratejilerini (yerel, OAuth, JWT vb.) tek bir \u00e7at\u0131 alt\u0131nda toplamas\u0131yla bilinir. Ancak yetkilendirme, kimlik do\u011frulamadan sonra gelen bir ad\u0131md\u0131r ve &#8220;Kimsin?&#8221; sorusundan \u00e7ok &#8220;Ne yapabilirsin?&#8221; sorusuna yan\u0131t verir. Bu nedenle, Passport.js&#8217;i sadece kullan\u0131c\u0131y\u0131 tan\u0131mak i\u00e7in de\u011fil, ayn\u0131 zamanda o kullan\u0131c\u0131n\u0131n sistemdeki rol\u00fcn\u00fc ve ayr\u0131cal\u0131klar\u0131n\u0131 belirlemek i\u00e7in nas\u0131l kullanabilece\u011fimizi anlamak b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Bu kapsaml\u0131 rehberde, temelden ileri seviyeye kadar \u00e7e\u015fitli yetkilendirme modellerini ele alacak, ger\u00e7ek d\u00fcnya senaryolar\u0131yla peki\u015ftirecek ve uygulamal\u0131 kod \u00f6rnekleri sunarak bilgilerinizi peki\u015ftirece\u011fiz.<\/p>\n<p>Web geli\u015ftirme d\u00fcnyas\u0131nda g\u00fcvenlik, s\u00fcrekli evrilen bir aland\u0131r ve yetkilendirme mekanizmalar\u0131 da bu de\u011fi\u015fimin merkezinde yer al\u0131r. \u00d6zellikle kullan\u0131c\u0131 deneyiminden \u00f6d\u00fcn vermeden g\u00fcvenli\u011fi en \u00fcst d\u00fczeye \u00e7\u0131karmak, her geli\u015ftiricinin hedefidir. Bu makale boyunca, ad\u0131m ad\u0131m ilerleyerek, Passport.js&#8217;in sundu\u011fu olanaklar\u0131 en verimli \u015fekilde kullanarak, uygulamalar\u0131n\u0131za sa\u011flam bir yetkilendirme katman\u0131 nas\u0131l ekleyece\u011finizi ke\u015ffedeceksiniz. Kendi uygulamalar\u0131n\u0131zda uygulayabilece\u011finiz pratik bilgilerle donat\u0131l\u0131rken, ayn\u0131 zamanda olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131na kar\u015f\u0131 proaktif \u00f6nlemler alman\u0131n yollar\u0131n\u0131 da \u00f6\u011freneceksiniz. Haz\u0131rsan\u0131z, Passport.js ile yetkilendirmenin inceliklerini ke\u015ffetmek i\u00e7in bu yolculu\u011fa ba\u015flayal\u0131m.<\/p>\n<h2>Temel Kavramlar: Kimlik Do\u011frulama ve Yetkilendirme Aras\u0131ndaki Fark Nedir?<\/h2>\n<p>G\u00fcvenli bir uygulaman\u0131n temel ta\u015flar\u0131ndan ikisi olan kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) kavramlar\u0131, s\u0131kl\u0131kla birbirine kar\u0131\u015ft\u0131r\u0131lsa da, asl\u0131nda farkl\u0131 rolleri ve sorumluluklar\u0131 vard\u0131r. Bu iki kavram\u0131 net bir \u015fekilde anlamak, sa\u011flam g\u00fcvenlik mekanizmalar\u0131 in\u015fa etmenin ilk ad\u0131m\u0131d\u0131r. Dolay\u0131s\u0131yla, Passport.js gibi bir arac\u0131 yetkilendirme s\u00fcre\u00e7lerine dahil etmeden \u00f6nce, bu temel farklar\u0131 iyice kavramak gereklidir.<\/p>\n<p><strong>Kimlik Do\u011frulama (Authentication):<\/strong> Bu s\u00fcre\u00e7, bir kullan\u0131c\u0131n\u0131n veya sistemin iddia etti\u011fi ki\u015fi veya sistem olup olmad\u0131\u011f\u0131n\u0131 do\u011frular. Basit\u00e7e ifade etmek gerekirse, &#8220;Sen kim oldu\u011funu iddia ediyorsun ve bunu kan\u0131tlayabilir misin?&#8221; sorusuna yan\u0131t arar. Genellikle kullan\u0131c\u0131 ad\u0131 ve parola kombinasyonu, parmak izi, y\u00fcz tan\u0131ma veya \u00e7ok fakt\u00f6rl\u00fc kimlik do\u011frulama (MFA) gibi y\u00f6ntemlerle ger\u00e7ekle\u015ftirilir. Ba\u015far\u0131l\u0131 bir kimlik do\u011frulama sonucunda, sistem kullan\u0131c\u0131n\u0131n kimli\u011fini onaylar ve genellikle bir oturum (session) veya bir eri\u015fim belirteci (token) olu\u015fturur. Passport.js, tam olarak bu ad\u0131ma odaklan\u0131r ve \u00e7e\u015fitli &#8220;stratejiler&#8221; arac\u0131l\u0131\u011f\u0131yla kimlik do\u011frulama mekanizmalar\u0131n\u0131 kolayca entegre etmemizi sa\u011flar. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n sisteme do\u011fru kullan\u0131c\u0131 ad\u0131 ve \u015fifreyle giri\u015f yap\u0131p yapmad\u0131\u011f\u0131n\u0131 do\u011frulamak kimlik do\u011frulama i\u015flemidir.<\/p>\n<p><strong>Yetkilendirme (Authorization):<\/strong> Kimlik do\u011frulaman\u0131n ba\u015far\u0131yla tamamlanmas\u0131n\u0131n ard\u0131ndan devreye giren yetkilendirme ise, kimli\u011fi do\u011frulanm\u0131\u015f bir kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa eri\u015fim izni olup olmad\u0131\u011f\u0131n\u0131 veya belirli bir i\u015flemi ger\u00e7ekle\u015ftirip ger\u00e7ekle\u015ftiremeyece\u011fini belirler. Di\u011fer bir deyi\u015fle, &#8220;Kim oldu\u011funu biliyoruz; \u015fimdi, ne yapmana izin var?&#8221; sorusuna yan\u0131t verir. Yetkilendirme, genellikle kullan\u0131c\u0131n\u0131n rol\u00fc (\u00f6rne\u011fin, y\u00f6netici, edit\u00f6r, okuyucu), sahip oldu\u011fu ayr\u0131cal\u0131klar veya belirli kaynaklarla olan ili\u015fkisi gibi fakt\u00f6rlere dayan\u0131r. Bir kullan\u0131c\u0131n\u0131n bir g\u00f6nderiyi silebilmesi, bir ayar\u0131 de\u011fi\u015ftirebilmesi veya belirli bir rapora eri\u015febilmesi, yetkilendirme ile kontrol edilen eylemlerdir. Passport.js do\u011frudan bir yetkilendirme k\u00fct\u00fcphanesi olmasa da, kimlik do\u011frulama sonras\u0131 kullan\u0131c\u0131 bilgilerini req.user nesnesine ekleyerek, bu bilgileri yetkilendirme middleware&#8217;lar\u0131 i\u00e7inde kullanmam\u0131za olanak tan\u0131r. \u00d6rne\u011fin, bir &#8220;y\u00f6netici&#8221; rol\u00fcne sahip kullan\u0131c\u0131n\u0131n sistemdeki t\u00fcm kullan\u0131c\u0131lar\u0131 d\u00fczenleyebilmesi, ancak &#8220;edit\u00f6r&#8221; rol\u00fcne sahip bir kullan\u0131c\u0131n\u0131n yaln\u0131zca kendi g\u00f6nderilerini d\u00fczenleyebilmesi yetkilendirme ile sa\u011flan\u0131r.<\/p>\n<p>Bu iki kavram aras\u0131ndaki ili\u015fkiyi anlamak, g\u00fcvenlik mimarisini do\u011fru bir \u015fekilde tasarlamak i\u00e7in hayati \u00f6neme sahiptir. Kimlik do\u011frulama olmadan yetkilendirme anlams\u0131zd\u0131r, \u00e7\u00fcnk\u00fc sistem kimin yetkilendirildi\u011fini bilmez. Benzer \u015fekilde, yetkilendirme olmadan kimlik do\u011frulama, kullan\u0131c\u0131ya sistemi kullanma izni verir ancak hangi s\u0131n\u0131rlar i\u00e7inde kullanabilece\u011fini belirlemez, bu da potansiyel g\u00fcvenlik riskleri yarat\u0131r. Dolay\u0131s\u0131yla, her iki s\u00fcrecin de birbiriyle uyumlu ve sa\u011flam bir \u015fekilde \u00e7al\u0131\u015fmas\u0131 gerekmektedir.<\/p>\n<p>\u00d6zetle, kimlik do\u011frulama giri\u015f kap\u0131s\u0131d\u0131r; kimin i\u00e7eri girebilece\u011fine karar verir. Yetkilendirme ise i\u00e7erideki odalar\u0131n kap\u0131lar\u0131n\u0131 a\u00e7ma yetkisidir; i\u00e7eri giren ki\u015finin hangi odalara girebilece\u011fini veya hangi e\u015fyalara dokunabilece\u011fini belirler. Passport.js ile bu iki katman\u0131 bir arada ele alacak, \u00f6ncelikle kimlik do\u011frulamay\u0131 kuracak, ard\u0131ndan yetkilendirme mant\u0131\u011f\u0131n\u0131 nas\u0131l entegre edece\u011fimizi ad\u0131m ad\u0131m g\u00f6rece\u011fiz. Bu ayr\u0131m, hem kodunuzu daha okunabilir ve y\u00f6netilebilir hale getirir hem de uygulaman\u0131z\u0131n g\u00fcvenlik duru\u015funu \u00f6nemli \u00f6l\u00e7\u00fcde g\u00fc\u00e7lendirir.<\/p>\n<h2>Passport.js ile Temel Kimlik Do\u011frulama Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Passport.js, Node.js uygulamalar\u0131nda kimlik do\u011frulama i\u015flemlerini basitle\u015ftiren g\u00fc\u00e7l\u00fc ve esnek bir middleware k\u00fct\u00fcphanesidir. Farkl\u0131 kimlik do\u011frulama mekanizmalar\u0131 i\u00e7in &#8220;stratejiler&#8221; sunarak, geli\u015ftiricilerin g\u00fcvenlik katman\u0131n\u0131 kolayca uygulamalar\u0131na olanak tan\u0131r. Yetkilendirmeye ge\u00e7meden \u00f6nce, bir kullan\u0131c\u0131n\u0131n kimli\u011fini ba\u015far\u0131yla do\u011frulaman\u0131n temellerini atmam\u0131z gerekiyor. Bu b\u00f6l\u00fcmde, Passport.js&#8217;i kullanarak yerel bir kimlik do\u011frulama stratejisini (kullan\u0131c\u0131 ad\u0131 ve parola) nas\u0131l kuraca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz. Bu ad\u0131mlar, uygulaman\u0131z\u0131n geri kalan\u0131nda yetkilendirme kararlar\u0131 almak i\u00e7in gerekli kullan\u0131c\u0131 bilgilerini sa\u011flayacakt\u0131r.<\/p>\n<p><strong>1. Gerekli Paketlerin Kurulumu:<\/strong><\/p>\n<p>\u00d6ncelikle Express.js tabanl\u0131 bir uygulama i\u00e7in gerekli paketleri kurmam\u0131z gerekiyor. E\u011fer Express uygulaman\u0131z yoksa, h\u0131zl\u0131ca bir tane olu\u015fturabilirsiniz. Ard\u0131ndan, Passport.js, yerel strateji ve oturum y\u00f6netimi i\u00e7in ek paketleri y\u00fckleyelim:<\/p>\n<pre><code class=\"language-bash\">\nnpm install express passport passport-local express-session\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>2. Temel Express Uygulamas\u0131 ve Passport Entegrasyonu:<\/strong><\/p>\n<p>Bir <code>app.js<\/code> veya <code>server.js<\/code> dosyas\u0131nda Express uygulaman\u0131z\u0131 ba\u015flat\u0131n ve Passport'\u0131 entegre edin. Oturum y\u00f6netimi i\u00e7in <code>express-session<\/code> kullanaca\u011f\u0131z, bu da Passport'\u0131n kullan\u0131c\u0131 bilgilerini oturumda saklamas\u0131n\u0131 sa\u011flayacak:<\/p>\n<pre><code class=\"language-javascript\">\nconst express = require('express');\nconst passport = require('passport');\nconst LocalStrategy = require('passport-local').Strategy;\nconst session = require('express-session');\nconst bcrypt = require('bcryptjs'); \/\/ Parola hashleme i\u00e7in\n\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\n\/\/ Middleware'lar\napp.use(express.json()); \/\/ JSON body parsing\napp.use(express.urlencoded({ extended: true })); \/\/ URL-encoded body parsing\n\n\/\/ Oturum Yap\u0131land\u0131rmas\u0131\napp.use(session({\n    secret: 'cokgizlibiranahtar', \/\/ Oturum verilerini \u015fifrelemek i\u00e7in kullan\u0131lan gizli anahtar\n    resave: false,               \/\/ Oturumda de\u011fi\u015fiklik yap\u0131lmasa bile tekrar kaydetme\n    saveUninitialized: false,    \/\/ Yeni olu\u015fturulan ancak de\u011fi\u015ftirilmemi\u015f oturumlar\u0131 kaydetme\n    cookie: { maxAge: 1000 * 60 * 60 * 24 } \/\/ 1 g\u00fcn\n}));\n\n\/\/ Passport'\u0131 ba\u015flatma ve oturum kullanma\napp.use(passport.initialize());\napp.use(passport.session());\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>3. Passport.js Yerel Stratejinin Yap\u0131land\u0131r\u0131lmas\u0131:<\/strong><\/p>\n<p>Yerel strateji, kullan\u0131c\u0131n\u0131n g\u00f6nderdi\u011fi kullan\u0131c\u0131 ad\u0131 ve parolay\u0131 do\u011frulamak i\u00e7in kullan\u0131l\u0131r. Bu stratejiyi yap\u0131land\u0131r\u0131rken, veritaban\u0131n\u0131zdaki kullan\u0131c\u0131lar\u0131 kontrol eden bir fonksiyon sa\u011flamal\u0131s\u0131n\u0131z. \u015eimdilik basit bir \u00f6rnek i\u00e7in statik bir kullan\u0131c\u0131 array'i kullanal\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\nconst users = [\n    { id: '1', username: 'admin', passwordHash: bcrypt.hashSync('adminparola', 10), role: 'admin' },\n    { id: '2', username: 'editor', passwordHash: bcrypt.hashSync('editorparola', 10), role: 'editor' },\n    { id: '3', username: 'guest', passwordHash: bcrypt.hashSync('guestparola', 10), role: 'guest' }\n];\n\npassport.use(new LocalStrategy(\n    async (username, password, done) => {\n        try {\n            const user = users.find(u => u.username === username);\n\n            if (!user) {\n                return done(null, false, { message: 'Yanl\u0131\u015f kullan\u0131c\u0131 ad\u0131.' });\n            }\n\n            const isMatch = await bcrypt.compare(password, user.passwordHash);\n            if (!isMatch) {\n                return done(null, false, { message: 'Yanl\u0131\u015f parola.' });\n            }\n\n            return done(null, user); \/\/ Kimlik do\u011frulama ba\u015far\u0131l\u0131\n        } catch (err) {\n            return done(err);\n        }\n    }\n));\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>4. Kullan\u0131c\u0131 Bilgilerinin Oturumda Saklanmas\u0131 ve Geri Y\u00fcklenmesi:<\/strong><\/p>\n<p>Passport, kullan\u0131c\u0131n\u0131n kimlik do\u011fruland\u0131ktan sonra oturumda hangi verilerinin saklanaca\u011f\u0131n\u0131 ve her istekte oturumdan nas\u0131l geri y\u00fcklenece\u011fini bilmelidir. Bu, <code>serializeUser<\/code> ve <code>deserializeUser<\/code> fonksiyonlar\u0131yla yap\u0131l\u0131r:<\/p>\n<pre><code class=\"language-javascript\">\npassport.serializeUser((user, done) => {\n    done(null, user.id); \/\/ Sadece kullan\u0131c\u0131 ID'sini oturumda sakla\n});\n\npassport.deserializeUser((id, done) => {\n    const user = users.find(u => u.id === id);\n    if (user) {\n        done(null, user); \/\/ Kullan\u0131c\u0131 ID'si ile t\u00fcm kullan\u0131c\u0131 nesnesini geri y\u00fckle\n    } else {\n        done(new Error('Kullan\u0131c\u0131 bulunamad\u0131.'));\n    }\n});\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>5. Kimlik Do\u011frulama Rotas\u0131n\u0131n Olu\u015fturulmas\u0131:<\/strong><\/p>\n<p>\u015eimdi, kullan\u0131c\u0131lar\u0131n giri\u015f yapabilece\u011fi bir POST rotas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Giri\u015f rotas\u0131\napp.post('\/login', passport.authenticate('local', {\n    successRedirect: '\/profile', \/\/ Ba\u015far\u0131l\u0131 giri\u015f sonras\u0131 y\u00f6nlendirme\n    failureRedirect: '\/login-fail', \/\/ Ba\u015far\u0131s\u0131z giri\u015f sonras\u0131 y\u00f6nlendirme\n    failureFlash: true \/\/ Hata mesajlar\u0131n\u0131 flash'a kaydet (connect-flash paketi gerektirir)\n}));\n\n\/\/ Profil rotas\u0131 (korumal\u0131)\napp.get('\/profile', (req, res) => {\n    if (req.isAuthenticated()) { \/\/ Passport'\u0131n sa\u011flad\u0131\u011f\u0131 bir metod\n        res.send(<code>Merhaba, ${req.user.username}! Rol\u00fcn: ${req.user.role}<\/code>);\n    } else {\n        res.redirect('\/login-fail');\n    }\n});\n\n\/\/ Giri\u015f ba\u015far\u0131s\u0131z rotas\u0131\napp.get('\/login-fail', (req, res) => {\n    res.send('Giri\u015f ba\u015far\u0131s\u0131z oldu. L\u00fctfen kullan\u0131c\u0131 ad\u0131 ve parolan\u0131z\u0131 kontrol edin.');\n});\n\n\/\/ \u00c7\u0131k\u0131\u015f rotas\u0131\napp.get('\/logout', (req, res, next) => {\n    req.logout((err) => { \/\/ Passport'\u0131n sa\u011flad\u0131\u011f\u0131 logout metodu\n        if (err) { return next(err); }\n        res.redirect('\/');\n    });\n});\n\napp.get('\/', (req, res) => {\n    res.send('Ana Sayfa. L\u00fctfen giri\u015f yap\u0131n: \/login adresine POST iste\u011fi ile.');\n});\n\napp.listen(PORT, () => {\n    console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor.<\/code>);\n});\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu temel kurulumla, kullan\u0131c\u0131 ad\u0131 ve parola ile kimlik do\u011frulama i\u015flemi tamamlanm\u0131\u015f olur. <code>req.isAuthenticated()<\/code> metodu, kullan\u0131c\u0131n\u0131n oturumda kimli\u011fi do\u011frulanm\u0131\u015f olup olmad\u0131\u011f\u0131n\u0131 kontrol ederken, ba\u015far\u0131l\u0131 kimlik do\u011frulamas\u0131ndan sonra <code>req.user<\/code> nesnesi, oturumdan y\u00fcklenen kullan\u0131c\u0131 bilgilerini (bu \u00f6rnekte <code>id<\/code>, <code>username<\/code>, <code>passwordHash<\/code>, <code>role<\/code>) i\u00e7erir. \u0130\u015fte bu <code>req.user<\/code> nesnesi, yetkilendirme kararlar\u0131n\u0131 vermek i\u00e7in kullanaca\u011f\u0131m\u0131z anahtar bilgidir. Bir sonraki b\u00f6l\u00fcmde, bu bilgiyi kullanarak role dayal\u0131 yetkilendirmeyi nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 g\u00f6rece\u011fiz.<\/p>\n<aside class=\"tip\">\n    Uzman \u0130pucu: Ger\u00e7ek d\u00fcnya uygulamalar\u0131nda <code>bcrypt.hashSync<\/code> yerine asenkron <code>bcrypt.hash<\/code> kullanmay\u0131 ve kullan\u0131c\u0131 bilgilerini veritaban\u0131ndan \u00e7ekmeyi unutmay\u0131n. Ayr\u0131ca, <code>express-session<\/code> i\u00e7in g\u00fc\u00e7l\u00fc bir <code>secret<\/code> de\u011feri kullanmak ve bunu ortam de\u011fi\u015fkenlerinden almak g\u00fcvenli\u011finiz i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n  <\/aside>\n<h2>Yetkilendirme \u0130\u00e7in Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) Nas\u0131l Uygulan\u0131r?<\/h2>\n<p>Kimlik do\u011frulama, bir kullan\u0131c\u0131n\u0131n sisteme kim olarak girdi\u011fini belirler. Ancak \"admin\" rol\u00fcndeki bir kullan\u0131c\u0131n\u0131n her \u015feye eri\u015fimi varken, \"editor\" rol\u00fcndeki bir kullan\u0131c\u0131n\u0131n yaln\u0131zca belirli i\u00e7erikleri d\u00fczenlemesine izin verilmesi gerekir. \u0130\u015fte bu noktada Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (Role-Based Access Control - RBAC) devreye girer. RBAC, yetkilendirme modellerinin en yayg\u0131n ve anla\u015f\u0131l\u0131r olanlar\u0131ndan biridir. Kullan\u0131c\u0131lara do\u011frudan izinler vermek yerine, onlar\u0131 bir veya daha fazla role atar\u0131z ve bu rollere belirli izinler tan\u0131mlar\u0131z. B\u00f6ylece, bir kullan\u0131c\u0131n\u0131n eri\u015fimini y\u00f6netmek i\u00e7in sadece rol\u00fcn\u00fc de\u011fi\u015ftirmek yeterli olur.<\/p>\n<p>Passport.js ile RBAC uygulamak, kimlik do\u011frulama sonras\u0131 <code>req.user<\/code> nesnesine eklenen rol bilgisini kullanarak \u00f6zel bir middleware yazmay\u0131 i\u00e7erir. Bu middleware, her iste\u011fin hedeflenen rotaya ula\u015fmadan \u00f6nce kullan\u0131c\u0131n\u0131n gerekli role sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol edecektir. \u015eimdi ad\u0131m ad\u0131m RBAC'\u0131 nas\u0131l entegre edece\u011fimizi g\u00f6relim.<\/p>\n<p><strong>1. Kullan\u0131c\u0131 Modeline Rol Eklemek:<\/strong><\/p>\n<p>\u00d6nceki \u00f6rnekteki statik <code>users<\/code> dizisine zaten <code>role<\/code> alan\u0131n\u0131 eklemi\u015ftik. Ger\u00e7ek bir uygulamada, bu <code>role<\/code> bilgisi veritaban\u0131n\u0131zdaki <code>User<\/code> modelinizde saklanmal\u0131d\u0131r. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00d6rnek kullan\u0131c\u0131 modeli (ger\u00e7ekte veritaban\u0131nda saklan\u0131r)\nconst users = [\n    { id: '1', username: 'admin', passwordHash: 'hashed_admin_password', role: 'admin' },\n    { id: '2', username: 'editor', passwordHash: 'hashed_editor_password', role: 'editor' },\n    { id: '3', username: 'guest', passwordHash: 'hashed_guest_password', role: 'guest' }\n];\n  <\/pre>\n<p><\/code><\/p>\n<p><strong>2. Yetkilendirme Middleware'\u0131 Olu\u015fturma:<\/strong><\/p>\n<p>\u015eimdi, belirli bir rol veya rollere sahip kullan\u0131c\u0131lar\u0131n bir rotaya eri\u015fmesini sa\u011flayan dinamik bir middleware fonksiyonu yazal\u0131m. Bu fonksiyon, bir veya daha fazla rol alacak ve <code>req.user<\/code> nesnesindeki <code>role<\/code> ile kar\u015f\u0131la\u015ft\u0131racakt\u0131r.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ isAuthorized middleware: Kullan\u0131c\u0131n\u0131n giri\u015f yap\u0131p yapmad\u0131\u011f\u0131n\u0131 kontrol eder\nfunction isAuthorized(req, res, next) {\n    if (req.isAuthenticated()) {\n        return next(); \/\/ Kullan\u0131c\u0131 oturum a\u00e7m\u0131\u015fsa devam et\n    }\n    res.status(401).send('Yetkilendirilmemi\u015f: L\u00fctfen giri\u015f yap\u0131n.');\n}\n\n\/\/ hasRole middleware: Kullan\u0131c\u0131n\u0131n belirli bir role sahip olup olmad\u0131\u011f\u0131n\u0131 kontrol eder\nfunction hasRole(roles) {\n    return (req, res, next) => {\n        if (!req.user) {\n            return res.status(403).send('Yasak: Kullan\u0131c\u0131 bilgisi mevcut de\u011fil. Giri\u015f yapm\u0131\u015f olsan\u0131z bile yetkiniz olmayabilir.');\n        }\n\n        const userRole = req.user.role;\n        \/\/ E\u011fer roller tek bir string olarak gelirse array'e \u00e7evir\n        const allowedRoles = Array.isArray(roles) ? roles : [roles];\n\n        if (allowedRoles.includes(userRole)) {\n            return next(); \/\/ Kullan\u0131c\u0131 gerekli role sahipse devam et\n        } else {\n            res.status(403).send(<code>Yasak: Bu kayna\u011fa eri\u015fim i\u00e7in gerekli rol\u00fcn\u00fcz yok. Rol\u00fcn\u00fcz: ${userRole}. Gerekli roller: ${allowedRoles.join(&#039;, &#039;)}<\/code>);\n        }\n    };\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Yukar\u0131daki <code>hasRole<\/code> middleware'\u0131, bir veya birden fazla rol\u00fc parametre olarak al\u0131r. Middleware \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, <code>req.user.role<\/code> ile bu rolleri kar\u015f\u0131la\u015ft\u0131r\u0131r. E\u011fer kullan\u0131c\u0131n\u0131n rol\u00fc, izin verilen rollerden biriyse, istek bir sonraki middleware'a veya rota i\u015fleyicisine ge\u00e7er. Aksi takdirde, kullan\u0131c\u0131ya 403 Forbidden hatas\u0131 d\u00f6ner.<\/p>\n<p><strong>3. Korumal\u0131 Rotlar\u0131 Uygulama:<\/strong><\/p>\n<p>Art\u0131k bu middleware'\u0131 rotalar\u0131m\u0131za uygulayabiliriz. \u00d6rne\u011fin, yaln\u0131zca y\u00f6neticilerin eri\u015febilece\u011fi bir admin paneli, edit\u00f6rlerin i\u00e7erik olu\u015fturabilece\u011fi bir rota ve t\u00fcm giri\u015f yapm\u0131\u015f kullan\u0131c\u0131lar\u0131n g\u00f6rebilece\u011fi bir profil sayfas\u0131 olu\u015ftural\u0131m:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ ... (\u00d6nceki Passport.js kurulum kodlar\u0131) ...\n\n\/\/ Y\u00f6neticiye \u00f6zel rota\napp.get('\/admin', isAuthorized, hasRole('admin'), (req, res) => {\n    res.send(<code>Y\u00f6netici Paneli: Merhaba ${req.user.username}! T\u00fcm sistem ayarlar\u0131n\u0131 buradan y\u00f6netebilirsiniz.<\/code>);\n});\n\n\/\/ Edit\u00f6re \u00f6zel rota\napp.get('\/editor\/dashboard', isAuthorized, hasRole(['admin', 'editor']), (req, res) => {\n    res.send(<code>Edit\u00f6r Paneli: Merhaba ${req.user.username}! \u0130\u00e7eriklerinizi buradan d\u00fczenleyebilirsiniz.<\/code>);\n});\n\n\/\/ T\u00fcm giri\u015f yapm\u0131\u015f kullan\u0131c\u0131lar\u0131n eri\u015febilece\u011fi rota\napp.get('\/dashboard', isAuthorized, (req, res) => {\n    res.send(<code>Kullan\u0131c\u0131 Paneli: Merhaba ${req.user.username}! Genel bilgilere buradan eri\u015febilirsiniz.<\/code>);\n});\n\n\/\/ ... (Di\u011fer rotalar ve sunucu ba\u015flatma) ...\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnekte, <code>isAuthorized<\/code> middleware'\u0131n\u0131 kullanarak \u00f6nce kullan\u0131c\u0131n\u0131n giri\u015f yap\u0131p yapmad\u0131\u011f\u0131n\u0131 kontrol ediyoruz. E\u011fer giri\u015f yap\u0131lm\u0131\u015fsa, <code>hasRole<\/code> middleware'\u0131 ile kullan\u0131c\u0131n\u0131n rol\u00fcn\u00fc do\u011frular\u0131z. <code>&#039;\/editor\/dashboard&#039;<\/code> rotas\u0131 i\u00e7in <code>hasRole([&#039;admin&#039;, &#039;editor&#039;])<\/code> kullanarak hem y\u00f6neticilerin hem de edit\u00f6rlerin bu rotaya eri\u015febilmesini sa\u011fl\u0131yoruz. Bu esneklik, RBAC'\u0131n en b\u00fcy\u00fck avantajlar\u0131ndan biridir.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Senaryosu: E-ticaret Platformunda Rol Tabanl\u0131 Yetkilendirme<\/h3>\n<p>Bir e-ticaret platformu hayal edelim. Bu platformda farkl\u0131 kullan\u0131c\u0131 rolleri ve bu rollere \u00f6zel eri\u015fimler bulunur:<\/p>\n<ul>\n<li><strong>M\u00fc\u015fteri (customer):<\/strong> \u00dcr\u00fcnleri g\u00f6rebilir, sipari\u015f verebilir, kendi sipari\u015f ge\u00e7mi\u015fini g\u00f6r\u00fcnt\u00fcleyebilir.<\/li>\n<li><strong>Sat\u0131c\u0131 (seller):<\/strong> Kendi \u00fcr\u00fcnlerini ekleyebilir, g\u00fcncelleyebilir, silebilir; kendi sipari\u015flerini y\u00f6netebilir. Ba\u015fka bir sat\u0131c\u0131n\u0131n \u00fcr\u00fcn\u00fcn\u00fc veya sipari\u015fini g\u00f6remez.<\/li>\n<li><strong>Y\u00f6netici (admin):<\/strong> T\u00fcm \u00fcr\u00fcnleri, t\u00fcm sipari\u015fleri, t\u00fcm kullan\u0131c\u0131lar\u0131 y\u00f6netebilir. Sat\u0131c\u0131lara \u00fcr\u00fcn onaylar\u0131 verebilir.<\/li>\n<\/ul>\n<p>Bu senaryoda, <code>hasRole<\/code> middleware'\u0131 ile rotalar\u0131 kolayca koruyabiliriz:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ \u00dcr\u00fcn ekleme rotas\u0131 - sadece sat\u0131c\u0131lar ve adminler\napp.post('\/products', isAuthorized, hasRole(['seller', 'admin']), (req, res) => {\n    \/\/ \u00dcr\u00fcn ekleme mant\u0131\u011f\u0131\n    res.send(<code>\u00dcr\u00fcn eklendi: ${req.body.name} (Ekleyen: ${req.user.username}, Rol: ${req.user.role})<\/code>);\n});\n\n\/\/ T\u00fcm sipari\u015fleri g\u00f6r\u00fcnt\u00fcleme - sadece adminler\napp.get('\/orders\/all', isAuthorized, hasRole('admin'), (req, res) => {\n    \/\/ T\u00fcm sipari\u015fleri listeleme mant\u0131\u011f\u0131\n    res.send('T\u00fcm sipari\u015fler listeleniyor (Admin).');\n});\n\n\/\/ Kendi sipari\u015flerini g\u00f6r\u00fcnt\u00fcleme - m\u00fc\u015fteriler ve sat\u0131c\u0131lar\napp.get('\/orders\/my', isAuthorized, hasRole(['customer', 'seller']), (req, res) => {\n    \/\/ Kullan\u0131c\u0131n\u0131n kendi sipari\u015flerini filtreleyerek g\u00f6sterme mant\u0131\u011f\u0131\n    res.send(<code>Kendi sipari\u015fleriniz listeleniyor (${req.user.username}).<\/code>);\n});\n  <\/pre>\n<p><\/code><\/p>\n<p>RBAC, karma\u015f\u0131k yetkilendirme ihtiya\u00e7lar\u0131n\u0131 basit ve y\u00f6netilebilir bir \u015fekilde \u00e7\u00f6zmek i\u00e7in ideal bir y\u00f6ntemdir. Ancak bazen sadece rol bilgisi yeterli olmayabilir. Bir sonraki b\u00f6l\u00fcmde, daha granular kontrol gerektiren \"kaynak tabanl\u0131 yetkilendirme\" senaryolar\u0131n\u0131 inceleyece\u011fiz.<\/p>\n<h2>Daha Geli\u015fmi\u015f Senaryolar: Kaynak Tabanl\u0131 Yetkilendirme<\/h2>\n<p>Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc (RBAC) bir\u00e7ok senaryo i\u00e7in yeterli olsa da, bazen yetkilendirme kararlar\u0131n\u0131 sadece kullan\u0131c\u0131n\u0131n rol\u00fcne g\u00f6re de\u011fil, ayn\u0131 zamanda eri\u015fmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 kayna\u011f\u0131n \u00f6zelliklerine veya kayna\u011f\u0131 kimin olu\u015fturdu\u011funa g\u00f6re de vermek gerekebilir. \u0130\u015fte bu, kaynak tabanl\u0131 yetkilendirme (Resource-Based Authorization) veya bazen nitelik tabanl\u0131 eri\u015fim kontrol\u00fc (Attribute-Based Access Control - ABAC) olarak adland\u0131r\u0131lan daha geli\u015fmi\u015f bir modeldir. Bu modelde, bir kullan\u0131c\u0131n\u0131n bir kayna\u011fa (\u00f6rne\u011fin, bir g\u00f6nderi, bir dosya, bir yorum) eri\u015fip eri\u015femeyece\u011fine veya \u00fczerinde bir i\u015flem yap\u0131p yapamayaca\u011f\u0131na karar verirken, kullan\u0131c\u0131n\u0131n kendisi, kayna\u011f\u0131n kendisi ve hatta i\u00e7inde bulunulan ortam hakk\u0131nda daha fazla bilgi de\u011ferlendirilir.<\/p>\n<p>\u00d6rnek bir senaryo: Bir blog uygulamas\u0131nda, bir yazar (editor rol\u00fcnde) kendi g\u00f6nderilerini d\u00fczenleyebilir veya silebilir, ancak ba\u015fka bir yazar\u0131n g\u00f6nderilerini d\u00fczenleyemez. \"Editor\" rol\u00fc bu kural\u0131 tek ba\u015f\u0131na a\u00e7\u0131klamaz; ayn\u0131 rol i\u00e7inde bile, hangi g\u00f6nderinin kime ait oldu\u011fu \u00f6nemlidir. Bu durumda, <code>req.user<\/code> nesnesindeki kullan\u0131c\u0131 ID'si ile kayna\u011f\u0131n (g\u00f6nderi) <code>authorId<\/code> (yazar ID'si) \u00f6zelli\u011fini kar\u015f\u0131la\u015ft\u0131rmam\u0131z gerekir.<\/p>\n<p><strong>1. Kaynak Tabanl\u0131 Middleware Olu\u015fturma:<\/strong><\/p>\n<p>Bu t\u00fcr bir yetkilendirme i\u00e7in \u00f6zel bir middleware'a ihtiyac\u0131m\u0131z var. Bu middleware, iste\u011fin parametrelerinden veya g\u00f6vdesinden kaynak ID'sini alacak, ard\u0131ndan veritaban\u0131ndan bu kayna\u011f\u0131 \u00e7ekecek ve kullan\u0131c\u0131n\u0131n bu kaynak \u00fczerindeki haklar\u0131n\u0131 kontrol edecektir. \u0130\u015fte bir \u00f6rnek:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ isOwner middleware: Kullan\u0131c\u0131n\u0131n belirli bir kayna\u011f\u0131n sahibi olup olmad\u0131\u011f\u0131n\u0131 kontrol eder\nfunction isOwner(model, paramName = 'id', userIdField = 'userId') {\n    return async (req, res, next) => {\n        if (!req.user) {\n            return res.status(403).send('Yasak: Kullan\u0131c\u0131 bilgisi mevcut de\u011fil.');\n        }\n\n        const resourceId = req.params[paramName];\n        if (!resourceId) {\n            return res.status(400).send('Hata: Kaynak ID\\'si sa\u011flanmad\u0131.');\n        }\n\n        try {\n            \/\/ Ger\u00e7ek uygulamada, bu k\u0131s\u0131m veritaban\u0131 sorgusu olacakt\u0131r.\n            \/\/ \u00d6rne\u011fin: const resource = await model.findById(resourceId);\n            \/\/ Sim\u00fclasyon i\u00e7in:\n            const resources = [\n                { id: 'post1', title: '\u0130lk G\u00f6nderi', userId: '2' }, \/\/ editor kullan\u0131c\u0131s\u0131 '2'ye ait\n                { id: 'post2', title: '\u0130kinci G\u00f6nderi', userId: '3' }  \/\/ guest kullan\u0131c\u0131s\u0131 '3'e ait\n            ];\n            const resource = resources.find(r => r.id === resourceId);\n\n            if (!resource) {\n                return res.status(404).send('Kaynak bulunamad\u0131.');\n            }\n\n            \/\/ Kullan\u0131c\u0131n\u0131n ID'si ile kayna\u011f\u0131n sahibi ID'sini kar\u015f\u0131la\u015ft\u0131r\n            if (resource[userIdField] === req.user.id) {\n                \/\/ Kayna\u011f\u0131 sonraki middleware'lar veya rotalar i\u00e7in req nesnesine ekleyebiliriz\n                req.resource = resource;\n                return next(); \/\/ Sahibi ise devam et\n            } else {\n                return res.status(403).send('Yasak: Bu kayna\u011f\u0131n sahibi siz de\u011filsiniz.');\n            }\n        } catch (error) {\n            console.error('isOwner middleware hatas\u0131:', error);\n            res.status(500).send('Sunucu hatas\u0131.');\n        }\n    };\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu <code>isOwner<\/code> middleware'\u0131, bir <code>model<\/code> (ger\u00e7ekte veritaban\u0131 modeliniz) ve <code>paramName<\/code> (kaynak ID'sinin URL'de nerede oldu\u011fu, varsay\u0131lan <code>id<\/code>) al\u0131r. <code>userIdField<\/code> ise kaynak i\u00e7indeki kullan\u0131c\u0131 ID'sini tutan alan\u0131n ad\u0131d\u0131r. Middleware, iste\u011fin parametrelerinden kaynak ID'sini al\u0131r, veritaban\u0131ndan ilgili kayna\u011f\u0131 \u00e7eker ve <code>req.user.id<\/code> ile kayna\u011f\u0131n sahibinin ID'sini kar\u015f\u0131la\u015ft\u0131r\u0131r. E\u011fer e\u015fle\u015fme varsa, i\u015flem devam eder.<\/p>\n<p><strong>2. Kaynak Tabanl\u0131 Rotlar\u0131 Uygulama:<\/strong><\/p>\n<p>\u015eimdi bu middleware'\u0131 blog g\u00f6nderilerini d\u00fczenleme rotas\u0131na uygulayal\u0131m. Unutmay\u0131n, bu rotaya eri\u015fmek i\u00e7in \u00f6nce kullan\u0131c\u0131n\u0131n giri\u015f yapm\u0131\u015f olmas\u0131 (<code>isAuthorized<\/code>) ve belki de \"editor\" rol\u00fcnde olmas\u0131 (<code>hasRole(&#039;editor&#039;)<\/code>) gerekebilir.<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ ... (\u00d6nceki Passport.js ve RBAC middleware kodlar\u0131) ...\n\n\/\/ \u00d6rne\u011fin, bir 'posts' rotas\u0131 i\u00e7in:\napp.get('\/posts\/:id', isAuthorized, (req, res) => {\n    \/\/ Burada g\u00f6nderiyi veritaban\u0131ndan \u00e7ekip g\u00f6steririz\n    res.send(<code>G\u00f6nderi detay\u0131: ${req.params.id}<\/code>);\n});\n\n\/\/ G\u00f6nderiyi g\u00fcncelleme veya silme - sadece sahibi ve y\u00f6neticiler\n\/\/ hasRole middleware'\u0131 genel eri\u015fimi k\u0131s\u0131tlarken, isOwner spesifik kayna\u011f\u0131 korur.\napp.put('\/posts\/:id', isAuthorized, hasRole(['admin', 'editor']), isOwner('PostModel', 'id', 'userId'), (req, res) => {\n    \/\/ req.resource nesnesi art\u0131k g\u00fcncellenecek g\u00f6nderiyi i\u00e7erir\n    res.send(<code>G\u00f6nderi ${req.resource.id} g\u00fcncellendi. (Kullan\u0131c\u0131: ${req.user.username})<\/code>);\n});\n\napp.delete('\/posts\/:id', isAuthorized, hasRole(['admin', 'editor']), isOwner('PostModel', 'id', 'userId'), (req, res) => {\n    res.send(<code>G\u00f6nderi ${req.resource.id} silindi. (Kullan\u0131c\u0131: ${req.user.username})<\/code>);\n});\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yap\u0131land\u0131rmada, bir \"editor\" rol\u00fcndeki kullan\u0131c\u0131 <code>\/posts\/post1<\/code> adresine <code>PUT<\/code> iste\u011fi g\u00f6nderdi\u011finde, \u00f6ncelikle giri\u015f yapm\u0131\u015f olup olmad\u0131\u011f\u0131 kontrol edilir (<code>isAuthorized<\/code>). Ard\u0131ndan rol\u00fcn\u00fcn \"admin\" veya \"editor\" olup olmad\u0131\u011f\u0131na bak\u0131l\u0131r (<code>hasRole<\/code>). Son olarak, <code>isOwner<\/code> middleware'\u0131, <code>post1<\/code> ID'li g\u00f6nderinin sahibinin o anki <code>req.user.id<\/code> ile e\u015fle\u015fip e\u015fle\u015fmedi\u011fini kontrol eder. E\u011fer hepsi ba\u015far\u0131l\u0131 olursa, g\u00f6nderiyi g\u00fcncelleme i\u015flemi ger\u00e7ekle\u015fir.<\/p>\n<h3>Karma\u015f\u0131k Yetkilendirme Kararlar\u0131 \u0130\u00e7in Politika Tabanl\u0131 Yakla\u015f\u0131m<\/h3>\n<p>Bazen yetkilendirme kararlar\u0131 birden fazla ko\u015fula ba\u011fl\u0131 olabilir (\u00f6rne\u011fin, \"g\u00f6nderi taslak halindeyse sadece sahibi ve y\u00f6neticiler g\u00f6rebilir, yay\u0131nlanm\u0131\u015fsa herkes g\u00f6rebilir\"). Bu gibi durumlarda, daha esnek \"politika tabanl\u0131\" bir yakla\u015f\u0131m d\u00fc\u015f\u00fcnebiliriz. Her bir yetkilendirme kural\u0131n\u0131 ayr\u0131 bir politika fonksiyonu olarak tan\u0131mlar\u0131z ve bu politikalar\u0131 middleware zincirinde \u00e7a\u011f\u0131r\u0131r\u0131z. \u00d6rne\u011fin:<\/p>\n<pre><code class=\"language-javascript\">\n\/\/ Bir g\u00f6nderiyi g\u00f6r\u00fcnt\u00fcleme politikas\u0131\nconst canViewPost = (req, res, next) => {\n    const post = req.resource; \/\/ isOwner veya ba\u015fka bir middleware'dan gelen kaynak\n    if (post.status === 'published' || req.user.role === 'admin' || (req.user.id === post.userId && post.status === 'draft')) {\n        return next();\n    }\n    res.status(403).send('Yasak: Bu g\u00f6nderiyi g\u00f6r\u00fcnt\u00fcleme yetkiniz yok.');\n};\n\n\/\/ ...\napp.get('\/posts\/:id', isAuthorized, isOwner('PostModel', 'id', 'userId'), canViewPost, (req, res) => {\n    \/\/ G\u00f6nderiyi g\u00f6ster\n});\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu yakla\u015f\u0131m, yetkilendirme mant\u0131\u011f\u0131n\u0131 daha mod\u00fcler ve okunabilir hale getirir. Her bir politika, belirli bir karar\u0131 vermek i\u00e7in gerekli t\u00fcm ba\u011flamsal bilgiyi (<code>req.user<\/code>, <code>req.resource<\/code>, vb.) kullanabilir. Kaynak tabanl\u0131 ve politika tabanl\u0131 yetkilendirme, uygulaman\u0131z\u0131n g\u00fcvenlik katman\u0131n\u0131 \u00e7ok daha gran\u00fcler ve esnek hale getirerek, kullan\u0131c\u0131lar\u0131n\u0131za sadece hak ettikleri eri\u015fimi sa\u011flaman\u0131za olanak tan\u0131r. Bu, hem g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 azalt\u0131r hem de kullan\u0131c\u0131 deneyimini iyile\u015ftirir.<\/p>\n<h2>G\u00fcvenlik ve Performans \u0130pu\u00e7lar\u0131: Uygulaman\u0131z\u0131 Nas\u0131l Sa\u011flamla\u015ft\u0131r\u0131rs\u0131n\u0131z?<\/h2>\n<p>Yetkilendirme mekanizmalar\u0131n\u0131 do\u011fru bir \u015fekilde kurmak kadar, uygulaman\u0131n genel g\u00fcvenli\u011fini ve performans\u0131n\u0131 optimize etmek de b\u00fcy\u00fck \u00f6nem ta\u015f\u0131r. Passport.js ve Express.js ile \u00e7al\u0131\u015f\u0131rken dikkat etmeniz gereken baz\u0131 \u00f6nemli noktalar bulunmaktad\u0131r. Bu b\u00f6l\u00fcmde, uygulaman\u0131z\u0131 daha g\u00fcvenli ve verimli hale getirecek pratik ipu\u00e7lar\u0131na de\u011finece\u011fiz.<\/p>\n<h3>1. Oturum Y\u00f6netimi ve G\u00fcvenli\u011fi<\/h3>\n<p><code>express-session<\/code> ile \u00e7al\u0131\u015f\u0131rken oturum g\u00fcvenli\u011fini art\u0131rmak i\u00e7in baz\u0131 ad\u0131mlar at\u0131lmal\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>G\u00fc\u00e7l\u00fc Gizli Anahtar (<code>secret<\/code>):<\/strong> Oturum verilerini \u015fifrelemek i\u00e7in kullan\u0131lan <code>secret<\/code> anahtar\u0131, tahmin edilmesi zor, uzun ve karma\u015f\u0131k olmal\u0131d\u0131r. \u00dcretim ortamlar\u0131nda bu anahtar\u0131 ortam de\u011fi\u015fkenlerinden (environment variables) al\u0131n.<\/li>\n<li><strong>\u00c7erez G\u00fcvenli\u011fi:<\/strong> Oturum \u00e7erezlerinizin g\u00fcvenli\u011fini art\u0131rmak i\u00e7in a\u015fa\u011f\u0131daki se\u00e7enekleri kullan\u0131n:\n<ul>\n<li><code>secure: true<\/code>: \u00c7erezin sadece HTTPS \u00fczerinden g\u00f6nderilmesini sa\u011flar. \u00dcretim ortamlar\u0131 i\u00e7in \u015fartt\u0131r.<\/li>\n<li><code>httpOnly: true<\/code>: \u00c7erezin istemci taraf\u0131 JavaScript taraf\u0131ndan eri\u015filmesini engeller, XSS sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar.<\/li>\n<li><code>sameSite: &#039;Lax&#039;<\/code> veya <code>&#039;Strict&#039;<\/code>: CSRF sald\u0131r\u0131lar\u0131na kar\u015f\u0131 koruma sa\u011flar. <code>&#039;Lax&#039;<\/code> \u00e7o\u011fu kullan\u0131m durumu i\u00e7in iyi bir denge sunar.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Oturum S\u00fcresi (<code>maxAge<\/code>):<\/strong> Oturumun ne kadar s\u00fcreyle aktif kalaca\u011f\u0131n\u0131 belirleyin. \u00c7ok uzun s\u00fcreler g\u00fcvenlik riski olu\u015fturabilir. Kullan\u0131c\u0131n\u0131n tekrar giri\u015f yapmas\u0131n\u0131 gerektiren, makul bir s\u00fcre belirleyin.<\/li>\n<\/ul>\n<pre><code class=\"language-javascript\">\napp.use(session({\n    secret: process.env.SESSION_SECRET || 'varsayilan-cok-gizli-anahtar',\n    resave: false,\n    saveUninitialized: false,\n    cookie: {\n        secure: process.env.NODE_ENV === 'production', \/\/ \u00dcretimde HTTPS gerektirir\n        httpOnly: true,\n        sameSite: 'Lax',\n        maxAge: 1000 * 60 * 60 * 2 \/\/ 2 saat\n    }\n}));\n  <\/pre>\n<p><\/code><\/p>\n<h3>2. Parola Y\u00f6netimi<\/h3>\n<p>Parolalar\u0131 asla d\u00fcz metin olarak saklamay\u0131n. Daima g\u00fc\u00e7l\u00fc bir hash algoritmas\u0131 (\u00f6rne\u011fin <code>bcrypt<\/code>) kullanarak hash'leyin ve tuzlama (salting) kullan\u0131n. Parola kar\u015f\u0131la\u015ft\u0131rmalar\u0131n\u0131 asenkron olarak yap\u0131n.<\/p>\n<h3>3. Girdi Do\u011frulama ve Dezenfeksiyon<\/h3>\n<p>Kullan\u0131c\u0131dan gelen her t\u00fcrl\u00fc girdiyi (form verileri, URL parametreleri, sorgu dizeleri) sunucu taraf\u0131nda mutlaka do\u011frulay\u0131n ve dezenfekte edin. Bu, SQL enjeksiyonu, XSS (Cross-Site Scripting) gibi yayg\u0131n sald\u0131r\u0131lar\u0131 \u00f6nler. <code>express-validator<\/code> gibi k\u00fct\u00fcphaneler bu konuda size yard\u0131mc\u0131 olabilir.<\/p>\n<h3>4. Rate Limiting<\/h3>\n<p>Belirli rotalara (\u00f6zellikle giri\u015f, kay\u0131t, parola s\u0131f\u0131rlama) yap\u0131lan isteklerin say\u0131s\u0131n\u0131 s\u0131n\u0131rlay\u0131n. Bu, kaba kuvvet (brute-force) sald\u0131r\u0131lar\u0131n\u0131 ve DDoS giri\u015fimlerini yava\u015flatmaya yard\u0131mc\u0131 olur. <code>express-rate-limit<\/code> pop\u00fcler bir se\u00e7enektir.<\/p>\n<pre><code class=\"language-javascript\">\nconst rateLimit = require('express-rate-limit');\n\nconst loginLimiter = rateLimit({\n    windowMs: 15 * 60 * 1000, \/\/ 15 dakika\n    max: 5, \/\/ Her IP adresinden 15 dakika i\u00e7inde maksimum 5 deneme\n    message: '\u00c7ok fazla giri\u015f denemesi yapt\u0131n\u0131z, l\u00fctfen 15 dakika sonra tekrar deneyin.'\n});\n\napp.post('\/login', loginLimiter, passport.authenticate('local', { \/* ... *\/ }));\n  <\/pre>\n<p><\/code><\/p>\n<h3>5. JWT (JSON Web Tokens) Kullan\u0131m\u0131<\/h3>\n<p>E\u011fer stateless (durumsuz) bir API geli\u015ftiriyorsan\u0131z veya mobil uygulamalar\u0131n\u0131z varsa, Passport.js'in JWT stratejilerini kullanarak oturum yerine belirte\u00e7 tabanl\u0131 kimlik do\u011frulama yapabilirsiniz. JWT'ler, sunucuda oturum saklama ihtiyac\u0131n\u0131 ortadan kald\u0131r\u0131r ve \u00f6l\u00e7eklenebilirli\u011fi art\u0131r\u0131r. Ancak, JWT'lerin de kendi g\u00fcvenlik zorluklar\u0131 vard\u0131r (\u00f6rne\u011fin, belirte\u00e7lerin \u00e7al\u0131nmas\u0131, yenileme belirte\u00e7lerinin y\u00f6netimi).<\/p>\n<h3>6. Hata Y\u00f6netimi<\/h3>\n<p>Hata mesajlar\u0131n\u0131z\u0131 genel ve bilgilendirici olmayan bir \u015fekilde d\u00fczenleyin. G\u00fcvenlik a\u00e7\u0131\u011f\u0131 bilgilerini veya sunucu i\u00e7 detaylar\u0131n\u0131 asla hata mesajlar\u0131nda do\u011frudan g\u00f6stermeyin. \u00d6rne\u011fin, \"Kullan\u0131c\u0131 ad\u0131 veya parola yanl\u0131\u015f\" yerine sadece \"Giri\u015f ba\u015far\u0131s\u0131z\" demek daha g\u00fcvenlidir.<\/p>\n<h3>7. G\u00fcvenlik Ba\u015fl\u0131klar\u0131<\/h3>\n<p><code>helmet<\/code> gibi bir k\u00fct\u00fcphane kullanarak HTTP g\u00fcvenlik ba\u015fl\u0131klar\u0131n\u0131 otomatik olarak ayarlay\u0131n. Bu ba\u015fl\u0131klar, uygulaman\u0131z\u0131 XSS, t\u0131klama doland\u0131r\u0131c\u0131l\u0131\u011f\u0131 (clickjacking) gibi sald\u0131r\u0131lara kar\u015f\u0131 korur.<\/p>\n<pre><code class=\"language-javascript\">\nconst helmet = require('helmet');\napp.use(helmet());\n  <\/pre>\n<p><\/code><\/p>\n<h3>8. Performans \u0130pu\u00e7lar\u0131<\/h3>\n<ul>\n<li><strong>Veritaban\u0131 Sorgu Optimizasyonu:<\/strong> Yetkilendirme middleware'lar\u0131 genellikle veritaban\u0131 sorgular\u0131 i\u00e7erir (\u00f6rne\u011fin, kullan\u0131c\u0131 rol\u00fcn\u00fc almak, kaynak sahibini bulmak). Bu sorgular\u0131n optimize edildi\u011finden ve indekslendi\u011finden emin olun.<\/li>\n<li><strong>\u00d6nbellekleme:<\/strong> S\u0131k\u00e7a eri\u015filen ancak nadiren de\u011fi\u015fen yetkilendirme verilerini (\u00f6rne\u011fin, rollerin izinleri) \u00f6nbelle\u011fe almay\u0131 d\u00fc\u015f\u00fcnebilirsiniz.<\/li>\n<li><strong>Asenkron \u0130\u015flemler:<\/strong> T\u00fcm I\/O i\u015flemleri (veritaban\u0131, dosya sistemi) asenkron olarak yap\u0131lmal\u0131d\u0131r ki Node.js'in non-blocking yap\u0131s\u0131ndan tam olarak faydalan\u0131ls\u0131n.<\/li>\n<\/ul>\n<h3>Mobil Uyumlu HTML ve \u00c7apraz Platform Uygulamalar<\/h3>\n<p>Modern uygulamalar sadece web taray\u0131c\u0131lar\u0131nda de\u011fil, mobil cihazlarda ve farkl\u0131 ekran boyutlar\u0131nda da sorunsuz \u00e7al\u0131\u015fmal\u0131d\u0131r. Yetkilendirme mant\u0131\u011f\u0131 genellikle backend'de y\u00fcr\u00fct\u00fclse de, frontend'de kullan\u0131c\u0131 deneyimini etkiler. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n rol\u00fcne g\u00f6re men\u00fc \u00f6\u011felerini veya butonlar\u0131 dinamik olarak g\u00f6stermek\/gizlemek gibi. Bu nedenle, kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fcz\u00fcn rol ve yetki de\u011fi\u015fikliklerine duyarl\u0131 olmas\u0131 \u00f6nemlidir. Mobil uyumluluk i\u00e7in CSS media query'ler kullanmak, farkl\u0131 cihazlara g\u00f6re aray\u00fcz\u00fc adapte etmenin temelidir:<\/p>\n<pre><code class=\"language-css\">\n\/* Genel stil *\/\n.admin-button {\n    display: none; \/* Varsay\u0131lan olarak gizle *\/\n}\n\n\/* Masa\u00fcst\u00fc ve tabletler i\u00e7in (\u00f6rne\u011fin 768px ve \u00fczeri) *\/\n@media screen and (min-width: 768px) {\n    .admin-button.show-for-admin {\n        display: block; \/* Y\u00f6neticiler i\u00e7in g\u00f6r\u00fcn\u00fcr yap *\/\n    }\n}\n\n\/* Mobil cihazlar i\u00e7in (\u00f6rne\u011fin 767px ve alt\u0131) *\/\n@media screen and (max-width: 767px) {\n    .admin-button.show-for-admin {\n        display: inline-block; \/* Mobilde farkl\u0131 bir \u015fekilde g\u00f6ster *\/\n        font-size: 0.8em;\n        padding: 5px 10px;\n    }\n}\n  <\/pre>\n<p><\/code><\/p>\n<p>Bu \u00f6rnek, <code>admin-button<\/code> s\u0131n\u0131f\u0131na sahip bir butonun, y\u00f6neticiler i\u00e7in farkl\u0131 ekran boyutlar\u0131nda nas\u0131l g\u00f6r\u00fcnebilece\u011fini g\u00f6steriyor. Frontend'de, kullan\u0131c\u0131n\u0131n rol\u00fcn\u00fc kontrol eden bir JavaScript kodu veya templating engine'i ile bu <code>show-for-admin<\/code> s\u0131n\u0131f\u0131n\u0131 dinamik olarak ekleyebiliriz.<\/p>\n<aside class=\"tip\">\n    Uzman \u0130pucu: G\u00fcvenlik, katmanl\u0131 bir yakla\u015f\u0131mla sa\u011flanmal\u0131d\u0131r. Yetkilendirme tek ba\u015f\u0131na yeterli de\u011fildir; parolalar\u0131n g\u00fcvenli\u011fi, girdi do\u011frulamas\u0131, oturum y\u00f6netimi ve s\u00fcrekli g\u00fcvenlik g\u00fcncellemeleri gibi di\u011fer t\u00fcm g\u00fcvenlik pratiklerini de uygulamak kritik \u00f6neme sahiptir.<br \/>\n  <\/aside>\n<p>Bu ipu\u00e7lar\u0131, uygulaman\u0131z\u0131n sadece fonksiyonel de\u011fil, ayn\u0131 zamanda g\u00fcvenli ve performansl\u0131 olmas\u0131n\u0131 sa\u011flamak i\u00e7in bir yol haritas\u0131 sunar. Yetkilendirme, bu b\u00fcy\u00fck resmin \u00f6nemli bir par\u00e7as\u0131d\u0131r ve do\u011fru bir \u015fekilde uyguland\u0131\u011f\u0131nda uygulaman\u0131z\u0131n b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc koruman\u0131za yard\u0131mc\u0131 olur.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, modern web uygulamalar\u0131n\u0131n temel bir g\u00fcvenlik bile\u015feni olan yetkilendirme kavram\u0131n\u0131 derinlemesine inceledik ve \u00f6zellikle Passport.js k\u00fct\u00fcphanesini kullanarak Node.js\/Express.js ortam\u0131nda nas\u0131l etkili bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m ele ald\u0131k. Kimlik do\u011frulama ile yetkilendirme aras\u0131ndaki fark\u0131 netle\u015ftirdikten sonra, Passport.js ile temel kimlik do\u011frulama kurulumunu \u00f6\u011frendik. Ard\u0131ndan, en yayg\u0131n yetkilendirme modellerinden biri olan Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc'n\u00fc (RBAC) \u00f6zel middleware'lar arac\u0131l\u0131\u011f\u0131yla nas\u0131l uygulayaca\u011f\u0131m\u0131z\u0131 ve hatta daha gran\u00fcler kontrol gerektiren kaynak tabanl\u0131 yetkilendirme senaryolar\u0131n\u0131 nas\u0131l y\u00f6netece\u011fimizi g\u00f6rd\u00fck. Son olarak, uygulaman\u0131z\u0131n genel g\u00fcvenli\u011fini ve performans\u0131n\u0131 art\u0131rmak i\u00e7in oturum y\u00f6netimi, parola g\u00fcvenli\u011fi, girdi do\u011frulama, rate limiting ve JWT kullan\u0131m\u0131 gibi kritik ipu\u00e7lar\u0131n\u0131 payla\u015ft\u0131k.<\/p>\n<p>Unutulmamal\u0131d\u0131r ki g\u00fcvenlik, s\u00fcrekli bir s\u00fcre\u00e7tir ve hi\u00e7bir zaman tek seferlik bir kurulumla tamamlanmaz. Uygulamalar\u0131n\u0131z\u0131 geli\u015ftirirken bu rehberde sunulan prensipleri ve en iyi uygulamalar\u0131 takip etmek, olas\u0131 g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131 en aza indirmeye ve kullan\u0131c\u0131lar\u0131n\u0131z i\u00e7in g\u00fcvenli bir deneyim sa\u011flamaya yard\u0131mc\u0131 olacakt\u0131r. Passport.js, kimlik do\u011frulama ve yetkilendirme katmanlar\u0131n\u0131 in\u015fa etmek i\u00e7in sa\u011flam ve esnek bir temel sunar; bu temeli do\u011fru bir \u015fekilde kullanarak uygulamalar\u0131n\u0131z\u0131 gelece\u011fe haz\u0131r hale getirebilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<table border=\"1\">\n<thead>\n<tr>\n<th>Soru<\/th>\n<th>Cevap<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Passport.js sadece kimlik do\u011frulama i\u00e7in mi kullan\u0131l\u0131r?<\/strong><\/td>\n<td>Hay\u0131r, Passport.js temelde bir kimlik do\u011frulama k\u00fct\u00fcphanesi olsa da, kimli\u011fi do\u011frulanan kullan\u0131c\u0131n\u0131n bilgilerini (genellikle <code>req.user<\/code> nesnesinde) Express.js middleware zincirine aktar\u0131r. Bu bilgiler, yetkilendirme middleware'lar\u0131 taraf\u0131ndan kullan\u0131larak kullan\u0131c\u0131n\u0131n belirli bir kayna\u011fa veya i\u015fleme eri\u015fim izni olup olmad\u0131\u011f\u0131na karar verilebilir. Dolay\u0131s\u0131yla, yetkilendirme mant\u0131\u011f\u0131n\u0131 entegre etmek i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar.<\/td>\n<\/tr>\n<tr>\n<td><strong>RBAC ve Kaynak Tabanl\u0131 Yetkilendirme aras\u0131ndaki temel fark nedir?<\/strong><\/td>\n<td>RBAC (Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc), kullan\u0131c\u0131lara \"rol\" atan\u0131r ve bu rollere izinler verilir (\u00f6rn. \"admin\" her \u015feyi yapabilir, \"editor\" i\u00e7erik d\u00fczenleyebilir). Kaynak Tabanl\u0131 Yetkilendirme (veya ABAC), izinlerin sadece role g\u00f6re de\u011fil, ayn\u0131 zamanda eri\u015filmeye \u00e7al\u0131\u015f\u0131lan kayna\u011f\u0131n \u00f6zelliklerine veya kayna\u011f\u0131 kimin olu\u015fturdu\u011funa g\u00f6re verilmesidir (\u00f6rn. \"edit\u00f6r sadece kendi g\u00f6nderilerini d\u00fczenleyebilir\"). Kaynak tabanl\u0131 yetkilendirme daha gran\u00fcler kontrol sa\u011flar.<\/td>\n<\/tr>\n<tr>\n<td><strong>Passport.js ile JWT tabanl\u0131 yetkilendirme nas\u0131l yap\u0131l\u0131r?<\/strong><\/td>\n<td>Passport.js, <code>passport-jwt<\/code> gibi \u00f6zel stratejilerle JWT (JSON Web Token) tabanl\u0131 kimlik do\u011frulamay\u0131 destekler. Bu stratejide, kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda bir JWT olu\u015fturulur ve istemciye g\u00f6nderilir. Sonraki her istekte istemci bu JWT'yi g\u00f6nderir ve <code>passport-jwt<\/code> middleware'\u0131 belirteci do\u011frulayarak kullan\u0131c\u0131n\u0131n kimli\u011fini onaylar. Yetkilendirme kararlar\u0131 yine <code>req.user<\/code> nesnesine eklenen JWT payload'\u0131ndaki bilgilere (\u00f6rn. rol) dayan\u0131r.<\/td>\n<\/tr>\n<tr>\n<td><strong>Yetkilendirme middleware'lar\u0131m\u0131n performans\u0131n\u0131 nas\u0131l optimize edebilirim?<\/strong><\/td>\n<td>Performans optimizasyonu i\u00e7in birka\u00e7 y\u00f6ntem vard\u0131r: Veritaban\u0131 sorgular\u0131n\u0131 optimize edin ve indeksler kullan\u0131n. S\u0131k\u00e7a eri\u015filen ancak nadiren de\u011fi\u015fen yetkilendirme verilerini (\u00f6rn. rollerin izinleri) \u00f6nbelle\u011fe al\u0131n. Middleware zincirinde gereksiz sorgular\u0131 veya karma\u015f\u0131k hesaplamalar\u0131 erken kesmeye \u00e7al\u0131\u015f\u0131n. Ayr\u0131ca, t\u00fcm I\/O i\u015flemlerini asenkron olarak y\u00fcr\u00fctt\u00fc\u011f\u00fcn\u00fczden emin olun.<\/td>\n<\/tr>\n<tr>\n<td><strong>Sadece yetkilendirme middleware'\u0131 kullanmak yeterli mi?<\/strong><\/td>\n<td>Hay\u0131r, tek ba\u015f\u0131na yetkilendirme middleware'\u0131 yeterli de\u011fildir. G\u00fcvenlik, \u00e7ok katmanl\u0131 bir yakla\u015f\u0131mla sa\u011flanmal\u0131d\u0131r. Parola hash'leme, oturum y\u00f6netimi, girdi do\u011frulama, rate limiting, g\u00fcvenlik ba\u015fl\u0131klar\u0131 (Helmet) gibi di\u011fer g\u00fcvenlik pratiklerini de uygulaman\u0131z kritik \u00f6neme sahiptir. Yetkilendirme, bu g\u00fcvenlik katmanlar\u0131ndan sadece biridir.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131,&hellip;","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-32731","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>Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131<\/title>\n<meta name=\"description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware&#039;i olan Passport.js&#039;i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.\" \/>\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\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware&#039;i olan Passport.js&#039;i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-25T05:31: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=\"29 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131\",\"datePublished\":\"2025-10-25T05:31:17+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\"},\"wordCount\":4298,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\",\"name\":\"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-25T05:31:17+00:00\",\"description\":\"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware'i olan Passport.js'i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131\"}]},{\"@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":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131","description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware'i olan Passport.js'i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.","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\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/","og_locale":"tr_TR","og_type":"article","og_title":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131","og_description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware'i olan Passport.js'i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.","og_url":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-25T05:31:17+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"29 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131","datePublished":"2025-10-25T05:31:17+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/"},"wordCount":4298,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/","url":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/","name":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-25T05:31:17+00:00","description":"Modern web uygulamalar\u0131, kullan\u0131c\u0131lar\u0131n ki\u015fisel verilerinden finansal i\u015flemlere kadar geni\u015f bir yelpazede hassas bilgileri bar\u0131nd\u0131r\u0131r. Bu bilgilerin korunmas\u0131, sadece etik bir sorumluluk de\u011fil, ayn\u0131 zamanda yasal bir zorunluluktur. Peki, bir kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131nda, yani kimli\u011fi do\u011fruland\u0131\u011f\u0131nda, hangi kaynaklara eri\u015febilece\u011fine veya hangi i\u015flemleri yapabilece\u011fine nas\u0131l karar veririz? \u0130\u015fte bu noktada yetkilendirme (authorization) devreye girer. Yetkilendirme, kullan\u0131c\u0131lar\u0131n belirli kaynaklara veya i\u015flevlere eri\u015fim haklar\u0131n\u0131 tan\u0131mlayan ve uygulayan kritik bir g\u00fcvenlik mekanizmas\u0131d\u0131r. Do\u011fru uygulanmayan bir yetkilendirme sistemi, veri ihlallerine, yetkisiz eri\u015fimlere ve potansiyel olarak \u00e7ok ciddi g\u00fcvenlik zafiyetlerine yol a\u00e7abilir. Bu makalede, Node.js ekosisteminin pop\u00fcler kimlik do\u011frulama middleware'i olan Passport.js'i kullanarak yetkilendirmeyi nas\u0131l ba\u015far\u0131l\u0131 bir \u015fekilde uygulayaca\u011f\u0131m\u0131z\u0131 derinlemesine inceleyece\u011fiz. Amac\u0131m\u0131z, uygulamalar\u0131n\u0131z\u0131n sadece kimlik do\u011frulamada de\u011fil, ayn\u0131 zamanda yetkilendirme katman\u0131nda da sa\u011flam ve g\u00fcvenli olmas\u0131n\u0131 sa\u011flamakt\u0131r.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/auth-series-5-passport-js-ile-yetkilendirme-uygulamasi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Auth Series #5: Passport.js ile Yetkilendirme Uygulamas\u0131"}]},{"@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\/32731","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=32731"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32731\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32731"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32731"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32731"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}