{"id":31314,"date":"2025-10-08T14:31:42","date_gmt":"2025-10-08T11:31:42","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/"},"modified":"2025-10-08T14:31:42","modified_gmt":"2025-10-08T11:31:42","slug":"express-auth-boilerplate-modern-apilar-icin-temiz-mimari","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/","title":{"rendered":"Express Auth Boilerplate: Modern API&#8217;lar \u0130\u00e7in Temiz Mimari"},"content":{"rendered":"<p><body><\/p>\n<p>Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.<\/p>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, her t\u00fcrl\u00fc uygulaman\u0131n belkemi\u011fini API&#8217;lar olu\u015fturuyor. Mobil uygulamalardan web sitelerine, IoT cihazlar\u0131ndan mikro hizmetlere kadar her yerde veri al\u0131\u015fveri\u015fi ve i\u015f mant\u0131\u011f\u0131 API&#8217;lar arac\u0131l\u0131\u011f\u0131yla y\u00fcr\u00fct\u00fcl\u00fcyor. Ancak bu dinamik ortam, geli\u015ftiricileri \u00f6nemli zorluklarla kar\u015f\u0131 kar\u015f\u0131ya b\u0131rak\u0131yor. Ba\u015flang\u0131\u00e7ta k\u00fc\u00e7\u00fck bir proje olarak tasarlanan bir API, k\u0131sa s\u00fcrede karma\u015f\u0131k bir yap\u0131ya d\u00f6n\u00fc\u015febilir. Bu durum, &#8220;spagetti kod&#8221; olarak adland\u0131r\u0131lan, bak\u0131m\u0131 zor, yeni \u00f6zellik eklenmesi riskli ve hata ay\u0131klamas\u0131 zaman al\u0131c\u0131 bir kod taban\u0131na yol a\u00e7abilir. Projeler b\u00fcy\u00fcd\u00fck\u00e7e, performans sorunlar\u0131, g\u00fcvenlik a\u00e7\u0131klar\u0131 ve \u00f6l\u00e7eklenebilirlik k\u0131s\u0131tlamalar\u0131 gibi engeller de ka\u00e7\u0131n\u0131lmaz hale gelir. \u00d6zellikle kimlik do\u011frulama ve yetkilendirme gibi kritik g\u00fcvenlik mekanizmalar\u0131, yanl\u0131\u015f uyguland\u0131\u011f\u0131nda t\u00fcm sistemin g\u00fcvenli\u011fini tehlikeye atabilir.<\/p>\n<p>Peki, bu zorluklar\u0131n \u00fcstesinden nas\u0131l gelinebilir? \u00c7\u00f6z\u00fcm, do\u011fru mimari yakla\u015f\u0131mlar\u0131 benimsemekten ve kan\u0131tlanm\u0131\u015f \u015fablonlar\u0131 kullanmaktan ge\u00e7iyor. Temiz Mimari (Clean Architecture) gibi prensipler, kodun farkl\u0131 katmanlara ayr\u0131lmas\u0131n\u0131 sa\u011flayarak her bir katman\u0131n belirli bir sorumlulu\u011fu \u00fcstlenmesini hedefler. Bu sayede ba\u011f\u0131ml\u0131l\u0131klar azal\u0131r, kod daha mod\u00fcler hale gelir ve test edilebilirlik artar. Ancak s\u0131f\u0131rdan temiz mimariye uygun bir yap\u0131 kurmak, \u00f6zellikle proje zaman \u00e7izelgeleri k\u0131s\u0131tl\u0131 oldu\u011funda, \u00f6nemli bir ba\u015flang\u0131\u00e7 maliyeti ve \u00f6\u011frenme e\u011frisi gerektirebilir. \u0130\u015fte bu noktada bir &#8220;boilerplate&#8221; yani haz\u0131r \u015fablon, geli\u015ftiricilerin hayat\u0131n\u0131 kolayla\u015ft\u0131r\u0131r. Express Auth Boilerplate, Node.js ve Express.js ile g\u00fcvenli ve \u00f6l\u00e7eklenebilir API&#8217;lar geli\u015ftirmek isteyen ekipler i\u00e7in temiz mimari prensiplerini uygulayan, \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f bir ba\u015flang\u0131\u00e7 noktas\u0131 sunar. Bu \u015fablon sayesinde geli\u015ftiriciler, temel kimlik do\u011frulama ve yetkilendirme altyap\u0131s\u0131n\u0131 kurmakla vakit kaybetmek yerine, do\u011frudan i\u015f mant\u0131\u011f\u0131na odaklanabilirler. B\u00f6ylece hem geli\u015ftirme s\u00fcresi k\u0131sal\u0131r hem de projenin uzun vadeli s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve g\u00fcvenli\u011fi ba\u015ftan sa\u011flanm\u0131\u015f olur. Bu makale boyunca, Express Auth Boilerplate&#8217;in ne oldu\u011funu, neden \u00f6nemli oldu\u011funu ve modern API&#8217;lar\u0131n\u0131zda nas\u0131l kullanabilece\u011finizi ad\u0131m ad\u0131m inceleyece\u011fiz. Geli\u015fiminizi h\u0131zland\u0131racak, API&#8217;lar\u0131n\u0131z\u0131 daha sa\u011flam hale getirecek ve ekibinizin verimlili\u011fini art\u0131racak bu g\u00fc\u00e7l\u00fc arac\u0131 ke\u015ffetmeye haz\u0131r olun.<\/p>\n<h2>Temiz Mimari Nedir ve Express.js ile Nas\u0131l Birle\u015fir?<\/h2>\n<p>Temiz Mimari (Clean Architecture), yaz\u0131l\u0131m sistemlerinin bak\u0131m\u0131n\u0131 kolayla\u015ft\u0131rmak, esnekli\u011fini art\u0131rmak ve ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 azaltmak amac\u0131yla Uncle Bob (Robert C. Martin) taraf\u0131ndan ortaya konulan bir tasar\u0131m prensipleri k\u00fcmesidir. Bu mimarinin temel amac\u0131, i\u015f kurallar\u0131n\u0131 (i\u015f mant\u0131\u011f\u0131n\u0131) kullan\u0131c\u0131 aray\u00fcz\u00fc, veritaban\u0131 veya harici k\u00fct\u00fcphaneler gibi uygulama detaylar\u0131ndan ay\u0131rmakt\u0131r. Bir ba\u015fka deyi\u015fle, yaz\u0131l\u0131m\u0131n \u00e7ekirde\u011fi, \u00e7evresel fakt\u00f6rlerden ba\u011f\u0131ms\u0131z ve de\u011fi\u015ftirilebilir olmal\u0131d\u0131r. Temiz mimari, bir dizi e\u015fmerkezli daire \u015feklinde g\u00f6rselle\u015ftirilebilir; i\u00e7 daireler en soyut ve genel olan\u0131 temsil ederken, d\u0131\u015f daireler en somut ve uygulamaya \u00f6zel olan\u0131 temsil eder. Bu yap\u0131n\u0131n merkezinde &#8220;Entities&#8221; (Varl\u0131klar) yer al\u0131r ki bunlar uygulaman\u0131n ana i\u015f kurallar\u0131n\u0131 ve verilerini i\u00e7erir. Bir sonraki katman &#8220;Use Cases&#8221; (Kullan\u0131m Durumlar\u0131) veya &#8220;Interactors&#8221; olarak adland\u0131r\u0131l\u0131r; bu katman, uygulaman\u0131n \u00f6zel i\u015f kurallar\u0131n\u0131 ve kullan\u0131c\u0131 eylemlerini y\u00f6netir. D\u0131\u015f katmanlarda ise &#8220;Adapters&#8221; (Adapt\u00f6rler) bulunur; bunlar i\u00e7 katmanlarla d\u0131\u015f katmanlar (veritaban\u0131, UI, API a\u011f ge\u00e7itleri) aras\u0131nda k\u00f6pr\u00fc g\u00f6revi g\u00f6r\u00fcr. En d\u0131\u015f katman ise &#8220;Frameworks and Drivers&#8221; (\u00c7er\u00e7eveler ve S\u00fcr\u00fcc\u00fcler) olarak adland\u0131r\u0131l\u0131r; burada Express.js, veritaban\u0131 s\u00fcr\u00fcc\u00fcleri, UI \u00e7er\u00e7eveleri gibi somut ara\u00e7lar bulunur.<\/p>\n<p>Bu yap\u0131n\u0131n en kritik kural\u0131 &#8220;Ba\u011f\u0131ml\u0131l\u0131k Kural\u0131&#8221;d\u0131r: D\u0131\u015f katmanlar i\u00e7 katmanlara ba\u011f\u0131ml\u0131 olabilirken, i\u00e7 katmanlar d\u0131\u015f katmanlara kesinlikle ba\u011f\u0131ml\u0131 olmamal\u0131d\u0131r. Yani, Entities, Use Cases&#8217;den haberdar de\u011fildir ve Use Cases de Adapters&#8217;dan veya Frameworks&#8217;ten haberdar de\u011fildir. Bu ba\u011f\u0131ms\u0131zl\u0131k, uygulaman\u0131n \u00e7ekirde\u011finin tamamen soyut kalmas\u0131n\u0131 sa\u011flar ve herhangi bir d\u0131\u015f bile\u015fenin de\u011fi\u015ftirilmesi durumunda i\u00e7 i\u015f mant\u0131\u011f\u0131n\u0131n etkilenmemesini garantiler. \u00d6rne\u011fin, bir veritaban\u0131 sisteminden di\u011ferine ge\u00e7i\u015f yapmak, sadece ilgili adapt\u00f6r katman\u0131nda de\u011fi\u015fiklik yap\u0131lmas\u0131n\u0131 gerektirirken, i\u015f kurallar\u0131n\u0131 i\u00e7eren Use Cases ve Entities katmanlar\u0131 tamamen dokunulmadan kal\u0131r. Bu durum, \u00f6zellikle b\u00fcy\u00fck \u00f6l\u00e7ekli ve uzun \u00f6m\u00fcrl\u00fc projelerde bak\u0131m kolayl\u0131\u011f\u0131, test edilebilirlik ve esneklik a\u00e7\u0131s\u0131ndan muazzam avantajlar sa\u011flar.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: Temiz Mimari, ba\u011f\u0131ml\u0131l\u0131klar\u0131 tek y\u00f6nl\u00fc hale getirerek kod taban\u0131n\u0131z\u0131n mod\u00fclerli\u011fini ve test edilebilirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.\n<\/div>\n<p>Peki, Express.js gibi bir web \u00e7er\u00e7evesi bu yap\u0131ya nas\u0131l entegre edilir? Express.js, Temiz Mimari&#8217;nin en d\u0131\u015f katman\u0131 olan &#8220;Frameworks and Drivers&#8221; katman\u0131na aittir. Routing, middleware y\u00f6netimi ve HTTP istek\/cevap d\u00f6ng\u00fcs\u00fc gibi g\u00f6revleri \u00fcstlenir. Express Auth Boilerplate, Express.js&#8217;i bu d\u0131\u015f katmanda kullanarak, gelen HTTP isteklerini i\u015fler, uygun adapt\u00f6rler arac\u0131l\u0131\u011f\u0131yla i\u00e7 katmanlardaki Use Cases&#8217;leri tetikler ve sonu\u00e7lar\u0131 HTTP yan\u0131t\u0131 olarak d\u00f6nd\u00fcr\u00fcr. \u00d6rne\u011fin, bir kullan\u0131c\u0131 kay\u0131t iste\u011fi geldi\u011finde, Express.js rotas\u0131 bu iste\u011fi al\u0131r, ilgili &#8220;Adapter&#8221; (\u00f6rne\u011fin, bir Controller) iste\u011fi ayr\u0131\u015ft\u0131r\u0131r, bu Adapter &#8220;Use Case&#8221; katman\u0131ndaki &#8216;Kullan\u0131c\u0131 Kaydet&#8217; i\u015flevini \u00e7a\u011f\u0131r\u0131r. &#8216;Kullan\u0131c\u0131 Kaydet&#8217; Use Case&#8217;i, i\u015f kurallar\u0131n\u0131 (\u00f6rne\u011fin, \u015fifre politikalar\u0131) uygulad\u0131ktan sonra veriyi &#8220;Entity&#8221; katman\u0131na uygun hale getirir ve son olarak bir &#8220;Gateway&#8221; (ba\u015fka bir adapt\u00f6r t\u00fcr\u00fc, \u00f6rne\u011fin bir Repository) arac\u0131l\u0131\u011f\u0131yla veritaban\u0131na kaydeder. Bu ak\u0131\u015f, Express.js&#8217;in sadece bir orkestrasyon arac\u0131 olarak kullan\u0131lmas\u0131n\u0131 ve \u00e7ekirdek i\u015f mant\u0131\u011f\u0131ndan tamamen ayr\u0131lmas\u0131n\u0131 sa\u011flar. B\u00f6ylece, uygulaman\u0131z\u0131n Express.js yerine ba\u015fka bir web \u00e7er\u00e7evesiyle de\u011fi\u015ftirilmesi gerekti\u011finde bile, ana i\u015f kurallar\u0131n\u0131z\u0131n sa\u011flam kalaca\u011f\u0131ndan emin olabilirsiniz. Bu entegrasyon, API&#8217;lar\u0131n\u0131z\u0131n sadece fonksiyonel de\u011fil, ayn\u0131 zamanda mimari a\u00e7\u0131dan da sa\u011flam, esnek ve gelece\u011fe haz\u0131r olmas\u0131n\u0131 garantiler.<\/p>\n<h2>Express Auth Boilerplate&#8217;in Yap\u0131 Ta\u015flar\u0131 Nelerdir?<\/h2>\n<p>Express Auth Boilerplate, Temiz Mimari prensiplerine s\u0131k\u0131 s\u0131k\u0131ya ba\u011fl\u0131 kalarak tasarlanm\u0131\u015f mod\u00fcler bir yap\u0131ya sahiptir. Bu yap\u0131, projenin b\u00fcy\u00fckl\u00fc\u011f\u00fc ne olursa olsun y\u00f6netilebilirli\u011fini ve esnekli\u011fini korumas\u0131n\u0131 sa\u011flar. Boilerplate&#8217;in temel amac\u0131, kimlik do\u011frulama (authentication) ve yetkilendirme (authorization) s\u00fcre\u00e7lerini sa\u011flam bir altyap\u0131 \u00fczerine oturtmakt\u0131r. Genellikle a\u015fa\u011f\u0131daki ana dizin yap\u0131s\u0131 ve bile\u015fenleri etraf\u0131nda \u015fekillenir:<\/p>\n<ul>\n<li>\n        <strong>src\/core:<\/strong> Bu katman, uygulaman\u0131n \u00e7ekirdek i\u015f kurallar\u0131n\u0131 ve varl\u0131klar\u0131n\u0131 (entities) bar\u0131nd\u0131r\u0131r. En soyut ve ba\u011f\u0131ms\u0131z katmand\u0131r.<\/p>\n<ul>\n<li><strong>entities:<\/strong> Kullan\u0131c\u0131, Rol, Oturum gibi temel i\u015f varl\u0131klar\u0131n\u0131n tan\u0131mland\u0131\u011f\u0131 yerdir. Bunlar sade JavaScript\/TypeScript s\u0131n\u0131flar\u0131 veya aray\u00fczleridir, herhangi bir veritaban\u0131 veya \u00e7er\u00e7eve ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 i\u00e7ermezler. \u00d6rne\u011fin, bir <code>User<\/code> s\u0131n\u0131f\u0131 sadece kullan\u0131c\u0131ya ait \u00f6zellikleri (id, email, password, roles) tan\u0131mlar.<\/li>\n<li><strong>exceptions:<\/strong> Uygulaman\u0131n \u00f6zel hata t\u00fcrlerinin (\u00f6rn. <code>UserNotFoundException<\/code>, <code>InvalidCredentialsException<\/code>) tan\u0131mland\u0131\u011f\u0131 yerdir. Bu sayede hatalar daha anlaml\u0131 ve yap\u0131sal hale gelir.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>src\/usecases:<\/strong> &#8220;Application Business Rules&#8221; katman\u0131d\u0131r. Kullan\u0131c\u0131lar\u0131n veya sistemin ger\u00e7ekle\u015ftirebilece\u011fi t\u00fcm i\u015flevleri (kullan\u0131m durumlar\u0131n\u0131) i\u00e7erir. \u00d6rne\u011fin, <code>RegisterUserUseCase<\/code>, <code>LoginUserUseCase<\/code>, <code>GetUserProfileUseCase<\/code> gibi i\u015flevler burada bulunur. Her bir kullan\u0131m durumu, ba\u011f\u0131ms\u0131z bir i\u015f mant\u0131\u011f\u0131 par\u00e7as\u0131n\u0131 temsil eder ve Entities katman\u0131ndaki varl\u0131klar \u00fczerinde i\u015flemler yapar. Bu katman, harici detaylardan tamamen soyutlanm\u0131\u015ft\u0131r ve veritaban\u0131 veya web \u00e7er\u00e7evesi gibi somut detaylardan habersizdir.<\/li>\n<li>\n        <strong>src\/adapters:<\/strong> Bu katman, i\u00e7 katmanlar (core, usecases) ile d\u0131\u015f katmanlar (frameworks, veritaban\u0131) aras\u0131nda adaptasyon sa\u011flar. Gelen istekleri i\u00e7 katmanlar\u0131n anlayaca\u011f\u0131 formata \u00e7evirir ve i\u00e7 katmanlardan gelen sonu\u00e7lar\u0131 d\u0131\u015f katmanlar\u0131n anlayaca\u011f\u0131 formata geri \u00e7evirir.<\/p>\n<ul>\n<li><strong>controllers:<\/strong> Gelen HTTP isteklerini i\u015fler, parametreleri do\u011frular ve ilgili kullan\u0131m durumlar\u0131n\u0131 (use cases) \u00e7a\u011f\u0131r\u0131r. Sonu\u00e7lar\u0131 HTTP yan\u0131t\u0131 olarak d\u00f6nd\u00fcrmekten sorumludur. \u00d6rne\u011fin, <code>AuthController<\/code>, kay\u0131t ve giri\u015f isteklerini y\u00f6netir.<\/li>\n<li><strong>repositories:<\/strong> Veritaban\u0131 ile etkile\u015fimi soyutlayan aray\u00fczlerdir (interface). <code>IUserRepository<\/code> gibi aray\u00fczler tan\u0131mlan\u0131r ve bu aray\u00fczlerin somut uygulamalar\u0131 (\u00f6rne\u011fin, bir MongoDB deposu veya PostgreSQL deposu) farkl\u0131 bir katmanda bulunur. Bu sayede veritaban\u0131 sistemi de\u011fi\u015ftirilse bile Use Cases katman\u0131n\u0131n etkilenmemesi sa\u011flan\u0131r.<\/li>\n<li><strong>presenters:<\/strong> Kullan\u0131m durumlar\u0131ndan gelen veriyi, kullan\u0131c\u0131 aray\u00fcz\u00fc veya API yan\u0131t\u0131 i\u00e7in uygun formata d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/li>\n<li><strong>middleware:<\/strong> Express.js&#8217;in standart middleware yap\u0131s\u0131n\u0131 kullanarak kimlik do\u011frulama ve yetkilendirme kontrollerini yapar. JWT token do\u011frulama veya rol tabanl\u0131 eri\u015fim kontrol\u00fc gibi i\u015flevler burada yer al\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>src\/frameworks:<\/strong> En d\u0131\u015f katmand\u0131r ve t\u00fcm teknolojiye \u00f6zel detaylar\u0131 i\u00e7erir.<\/p>\n<ul>\n<li><strong>web:<\/strong> Express.js sunucusunun yap\u0131land\u0131r\u0131lmas\u0131, rotalar\u0131n tan\u0131mlanmas\u0131 ve genel hata y\u00f6netimi gibi HTTP ile ilgili t\u00fcm konular burada yer al\u0131r.<\/li>\n<li><strong>database:<\/strong> Veritaban\u0131 ba\u011flant\u0131s\u0131, ORM\/ODM (Object-Relational Mapping \/ Object-Document Mapping) yap\u0131land\u0131rmas\u0131 ve Repository aray\u00fczlerinin somut uygulamalar\u0131 (\u00f6rn. <code>MongoUserRepository<\/code>) burada bulunur.<\/li>\n<li><strong>config:<\/strong> Ortam de\u011fi\u015fkenleri, uygulama ayarlar\u0131 ve di\u011fer yap\u0131land\u0131rma dosyalar\u0131.<\/li>\n<li><strong>utils:<\/strong> Yard\u0131mc\u0131 fonksiyonlar (\u015fifre hashleme, JWT i\u015flemleri vb.) ve \u00fc\u00e7\u00fcnc\u00fc taraf k\u00fct\u00fcphane entegrasyonlar\u0131.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>Bu katmanl\u0131 yap\u0131 sayesinde, \u00f6rne\u011fin, bir kullan\u0131c\u0131 kayd\u0131 i\u015flemi a\u015fa\u011f\u0131daki ad\u0131mlar\u0131 izler:<\/p>\n<ol>\n<li>HTTP iste\u011fi <strong>src\/frameworks\/web<\/strong> katman\u0131ndaki Express.js router taraf\u0131ndan al\u0131n\u0131r.<\/li>\n<li>\u0130stek, <strong>src\/adapters\/controllers<\/strong> katman\u0131ndaki <code>AuthController<\/code>&#8216;a iletilir.<\/li>\n<li><code>AuthController<\/code>, iste\u011fi ayr\u0131\u015ft\u0131r\u0131r ve <strong>src\/usecases<\/strong> katman\u0131ndaki <code>RegisterUserUseCase<\/code>&#8216;i \u00e7a\u011f\u0131r\u0131r.<\/li>\n<li><code>RegisterUserUseCase<\/code>, gerekli i\u015f kurallar\u0131n\u0131 uygular (\u00f6rne\u011fin, e-posta format\u0131n\u0131 kontrol eder) ve <strong>src\/core\/entities<\/strong> katman\u0131ndaki <code>User<\/code> varl\u0131\u011f\u0131n\u0131 kullan\u0131r.<\/li>\n<li><code>RegisterUserUseCase<\/code>, kullan\u0131c\u0131 verilerini kaydetmek i\u00e7in <strong>src\/adapters\/repositories<\/strong> katman\u0131ndaki <code>IUserRepository<\/code> aray\u00fcz\u00fcn\u00fc kullan\u0131r.<\/li>\n<li>Bu aray\u00fcz\u00fcn somut uygulamas\u0131 olan <strong>src\/frameworks\/database<\/strong> katman\u0131ndaki <code>MongoUserRepository<\/code> (veya benzeri) veriyi MongoDB&#8217;ye kaydeder.<\/li>\n<li>Sonu\u00e7, ters bir ak\u0131\u015fla <code>AuthController<\/code>&#8216;a geri d\u00f6ner ve HTTP yan\u0131t\u0131 olarak kullan\u0131c\u0131ya g\u00f6nderilir.<\/li>\n<\/ol>\n<p>Bu sayede her bile\u015fen kendi sorumlulu\u011funu bilir, ba\u011f\u0131ms\u0131zd\u0131r ve test edilebilirli\u011fi y\u00fcksektir. Bu mod\u00fcler yap\u0131, projenin sadece bug\u00fcnk\u00fc de\u011fil, yar\u0131nki ihtiya\u00e7lar\u0131na da kolayca uyum sa\u011flamas\u0131na olanak tan\u0131r.<\/p>\n<h2>Ad\u0131m Ad\u0131m Kurulum ve \u0130lk Kullan\u0131m: Express Auth Boilerplate Nas\u0131l Ba\u015flat\u0131l\u0131r?<\/h2>\n<p>Express Auth Boilerplate&#8217;i projenize entegre etmek veya yeni bir projeye ba\u015flamak olduk\u00e7a basittir. Bu ad\u0131m ad\u0131m rehber, boilerplate&#8217;i sisteminizde nas\u0131l \u00e7al\u0131\u015ft\u0131raca\u011f\u0131n\u0131z\u0131 ve temel bir kullan\u0131c\u0131 kay\u0131t\/giri\u015f ak\u0131\u015f\u0131n\u0131 nas\u0131l test edece\u011finizi g\u00f6sterecektir. Temiz mimarinin sa\u011flad\u0131\u011f\u0131 faydalar\u0131 an\u0131nda hissedeceksiniz.<\/p>\n<h3>1. \u00d6nko\u015fullar\u0131n\u0131z\u0131 Kontrol Edin<\/h3>\n<p>Ba\u015flamadan \u00f6nce, sisteminizde a\u015fa\u011f\u0131daki yaz\u0131l\u0131mlar\u0131n kurulu oldu\u011fundan emin olun:<\/p>\n<ul>\n<li><strong>Node.js:<\/strong> Tercihen LTS (Uzun S\u00fcreli Destek) s\u00fcr\u00fcm\u00fc.<\/li>\n<li><strong>npm<\/strong> (Node Package Manager) veya <strong>Yarn:<\/strong> Node.js ile birlikte gelir.<\/li>\n<li><strong>Git:<\/strong> Depoyu klonlamak i\u00e7in gereklidir.<\/li>\n<li><strong>Veritaban\u0131:<\/strong> Boilerplate genellikle MongoDB&#8217;yi destekler. Yerel bir MongoDB sunucusu veya bir bulut servisi (\u00f6rne\u011fin MongoDB Atlas) kullanabilirsiniz.<\/li>\n<\/ul>\n<h3>2. Boilerplate Deponuzu Klonlay\u0131n<\/h3>\n<p>\u0130lk ad\u0131m, boilerplate&#8217;in kaynak kodunu kendi yerel makinenize indirmektir. Komut sat\u0131r\u0131n\u0131z\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\n  git clone [boilerplate-depo-adresi]\n  cd [klonlad\u0131\u011f\u0131n\u0131z-klas\u00f6r-ad\u0131]\n<\/pre>\n<p><\/code><\/p>\n<p><code>[boilerplate-depo-adresi]<\/code> yerine boilerplate'in GitHub veya benzeri bir depodaki URL'sini yap\u0131\u015ft\u0131rman\u0131z gerekmektedir. \u00d6rne\u011fin, e\u011fer bu bir a\u00e7\u0131k kaynak proje ise, URL'yi projenin sayfas\u0131nda bulabilirsiniz.<\/p>\n<h3>3. Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleyin<\/h3>\n<p>Depoyu klonlad\u0131ktan sonra, projenin ihtiya\u00e7 duydu\u011fu t\u00fcm Node.js ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fcklemeniz gerekir. Proje dizinine gittikten sonra a\u015fa\u011f\u0131daki komutlardan birini \u00e7al\u0131\u015ft\u0131r\u0131n:<\/p>\n<pre><code class=\"language-bash\">\n  npm install\n  # veya\n  yarn install\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, <code>package.json<\/code> dosyas\u0131nda listelenen t\u00fcm paketleri indirip <code>node_modules<\/code> klas\u00f6r\u00fcne yerle\u015ftirecektir. Bu s\u00fcre\u00e7, projenin t\u00fcm k\u00fct\u00fcphanelerini ve ara\u00e7lar\u0131n\u0131 kullan\u0131labilir hale getirir.<\/p>\n<h3>4. Ortam De\u011fi\u015fkenlerini Yap\u0131land\u0131r\u0131n (.env)<\/h3>\n<p>Boilerplate, hassas bilgileri (veritaban\u0131 ba\u011flant\u0131 dizeleri, JWT anahtarlar\u0131 vb.) do\u011frudan kod i\u00e7inde tutmak yerine ortam de\u011fi\u015fkenleri arac\u0131l\u0131\u011f\u0131yla y\u00f6netir. Bu, g\u00fcvenli ve esnek bir yakla\u015f\u0131md\u0131r. Klonlad\u0131\u011f\u0131n\u0131z dizinin k\u00f6k\u00fcnde genellikle <code>.env.example<\/code> ad\u0131nda bir dosya bulunur. Bu dosyay\u0131 kopyalayarak <code>.env<\/code> ad\u0131nda yeni bir dosya olu\u015fturun ve kendi ortam\u0131n\u0131za uygun \u015fekilde d\u00fczenleyin:<\/p>\n<pre><code class=\"language-bash\">\n  cp .env.example .env\n<\/pre>\n<p><\/code><\/p>\n<p>Ard\u0131ndan <code>.env<\/code> dosyas\u0131n\u0131 a\u00e7\u0131n ve a\u015fa\u011f\u0131daki gibi gerekli bilgileri doldurun:<\/p>\n<pre><code class=\"language-plaintext\">\n  NODE_ENV=development\n  PORT=3000\n  DATABASE_URL=mongodb:\/\/localhost:27017\/your_database_name\n  JWT_SECRET=SUPER_SECRET_KEY_FOR_JWT\n  JWT_EXPIRES_IN=1h\n  REFRESH_TOKEN_SECRET=ANOTHER_SUPER_SECRET_KEY\n  REFRESH_TOKEN_EXPIRES_IN=7d\n<\/pre>\n<p><\/code><\/p>\n<p><code>DATABASE_URL<\/code>'yi kendi MongoDB ba\u011flant\u0131 dizenizle de\u011fi\u015ftirmeniz \u00e7ok \u00f6nemlidir. <code>JWT_SECRET<\/code> ve <code>REFRESH_TOKEN_SECRET<\/code> i\u00e7in g\u00fc\u00e7l\u00fc, rastgele anahtarlar kullanmal\u0131s\u0131n\u0131z. Bunlar\u0131 \u00fcretim ortam\u0131nda asla varsay\u0131lan de\u011ferlerle b\u0131rakmay\u0131n.<\/p>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: \u00dcretim ortam\u0131nda hassas verilerinizi <code>.env<\/code> dosyas\u0131 yerine, bulut sa\u011flay\u0131c\u0131n\u0131z\u0131n ortam de\u011fi\u015fkeni y\u00f6netim sistemlerini (AWS Secrets Manager, Azure Key Vault vb.) kullanarak saklay\u0131n. Bu, g\u00fcvenlik seviyesini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131racakt\u0131r.\n<\/div>\n<h3>5. Sunucuyu Ba\u015flat\u0131n<\/h3>\n<p>Her \u015fey haz\u0131r oldu\u011funda, sunucuyu ba\u015flatmak i\u00e7in a\u015fa\u011f\u0131daki komutu kullanabilirsiniz:<\/p>\n<pre><code class=\"language-bash\">\n  npm run dev\n  # veya\n  yarn dev\n<\/pre>\n<p><\/code><\/p>\n<p>Bu komut, projenizi geli\u015ftirme modunda \u00e7al\u0131\u015ft\u0131racak ve genellikle dosya de\u011fi\u015fikliklerini otomatik olarak alg\u0131lay\u0131p sunucuyu yeniden ba\u015flatacakt\u0131r (nodemon gibi bir ara\u00e7 kullan\u0131l\u0131yorsa). Konsolda \"Server running on port 3000\" gibi bir mesaj g\u00f6rmelisiniz.<\/p>\n<h3>6. \u0130lk Kullan\u0131c\u0131 Kayd\u0131n\u0131 ve Giri\u015fini Test Edin<\/h3>\n<p>Sunucu ba\u015far\u0131yla \u00e7al\u0131\u015ft\u0131\u011f\u0131nda, API'n\u0131z\u0131n u\u00e7 noktalar\u0131na istek g\u00f6ndererek temel i\u015flevleri test edebilirsiniz. Bunun i\u00e7in Postman, Insomnia veya cURL gibi ara\u00e7lar\u0131 kullanabilirsiniz. A\u015fa\u011f\u0131da \u00f6rnek bir kullan\u0131c\u0131 kay\u0131t ve giri\u015f ak\u0131\u015f\u0131 i\u00e7in cURL komutlar\u0131 bulunmaktad\u0131r:<\/p>\n<h4>Kullan\u0131c\u0131 Kayd\u0131 (Register):<\/h4>\n<p><code>\/api\/v1\/auth\/register<\/code> u\u00e7 noktas\u0131na bir POST iste\u011fi g\u00f6nderin.<\/p>\n<pre><code class=\"language-bash\">\n  curl -X POST -H \"Content-Type: application\/json\" -d '{\n    \"email\": \"test@example.com\",\n    \"password\": \"Password123!\"\n  }' http:\/\/localhost:3000\/api\/v1\/auth\/register\n<\/pre>\n<p><\/code><\/p>\n<p>Ba\u015far\u0131l\u0131 bir kay\u0131t sonras\u0131, kullan\u0131c\u0131 objesi veya bir ba\u015far\u0131 mesaj\u0131 almal\u0131s\u0131n\u0131z. Hata durumunda ise ilgili hata mesaj\u0131n\u0131 g\u00f6receksiniz.<\/p>\n<h4>Kullan\u0131c\u0131 Giri\u015fi (Login):<\/h4>\n<p><code>\/api\/v1\/auth\/login<\/code> u\u00e7 noktas\u0131na bir POST iste\u011fi g\u00f6nderin.<\/p>\n<pre><code class=\"language-bash\">\n  curl -X POST -H \"Content-Type: application\/json\" -d '{\n    \"email\": \"test@example.com\",\n    \"password\": \"Password123!\"\n  }' http:\/\/localhost:3000\/api\/v1\/auth\/login\n<\/pre>\n<p><\/code><\/p>\n<p>Ba\u015far\u0131l\u0131 bir giri\u015f sonras\u0131, genellikle bir JWT eri\u015fim token'\u0131 (access token) ve bir yenileme token'\u0131 (refresh token) almal\u0131s\u0131n\u0131z. Eri\u015fim token'\u0131, yetkilendirme gerektiren di\u011fer API u\u00e7 noktalar\u0131na istek g\u00f6nderirken kullan\u0131lacakt\u0131r.<\/p>\n<pre><code class=\"language-json\">\n  {\n    \"message\": \"Login successful\",\n    \"data\": {\n      \"accessToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\",\n      \"refreshToken\": \"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...\"\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<p>Bu ad\u0131mlar\u0131 tamamlad\u0131\u011f\u0131n\u0131zda, Express Auth Boilerplate'i ba\u015far\u0131yla kurmu\u015f ve temel kimlik do\u011frulama i\u015flevlerini test etmi\u015f olacaks\u0131n\u0131z. Art\u0131k kendi i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 ve \u00f6zelliklerinizi bu sa\u011flam temel \u00fczerine in\u015fa etmeye ba\u015flayabilirsiniz. Geli\u015ftirme s\u00fcrecine ba\u015flarken Temiz Mimari prensiplerine sad\u0131k kalmak, projenizin uzun \u00f6m\u00fcrl\u00fc ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h2>Kullan\u0131c\u0131 Kimlik Do\u011frulama ve Yetkilendirme Ak\u0131\u015flar\u0131 Nas\u0131l Y\u00f6netilir?<\/h2>\n<p>Modern API'lar\u0131n en kritik bile\u015fenlerinden ikisi, kullan\u0131c\u0131lar\u0131n kimli\u011fini do\u011frulamak (Authentication) ve onlar\u0131n belirli kaynaklara eri\u015fim yetkilerini belirlemek (Authorization) i\u015flemleridir. Express Auth Boilerplate, bu s\u00fcre\u00e7leri Temiz Mimari prensipleriyle entegre ederek hem g\u00fcvenli hem de esnek bir yap\u0131 sunar. JWT (JSON Web Token) kullan\u0131m\u0131, bu boilerplate'in temelini olu\u015fturur ve API'lar i\u00e7in durumsuz (stateless) bir kimlik do\u011frulama mekanizmas\u0131 sa\u011flar.<\/p>\n<h3>1. Kullan\u0131c\u0131 Kay\u0131t (Register) ve Giri\u015f (Login) \u0130\u015flemleri<\/h3>\n<p>Kullan\u0131c\u0131 kay\u0131t ve giri\u015f i\u015flemleri, <code>src\/usecases<\/code> katman\u0131nda tan\u0131mlanan \u00f6zel kullan\u0131m durumlar\u0131 (use cases) arac\u0131l\u0131\u011f\u0131yla y\u00f6netilir. \u00d6rne\u011fin, bir <code>RegisterUserUseCase<\/code> ve <code>LoginUserUseCase<\/code> bulunur.<\/p>\n<ul>\n<li>\n        <strong>Kay\u0131t (Register):<\/strong> Kullan\u0131c\u0131 e-posta ve \u015fifre gibi temel bilgileri g\u00f6nderdi\u011finde, <code>AuthController<\/code> bu iste\u011fi al\u0131r ve <code>RegisterUserUseCase<\/code>'i \u00e7a\u011f\u0131r\u0131r. <code>RegisterUserUseCase<\/code>, i\u015f kurallar\u0131n\u0131 (\u00f6rn. \u015fifre g\u00fcvenli\u011fi, e-posta format\u0131 kontrol\u00fc) uygular, \u015fifreyi g\u00fcvenli bir \u015fekilde hashler (genellikle bcrypt kullanarak) ve kullan\u0131c\u0131y\u0131 veritaban\u0131na kaydeder.<\/p>\n<pre><code class=\"language-typescript\">\n          \/\/ src\/usecases\/auth\/RegisterUserUseCase.ts\n          import { IUserRepository } from '..\/..\/adapters\/repositories\/IUserRepository';\n          import { User } from '..\/..\/core\/entities\/User';\n          import { HashService } from '..\/..\/frameworks\/utils\/HashService';\n\n          export class RegisterUserUseCase {\n            constructor(\n              private userRepository: IUserRepository,\n              private hashService: HashService\n            ) {}\n\n            async execute(email: string, password: string): Promise<User> {\n              \/\/ \u0130\u015f kurallar\u0131: Email format\u0131, \u015fifre g\u00fcc\u00fc vb.\n              \/\/ ...\n\n              const hashedPassword = await this.hashService.hash(password);\n              const newUser = User.create(email, hashedPassword); \/\/ Entity olu\u015fturma\n              return this.userRepository.save(newUser);\n            }\n          }\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Giri\u015f (Login):<\/strong> Kullan\u0131c\u0131 giri\u015f yapt\u0131\u011f\u0131nda, <code>LoginUserUseCase<\/code> \u00e7a\u011fr\u0131l\u0131r. Bu kullan\u0131m durumu, kullan\u0131c\u0131n\u0131n girdi\u011fi \u015fifreyi veritaban\u0131ndaki hashlenmi\u015f \u015fifre ile kar\u015f\u0131la\u015ft\u0131r\u0131r. E\u015fle\u015fme durumunda, kullan\u0131c\u0131 i\u00e7in bir eri\u015fim token'\u0131 (access token) ve bir yenileme token'\u0131 (refresh token) olu\u015fturulur. Bu token'lar, JWT mekanizmas\u0131 kullan\u0131larak imzalan\u0131r ve kullan\u0131c\u0131ya geri d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">\n          \/\/ src\/usecases\/auth\/LoginUserUseCase.ts\n          import { IUserRepository } from '..\/..\/adapters\/repositories\/IUserRepository';\n          import { HashService } from '..\/..\/frameworks\/utils\/HashService';\n          import { JWTService } from '..\/..\/frameworks\/utils\/JWTService';\n          import { InvalidCredentialsException } from '..\/..\/core\/exceptions\/InvalidCredentialsException';\n\n          export class LoginUserUseCase {\n            constructor(\n              private userRepository: IUserRepository,\n              private hashService: HashService,\n              private jwtService: JWTService\n            ) {}\n\n            async execute(email: string, password: string): Promise<{ accessToken: string; refreshToken: string }> {\n              const user = await this.userRepository.findByEmail(email);\n              if (!user || !(await this.hashService.compare(password, user.password))) {\n                throw new InvalidCredentialsException('Ge\u00e7ersiz e-posta veya \u015fifre.');\n              }\n\n              const accessToken = this.jwtService.generateAccessToken(user.id, user.roles);\n              const refreshToken = this.jwtService.generateRefreshToken(user.id);\n\n              \/\/ Refresh token'\u0131 veritaban\u0131nda saklama veya ba\u015fka bir mekanizma ile ili\u015fkilendirme\n              \/\/ ...\n\n              return { accessToken, refreshToken };\n            }\n          }\n        <\/pre>\n<p><\/code>\n    <\/li>\n<\/ul>\n<h3>2. JWT Token Olu\u015fturma ve Do\u011frulama<\/h3>\n<p>JWT, JSON tabanl\u0131, g\u00fcvenli bir \u015fekilde bilgi al\u0131\u015fveri\u015fi yapmak i\u00e7in kullan\u0131lan kompakt ve URL g\u00fcvenli bir y\u00f6ntemdir. Express Auth Boilerplate'de, <code>src\/frameworks\/utils\/JWTService.ts<\/code> gibi bir yard\u0131mc\u0131 s\u0131n\u0131f, token olu\u015fturma ve do\u011frulama i\u015flemlerini kaps\u00fcller. Eri\u015fim token'\u0131 k\u0131sa \u00f6m\u00fcrl\u00fcd\u00fcr ve her istekte <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131nda <code>Bearer<\/code> \u015femas\u0131yla g\u00f6nderilir. Yenileme token'\u0131 ise daha uzun \u00f6m\u00fcrl\u00fcd\u00fcr ve eri\u015fim token'\u0131n\u0131n s\u00fcresi doldu\u011funda yenisini almak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/utils\/JWTService.ts\n  import jwt from 'jsonwebtoken';\n  import config from '..\/..\/config';\n\n  export class JWTService {\n    generateAccessToken(userId: string, roles: string[]): string {\n      return jwt.sign({ userId, roles }, config.jwt.secret, {\n        expiresIn: config.jwt.expiresIn,\n      });\n    }\n\n    generateRefreshToken(userId: string): string {\n      return jwt.sign({ userId }, config.refreshToken.secret, {\n        expiresIn: config.refreshToken.expiresIn,\n      });\n    }\n\n    verifyAccessToken(token: string): any {\n      return jwt.verify(token, config.jwt.secret);\n    }\n\n    verifyRefreshToken(token: string): any {\n      return jwt.verify(token, config.refreshToken.secret);\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<h3>3. Middleware Kullan\u0131m\u0131 ile Kimlik Do\u011frulama<\/h3>\n<p>Geleneksel Express.js uygulamalar\u0131nda oldu\u011fu gibi, boilerplate'de de kimlik do\u011frulama ve yetkilendirme i\u00e7in middleware'ler kullan\u0131l\u0131r. <code>src\/adapters\/middleware\/AuthMiddleware.ts<\/code> gibi bir dosya, gelen iste\u011fin <code>Authorization<\/code> ba\u015fl\u0131\u011f\u0131ndaki JWT token'\u0131n\u0131 do\u011frulamaktan sorumludur. Token ge\u00e7erliyse, kullan\u0131c\u0131 bilgileri (ID, roller vb.) <code>req<\/code> objesine eklenir ve istek bir sonraki i\u015fleyiciye (handler) iletilir. E\u011fer token yoksa veya ge\u00e7ersizse, genellikle 401 (Unauthorized) yan\u0131t\u0131 d\u00f6nd\u00fcr\u00fcl\u00fcr.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/adapters\/middleware\/AuthMiddleware.ts\n  import { Request, Response, NextFunction } from 'express';\n  import { JWTService } from '..\/..\/frameworks\/utils\/JWTService';\n\n  export const authMiddleware = (jwtService: JWTService) => (\n    req: Request,\n    res: Response,\n    next: NextFunction\n  ) => {\n    const authHeader = req.headers.authorization;\n    if (!authHeader || !authHeader.startsWith('Bearer ')) {\n      return res.status(401).json({ message: 'Eri\u015fim token\\'\u0131 bulunamad\u0131.' });\n    }\n\n    const token = authHeader.split(' ')[1];\n    try {\n      const decoded = jwtService.verifyAccessToken(token);\n      \/\/ req.user = decoded; \/\/ Kullan\u0131c\u0131 bilgilerini iste\u011fe ekle\n      next();\n    } catch (error) {\n      return res.status(401).json({ message: 'Ge\u00e7ersiz veya s\u00fcresi dolmu\u015f token.' });\n    }\n  };\n<\/pre>\n<p><\/code><\/p>\n<h3>4. Yetkilendirme Mekanizmalar\u0131 (Rol Tabanl\u0131 Eri\u015fim Kontrol\u00fc - RBAC)<\/h3>\n<p>Kimlik do\u011frulama, kullan\u0131c\u0131n\u0131n kim oldu\u011funu belirlerken, yetkilendirme kullan\u0131c\u0131n\u0131n neye eri\u015febilece\u011fini belirler. Boilerplate, genellikle rol tabanl\u0131 eri\u015fim kontrol\u00fc (RBAC) i\u00e7in bir mekanizma sunar. Kullan\u0131c\u0131lar, kay\u0131t s\u0131ras\u0131nda veya bir y\u00f6netici taraf\u0131ndan belirli rollerle (\u00f6rn. 'admin', 'editor', 'user') etiketlenir. JWT token'\u0131na bu roller dahil edilebilir. Ard\u0131ndan, bir kayna\u011fa eri\u015fim gerektiren rotalara \u00f6zel yetkilendirme middleware'lar\u0131 eklenebilir. Bu middleware, kullan\u0131c\u0131n\u0131n JWT'sindeki rolleri kontrol ederek, istenen kayna\u011fa eri\u015fim yetkisinin olup olmad\u0131\u011f\u0131n\u0131 belirler.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/adapters\/middleware\/RoleMiddleware.ts\n  import { Request, Response, NextFunction } from 'express';\n  import { UnauthorizedException } from '..\/..\/core\/exceptions\/UnauthorizedException';\n\n  export const authorizeRoles = (requiredRoles: string[]) => (\n    req: Request,\n    res: Response,\n    next: NextFunction\n  ) => {\n    \/\/ req.user objesinden rolleri al\u0131n (AuthMiddleware taraf\u0131ndan eklenmi\u015f olmal\u0131)\n    const userRoles = (req as any).user?.roles || [];\n\n    const hasPermission = requiredRoles.some(role => userRoles.includes(role));\n    if (!hasPermission) {\n      return res.status(403).json({ message: 'Bu kayna\u011fa eri\u015fim yetkiniz yok.' });\n    }\n    next();\n  };\n<\/pre>\n<p><\/code><\/p>\n<p>Bu middleware'lar, Express.js rotalar\u0131na kolayca eklenebilir:<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/web\/routes\/userRoutes.ts\n  import { Router } from 'express';\n  import { authMiddleware } from '..\/..\/adapters\/middleware\/AuthMiddleware';\n  import { authorizeRoles } from '..\/..\/adapters\/middleware\/RoleMiddleware';\n  \/\/ ... di\u011fer importlar\n\n  const router = Router();\n  \/\/ ... authService, jwtService, vs. injection\n\n  router.get(\n    '\/profile',\n    authMiddleware(jwtService),\n    (req, res) => { \/* Kullan\u0131c\u0131 profili getir *\/ }\n  );\n\n  router.post(\n    '\/admin\/users',\n    authMiddleware(jwtService),\n    authorizeRoles(['admin']), \/\/ Sadece admin rol\u00fcne sahip kullan\u0131c\u0131lar eri\u015febilir\n    (req, res) => { \/* Yeni kullan\u0131c\u0131 olu\u015ftur *\/ }\n  );\n<\/pre>\n<p><\/code><\/p>\n<p>Bu \u015fekilde, Express Auth Boilerplate, sa\u011flam bir kimlik do\u011frulama ve yetkilendirme altyap\u0131s\u0131 sa\u011flayarak API'lar\u0131n\u0131z\u0131n g\u00fcvenli\u011fini ve eri\u015fim kontrol\u00fcn\u00fc etkili bir \u015fekilde y\u00f6netmenize olanak tan\u0131r. Her bir bile\u015fenin kendi sorumlulu\u011funu \u00fcstlenmesi ve Temiz Mimari prensiplerine uygun olarak ayr\u0131lmas\u0131, bu karma\u015f\u0131k s\u00fcre\u00e7leri daha anla\u015f\u0131l\u0131r ve y\u00f6netilebilir k\u0131lar.<\/p>\n<h2>Performans ve G\u00fcvenlik \u0130yile\u015ftirmeleri: Modern API'lar \u0130\u00e7in \u0130pu\u00e7lar\u0131 Nelerdir?<\/h2>\n<p>Bir API'nin ba\u015far\u0131s\u0131, yaln\u0131zca i\u015flevselli\u011fiyle de\u011fil, ayn\u0131 zamanda performans\u0131 ve g\u00fcvenli\u011fiyle de \u00f6l\u00e7\u00fcl\u00fcr. Express Auth Boilerplate, Temiz Mimari'nin sa\u011flad\u0131\u011f\u0131 temel g\u00fcvenli\u011fi ve mod\u00fclerli\u011fi zaten sunarken, modern API'lar i\u00e7in ek performans ve g\u00fcvenlik iyile\u015ftirmeleri yapmak projenizin kalitesini ve dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 art\u0131racakt\u0131r. Bu b\u00f6l\u00fcmde, deneyimli geli\u015ftiriciler i\u00e7in ileri d\u00fczey ipu\u00e7lar\u0131n\u0131 ve p\u00fcf noktalar\u0131n\u0131 ele alaca\u011f\u0131z.<\/p>\n<h3>1. G\u00fc\u00e7l\u00fc Hashing Algoritmalar\u0131 ve Tuzlama<\/h3>\n<p>\u015eifrelerin d\u00fcz metin olarak saklanmas\u0131 asla kabul edilemez. \u015eifreleri hashlemek, bir gereklilikten \u00f6te bir zorunluluktur. Express Auth Boilerplate, genellikle bcrypt gibi kan\u0131tlanm\u0131\u015f bir hashing algoritmas\u0131 kullan\u0131r. Bcrypt, \u015fifreleri tek y\u00f6nl\u00fc bir hash'e d\u00f6n\u00fc\u015ft\u00fcrmekle kalmaz, ayn\u0131 zamanda her hash i\u015flemi i\u00e7in benzersiz bir \"tuz\" (salt) \u00fcreterek g\u00f6kku\u015fa\u011f\u0131 tablolar\u0131 (rainbow tables) gibi sald\u0131r\u0131lara kar\u015f\u0131 diren\u00e7 sa\u011flar. Ayr\u0131ca, i\u015f y\u00fck\u00fcn\u00fc (cost factor) ayarlayarak hashleme s\u00fcresini art\u0131rabilir, bu da kaba kuvvet sald\u0131r\u0131lar\u0131na kar\u015f\u0131 daha fazla g\u00fcvenlik sa\u011flar. \u00dcretim ortam\u0131nda, bu i\u015f y\u00fck\u00fc fakt\u00f6r\u00fcn\u00fc sunucunuzun performans\u0131n\u0131 a\u015f\u0131r\u0131 etkilemeyecek ancak yeterince diren\u00e7li olacak \u015fekilde ayarlamak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/utils\/HashService.ts (\u00d6rnek bcrypt kullan\u0131m\u0131)\n  import bcrypt from 'bcrypt';\n  import config from '..\/..\/config'; \/\/ Tuzlama fakt\u00f6r\u00fc buradan al\u0131nabilir\n\n  export class HashService {\n    private readonly saltRounds: number;\n\n    constructor() {\n      this.saltRounds = config.bcrypt.saltRounds || 10; \/\/ Varsay\u0131lan 10\n    }\n\n    async hash(password: string): Promise<string> {\n      return bcrypt.hash(password, this.saltRounds);\n    }\n\n    async compare(password: string, hash: string): Promise<boolean> {\n      return bcrypt.compare(password, hash);\n    }\n  }\n<\/pre>\n<p><\/code><\/p>\n<h3>2. G\u00fcvenlik Mekanizmalar\u0131: Helmet.js ve Rate Limiting<\/h3>\n<p>Express uygulamalar\u0131 i\u00e7in Helmet.js, \u00e7e\u015fitli HTTP ba\u015fl\u0131klar\u0131n\u0131 ayarlayarak bilinen web g\u00fcvenlik a\u00e7\u0131klar\u0131n\u0131n bir\u00e7o\u011fundan korunmaya yard\u0131mc\u0131 olan bir middleware koleksiyonudur. \u00d6rne\u011fin, XSS (Cross-Site Scripting), CSRF (Cross-Site Request Forgery) ve di\u011fer code injection sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olabilir. Projenizin <code>src\/frameworks\/web\/server.ts<\/code> dosyas\u0131nda uygulaman\u0131z\u0131n ilk ba\u015flang\u0131c\u0131nda bu middleware'i eklemek kritik \u00f6neme sahiptir.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/web\/server.ts (\u00d6rnek Helmet.js kullan\u0131m\u0131)\n  import express from 'express';\n  import helmet from 'helmet';\n\n  const app = express();\n  app.use(helmet()); \/\/ T\u00fcm g\u00fcvenlik ba\u015fl\u0131klar\u0131n\u0131 otomatik olarak ayarlar\n  \/\/ ... di\u011fer middleware'ler ve rotalar\n<\/pre>\n<p><\/code><\/p>\n<p>Rate limiting (oran s\u0131n\u0131rlama), API'nizi k\u00f6t\u00fc niyetli veya a\u015f\u0131r\u0131 kullan\u0131mdan korumak i\u00e7in hayati \u00f6neme sahiptir. Giri\u015f denemeleri, \u015fifre s\u0131f\u0131rlama istekleri veya belirli hassas u\u00e7 noktalar i\u00e7in bir kullan\u0131c\u0131 veya IP adresinden belirli bir s\u00fcre i\u00e7inde gelen istek say\u0131s\u0131n\u0131 s\u0131n\u0131rlayabilirsiniz. Bu, kaba kuvvet sald\u0131r\u0131lar\u0131n\u0131 veya hizmet reddi (DoS) sald\u0131r\u0131lar\u0131n\u0131 \u00f6nlemeye yard\u0131mc\u0131 olur. <code>express-rate-limit<\/code> gibi k\u00fct\u00fcphaneler bu konuda yard\u0131mc\u0131 olabilir.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/web\/server.ts (\u00d6rnek Rate Limiting kullan\u0131m\u0131)\n  import rateLimit from 'express-rate-limit';\n\n  const limiter = rateLimit({\n    windowMs: 15 * 60 * 1000, \/\/ 15 dakika\n    max: 100, \/\/ Her IP i\u00e7in 15 dakikada 100 istek\n    message: '\u00c7ok fazla istek, l\u00fctfen daha sonra tekrar deneyin.',\n  });\n\n  \/\/ Belirli rotalara uygulay\u0131n\n  app.use('\/api\/v1\/auth\/login', limiter);\n  app.use('\/api\/v1\/auth\/register', limiter);\n<\/pre>\n<p><\/code><\/p>\n<h3>3. Veritaban\u0131 Optimizasyonu<\/h3>\n<p>Performans\u0131n \u00f6nemli bir k\u0131sm\u0131 veritaban\u0131 i\u015flemlerinden gelir. N+1 sorgu sorunlar\u0131n\u0131 \u00f6nlemek, do\u011fru indeksleri kullanmak ve karma\u015f\u0131k sorgular i\u00e7in optimize edilmi\u015f yakla\u015f\u0131mlar geli\u015ftirmek \u00e7ok \u00f6nemlidir. ORM\/ODM kullan\u0131yorsan\u0131z (\u00f6rne\u011fin Mongoose), \"populate\" veya \"select\" gibi \u00f6zellikleri ak\u0131ll\u0131ca kullanarak sadece ihtiyac\u0131n\u0131z olan verileri \u00e7ekmeye \u00f6zen g\u00f6sterin. Temiz Mimari sayesinde, veritaban\u0131 etkile\u015fimleri <code>Repository<\/code> katman\u0131nda kaps\u00fcllendi\u011fi i\u00e7in, optimizasyonlar bu katmanda yo\u011funla\u015fabilir ve uygulaman\u0131n geri kalan\u0131n\u0131 etkilemez.<\/p>\n<h3>4. Cacheleme Stratejileri<\/h3>\n<p>S\u0131k\u00e7a eri\u015filen ve nadiren de\u011fi\u015fen veriler i\u00e7in cacheleme kullanmak, veritaban\u0131 y\u00fck\u00fcn\u00fc azaltarak API yan\u0131t s\u00fcrelerini \u00f6nemli \u00f6l\u00e7\u00fcde h\u0131zland\u0131rabilir. Redis gibi bir in-memory veri deposu, kullan\u0131c\u0131 oturumlar\u0131, s\u0131k\u00e7a istenen \u00fcr\u00fcn listeleri veya konfig\u00fcrasyon verileri i\u00e7in etkili bir \u00f6nbellek \u00e7\u00f6z\u00fcm\u00fc sunar. Cacheleme mant\u0131\u011f\u0131n\u0131, <code>src\/adapters\/gateways<\/code> veya <code>src\/frameworks\/utils<\/code> katmanlar\u0131nda soyutlayarak Temiz Mimari prensiplerine uygun kalabilirsiniz.<\/p>\n<h3>5. Sa\u011fl\u0131kl\u0131 Logging ve Hata \u0130zleme<\/h3>\n<p>\u00dcretim ortam\u0131ndaki sorunlar\u0131 h\u0131zl\u0131ca tespit etmek ve \u00e7\u00f6zmek i\u00e7in kapsaml\u0131 logging (kay\u0131t tutma) ve hata izleme sistemleri vazge\u00e7ilmezdir. Winston veya Pino gibi k\u00fct\u00fcphanelerle yap\u0131land\u0131r\u0131lm\u0131\u015f bir loglama sistemi, uygulama davran\u0131\u015f\u0131n\u0131, istek\/yan\u0131t d\u00f6ng\u00fclerini ve hata durumlar\u0131n\u0131 detayl\u0131 bir \u015fekilde kaydetmelidir. Sentry veya New Relic gibi hata izleme ara\u00e7lar\u0131, hatalar\u0131 ger\u00e7ek zamanl\u0131 olarak yakalaman\u0131za, hata ba\u011flam\u0131n\u0131 anlaman\u0131za ve \u00fcretim sorunlar\u0131na proaktif bir \u015fekilde m\u00fcdahale etmenize olanak tan\u0131r. Uygulaman\u0131z\u0131n her katman\u0131nda anlaml\u0131 log mesajlar\u0131 \u00fcretmek, hata ay\u0131klama s\u00fcrecini b\u00fcy\u00fck \u00f6l\u00e7\u00fcde h\u0131zland\u0131r\u0131r.<\/p>\n<pre><code class=\"language-typescript\">\n  \/\/ src\/frameworks\/utils\/Logger.ts (Basit bir logger \u00f6rne\u011fi)\n  import winston from 'winston';\n\n  const logger = winston.createLogger({\n    level: 'info',\n    format: winston.format.combine(\n      winston.format.timestamp(),\n      winston.format.json()\n    ),\n    transports: [\n      new winston.transports.Console(),\n      new winston.transports.File({ filename: 'error.log', level: 'error' }),\n      new winston.transports.File({ filename: 'combined.log' }),\n    ],\n  });\n\n  export { logger };\n<\/pre>\n<p><\/code><\/p>\n<p>Bu iyile\u015ftirmeleri Express Auth Boilerplate ile birle\u015ftirmek, sadece fonksiyonel de\u011fil, ayn\u0131 zamanda y\u00fcksek performansl\u0131, g\u00fcvenli ve s\u00fcrd\u00fcr\u00fclebilir modern API'lar olu\u015fturman\u0131za yard\u0131mc\u0131 olacakt\u0131r. Her bir optimizasyonun, uygulaman\u0131z\u0131n genel sa\u011fl\u0131\u011f\u0131na nas\u0131l katk\u0131da bulundu\u011funu d\u00fc\u015f\u00fcnerek ilerlemeniz \u00f6nemlidir.<\/p>\n<h2>Vaka Analizi: B\u00fcy\u00fck \u00d6l\u00e7ekli Bir Projede Express Auth Boilerplate Nas\u0131l Kullan\u0131l\u0131r?<\/h2>\n<p>Bir e-ticaret platformu veya SaaS (Hizmet Olarak Yaz\u0131l\u0131m) uygulamas\u0131 gibi b\u00fcy\u00fck \u00f6l\u00e7ekli projeler, karma\u015f\u0131k i\u015f mant\u0131\u011f\u0131, y\u00fcksek kullan\u0131c\u0131 trafi\u011fi ve s\u00fcrekli geni\u015fleyen \u00f6zellik setleriyle karakterize edilir. Bu t\u00fcr projelerde, \"spagetti kod\" tuza\u011f\u0131na d\u00fc\u015fmek ve bak\u0131m kabiliyetini kaybetmek olduk\u00e7a kolayd\u0131r. \u0130\u015fte bu noktada Express Auth Boilerplate'in Temiz Mimari yakla\u015f\u0131m\u0131, geli\u015ftirme s\u00fcrecini d\u00f6n\u00fc\u015ft\u00fcrebilecek kritik bir avantaj sunar. Gelin, hayali bir \"GlobalE-Ticaret\" platformunun bu boilerplate'i nas\u0131l kulland\u0131\u011f\u0131na dair bir vaka analizini inceleyelim.<\/p>\n<h3>Senaryo: GlobalE-Ticaret Platformu<\/h3>\n<p>GlobalE-Ticaret, d\u00fcnya \u00e7ap\u0131nda milyonlarca kullan\u0131c\u0131s\u0131 olan, binlerce sat\u0131c\u0131y\u0131 ve milyonlarca \u00fcr\u00fcn\u00fc bar\u0131nd\u0131ran kapsaml\u0131 bir e-ticaret platformudur. Platform, \u00fcr\u00fcn listeleme, sepet y\u00f6netimi, \u00f6deme i\u015flemleri, kullan\u0131c\u0131 profilleri, sipari\u015f takibi ve sat\u0131c\u0131 paneli gibi bir\u00e7ok mikro hizmetten olu\u015fan karma\u015f\u0131k bir API altyap\u0131s\u0131na sahiptir. Ba\u015flang\u0131\u00e7ta monolotik bir yap\u0131yla ba\u015flanm\u0131\u015f ancak h\u0131zla \u00f6l\u00e7eklenebilirlik, bak\u0131m kolayl\u0131\u011f\u0131 ve tak\u0131m i\u00e7i i\u015fbirli\u011fi sorunlar\u0131 ya\u015fanm\u0131\u015ft\u0131r. Bu sorunlar\u0131 a\u015fmak i\u00e7in API'lar mikro hizmetlere ayr\u0131\u015ft\u0131r\u0131lm\u0131\u015f ve her bir mikro hizmet i\u00e7in Temiz Mimari prensiplerine dayal\u0131 Express Auth Boilerplate kullanma karar\u0131 al\u0131nm\u0131\u015ft\u0131r.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik Zorluklar\u0131 ve Boilerplate'in Katk\u0131lar\u0131<\/h3>\n<ol>\n<li>\n        <strong>Kullan\u0131c\u0131 Y\u00f6netimi ve Kimlik Do\u011frulama Mikro Hizmeti:<\/strong> GlobalE-Ticaret'in en kritik bile\u015fenlerinden biri, milyonlarca kullan\u0131c\u0131n\u0131n kay\u0131t, giri\u015f, \u015fifre s\u0131f\u0131rlama, rol y\u00f6netimi gibi i\u015flemlerini y\u00f6neten \"Auth Service\" idi. Ba\u015flang\u0131\u00e7taki monolotik yap\u0131, bu i\u015flemleri merkezi bir noktada tuttu\u011fu i\u00e7in performans darbo\u011fazlar\u0131na ve g\u00fcvenlik risklerine yol a\u00e7\u0131yordu. Express Auth Boilerplate kullan\u0131larak, Auth Service tamamen ba\u011f\u0131ms\u0131z bir mikro hizmet olarak yeniden tasarland\u0131.<\/p>\n<ul>\n<li><strong>Avantaj\u0131:<\/strong> Boilerplate'in sa\u011flam JWT tabanl\u0131 kimlik do\u011frulama mekanizmas\u0131 sayesinde, kullan\u0131c\u0131 giri\u015fleri h\u0131zl\u0131 ve g\u00fcvenli bir \u015fekilde i\u015flendi. Temiz Mimari, i\u015f kurallar\u0131n\u0131 (\u015fifre hashleme, JWT olu\u015fturma) altyap\u0131 detaylar\u0131ndan (Express.js, veritaban\u0131) ay\u0131rd\u0131\u011f\u0131 i\u00e7in, Auth Service ek y\u00fck olmadan y\u00fcksek trafikte \u00e7al\u0131\u015fabildi ve kolayca yatay olarak \u00f6l\u00e7eklenebildi.<\/li>\n<li><strong>Vaka:<\/strong> Kara Cuma gibi yo\u011fun d\u00f6nemlerde Auth Service, milyonlarca e\u015f zamanl\u0131 giri\u015f iste\u011fini hi\u00e7bir performans d\u00fc\u015f\u00fc\u015f\u00fc ya\u015famadan i\u015fleyebildi, \u00e7\u00fcnk\u00fc i\u015f mant\u0131\u011f\u0131 tamamen optimize edilmi\u015f ve izole edilmi\u015fti.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>\u00dcr\u00fcn ve Sipari\u015f Y\u00f6netimi Mikro Hizmetleri:<\/strong> Auth Service'den ayr\u0131 olarak, \"Product Service\" ve \"Order Service\" gibi di\u011fer mikro hizmetler de boilerplate'in sa\u011flad\u0131\u011f\u0131 temel yap\u0131y\u0131 kulland\u0131. Bu hizmetler, Auth Service'den gelen JWT token'lar\u0131n\u0131 kullanarak kullan\u0131c\u0131lar\u0131n kimli\u011fini do\u011frulad\u0131 ve yetkilendirme middleware'lar\u0131 ile eri\u015fim kontrolleri uygulad\u0131.<\/p>\n<ul>\n<li><strong>Avantaj\u0131:<\/strong> Temiz Mimari, her mikro hizmetin kendi i\u015f mant\u0131\u011f\u0131n\u0131 ba\u011f\u0131ms\u0131z olarak geli\u015ftirmesine olanak tan\u0131d\u0131. \u00d6rne\u011fin, Product Service'deki \"\u00fcr\u00fcn ekle\" i\u015flemi, sadece 'admin' veya 'seller' rol\u00fcne sahip kullan\u0131c\u0131lar taraf\u0131ndan yap\u0131labiliyordu. Bu yetkilendirme mant\u0131\u011f\u0131, kolayca entegre edilen boilerplate middleware'lar\u0131 ile sa\u011fland\u0131.<\/li>\n<li><strong>Vaka:<\/strong> Yeni sat\u0131c\u0131lar\u0131n \u00fcr\u00fcnlerini y\u00fcklemesi veya sipari\u015flerin i\u015flenmesi gibi i\u015flemler, farkl\u0131 mikro hizmetler taraf\u0131ndan y\u00f6netilse de, tutarl\u0131 bir kimlik do\u011frulama ve yetkilendirme standard\u0131 sayesinde sorunsuz bir entegrasyon sa\u011fland\u0131.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<h3>Ek \u00d6zelliklerin Entegrasyonu<\/h3>\n<p>GlobalE-Ticaret platformu, zamanla \u00f6deme sistemleri entegrasyonu, bildirim hizmetleri (e-posta, SMS), indirim kodlar\u0131 y\u00f6netimi gibi bir\u00e7ok ek \u00f6zellik gerektirdi. Express Auth Boilerplate'in mod\u00fcler yap\u0131s\u0131, bu entegrasyonlar\u0131 kolayla\u015ft\u0131rd\u0131:<\/p>\n<ul>\n<li>\n        <strong>\u00d6deme Sistemleri:<\/strong> \u00d6deme hizmetleri (Stripe, PayPal) i\u00e7in <code>src\/adapters\/gateways<\/code> katman\u0131nda \u00f6zel adapt\u00f6rler olu\u015fturuldu. Bu sayede, \u00f6deme mant\u0131\u011f\u0131 \u00e7ekirdek i\u015f kurallar\u0131ndan ayr\u0131ld\u0131 ve farkl\u0131 \u00f6deme sa\u011flay\u0131c\u0131lar\u0131 aras\u0131nda ge\u00e7i\u015f yapmak olduk\u00e7a kolayla\u015ft\u0131.<\/p>\n<pre><code class=\"language-typescript\">\n          \/\/ src\/adapters\/gateways\/IPaymentGateway.ts\n          interface IPaymentGateway {\n            charge(amount: number, token: string): Promise<any>;\n          }\n\n          \/\/ src\/frameworks\/integrations\/StripePaymentGateway.ts\n          class StripePaymentGateway implements IPaymentGateway { \/* ... *\/ }\n        <\/pre>\n<p><\/code>\n    <\/li>\n<li>\n        <strong>Bildirimler:<\/strong> Kullan\u0131c\u0131 kay\u0131tlar\u0131, sipari\u015f g\u00fcncellemeleri gibi olaylar i\u00e7in bildirim g\u00f6ndermek amac\u0131yla <code>src\/usecases<\/code> katman\u0131nda <code>SendEmailNotificationUseCase<\/code> gibi kullan\u0131m durumlar\u0131 tan\u0131mland\u0131 ve bu kullan\u0131m durumlar\u0131 <code>src\/adapters\/gateways<\/code> katman\u0131nda <code>IEmailService<\/code> aray\u00fcz\u00fc ile soyutland\u0131. Somut uygulamalar (\u00f6rne\u011fin SendGrid veya Mailgun entegrasyonlar\u0131) <code>src\/frameworks\/integrations<\/code> alt\u0131nda yer ald\u0131.<\/li>\n<\/ul>\n<h3>Tak\u0131m \u0130\u00e7indeki \u0130\u015fbirli\u011fine Etkisi<\/h3>\n<p>Boilerplate'in sa\u011flad\u0131\u011f\u0131 en b\u00fcy\u00fck faydalardan biri, farkl\u0131 geli\u015ftirme ekiplerinin ayn\u0131 standartlar\u0131 ve mimari prensipleri benimsemesini sa\u011flamas\u0131yd\u0131. Her yeni mikro hizmet projesi ayn\u0131 dizin yap\u0131s\u0131, katmanlama ve kodlama standartlar\u0131yla ba\u015fl\u0131yordu. Bu durum:<\/p>\n<ul>\n<li><strong>\u00d6\u011frenme E\u011frisini Azaltt\u0131:<\/strong> Yeni ekip \u00fcyeleri veya farkl\u0131 mikro hizmetlere ge\u00e7en geli\u015ftiriciler, h\u0131zl\u0131ca adapte olabildi \u00e7\u00fcnk\u00fc t\u00fcm projeler benzer bir yap\u0131ya sahipti.<\/li>\n<li><strong>Kod Kalitesini Art\u0131rd\u0131:<\/strong> Temiz Mimari prensiplerine uyum, daha okunabilir, test edilebilir ve s\u00fcrd\u00fcr\u00fclebilir kod \u00fcretilmesini te\u015fvik etti.<\/li>\n<li><strong>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) Kolayl\u0131\u011f\u0131:<\/strong> Standartla\u015ft\u0131r\u0131lm\u0131\u015f yap\u0131, otomatik testlerin ve da\u011f\u0131t\u0131m pipeline'lar\u0131n\u0131n kurulmas\u0131n\u0131 basitle\u015ftirdi.<\/li>\n<\/ul>\n<div class=\"expert-tip\">\n  Uzman \u0130pucu: B\u00fcy\u00fck ekiplerde, boilerplate kullan\u0131m\u0131 standartla\u015fmay\u0131 sa\u011flayarak \"ortak dil\" olu\u015fturur ve geli\u015ftirici verimlili\u011fini %30'a kadar art\u0131rabilir.\n<\/div>\n<p>Sonu\u00e7 olarak, GlobalE-Ticaret gibi karma\u015f\u0131k bir projede Express Auth Boilerplate kullan\u0131m\u0131, sadece kimlik do\u011frulama ve yetkilendirme sorunlar\u0131n\u0131 \u00e7\u00f6zmekle kalmad\u0131, ayn\u0131 zamanda projenin genel mimari kalitesini y\u00fckselterek \u00f6l\u00e7eklenebilirli\u011fi, bak\u0131m kolayl\u0131\u011f\u0131n\u0131 ve tak\u0131m i\u00e7i i\u015fbirli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde geli\u015ftirdi. Bu vaka analizi, Temiz Mimari'nin ve iyi tasarlanm\u0131\u015f bir boilerplate'in ger\u00e7ek d\u00fcnyadaki de\u011ferini a\u00e7\u0131k\u00e7a ortaya koymaktad\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Modern API geli\u015ftirmenin karma\u015f\u0131k d\u00fcnyas\u0131nda, performans, g\u00fcvenlik ve s\u00fcrd\u00fcr\u00fclebilirlik gibi fakt\u00f6rleri bir arada sa\u011flamak hi\u00e7 bu kadar \u00f6nemli olmam\u0131\u015ft\u0131. Bu makale boyunca, Express Auth Boilerplate'in Temiz Mimari prensiplerini Express.js ile nas\u0131l birle\u015ftirerek geli\u015ftiricilere g\u00fc\u00e7l\u00fc, mod\u00fcler ve \u00f6l\u00e7eklenebilir bir ba\u015flang\u0131\u00e7 noktas\u0131 sundu\u011funu detayl\u0131ca inceledik. Gerek temel kurulum ad\u0131mlar\u0131, gerekse ileri d\u00fczey performans ve g\u00fcvenlik iyile\u015ftirmeleri ve ger\u00e7ek d\u00fcnya vaka analiziyle, bu boilerplate'in modern API ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131lamak i\u00e7in ne kadar uygun oldu\u011funu g\u00f6rm\u00fc\u015f olduk.<\/p>\n<p>Express Auth Boilerplate, sadece h\u0131zl\u0131 bir ba\u015flang\u0131\u00e7 sa\u011flamakla kalmaz, ayn\u0131 zamanda projenizin uzun vadeli sa\u011fl\u0131\u011f\u0131n\u0131 da garanti alt\u0131na al\u0131r. Katmanl\u0131 yap\u0131s\u0131 sayesinde, i\u015f mant\u0131\u011f\u0131n\u0131z\u0131 altyap\u0131 detaylar\u0131ndan ay\u0131rarak test edilebilirli\u011fi art\u0131r\u0131r, ba\u011f\u0131ml\u0131l\u0131klar\u0131 azalt\u0131r ve gelecekteki de\u011fi\u015fikliklere kar\u015f\u0131 esneklik sunar. Kimlik do\u011frulama ve yetkilendirme gibi kritik g\u00fcvenlik bile\u015fenlerini g\u00fcvenli ve standart bir \u015fekilde y\u00f6netmesi, geli\u015ftiricilerin g\u00fcvenlik endi\u015feleriyle bo\u011fu\u015fmak yerine do\u011frudan i\u015f de\u011ferine odaklanmas\u0131n\u0131 sa\u011flar. Sonu\u00e7 olarak, bu boilerplate, karma\u015f\u0131k Node.js API'lar\u0131 geli\u015ftiren her ekip i\u00e7in de\u011ferli bir varl\u0131kt\u0131r. Umuyoruz ki bu makale, Express Auth Boilerplate'i projelerinize entegre etmeniz ve modern API geli\u015ftirme yolculu\u011funuzda size rehberlik etmeniz i\u00e7in ilham vermi\u015ftir.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h3>\n<div class=\"faq-section\">\n<p><strong>1. Express Auth Boilerplate sadece kimlik do\u011frulama i\u00e7in mi kullan\u0131l\u0131r?<\/strong><\/p>\n<p>Hay\u0131r, Express Auth Boilerplate temel olarak g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama ve yetkilendirme altyap\u0131s\u0131 sunsa da, Temiz Mimari prensipleri \u00fczerine in\u015fa edildi\u011fi i\u00e7in her t\u00fcrl\u00fc i\u015f mant\u0131\u011f\u0131n\u0131 entegre etmek i\u00e7in geni\u015fletilebilir. Kay\u0131t, giri\u015f ve rol tabanl\u0131 eri\u015fim kontrol\u00fc gibi temel auth \u00f6zelliklerini sa\u011flarken, ayn\u0131 zamanda i\u015f kurallar\u0131n\u0131z\u0131 ve yeni \u00f6zelliklerinizi mod\u00fcler bir \u015fekilde eklemeniz i\u00e7in sa\u011flam bir temel sunar.<\/p>\n<\/div>\n<div class=\"faq-section\">\n<p><strong>2. Bu boilerplate hangi veritaban\u0131 sistemlerini destekler?<\/strong><\/p>\n<p>Boilerplate, Temiz Mimari'nin esnekli\u011fi sayesinde veritaban\u0131 ba\u011f\u0131ms\u0131zd\u0131r. Genellikle MongoDB gibi NoSQL veritabanlar\u0131yla \u00f6rnekler sunulsa da, <code>src\/adapters\/repositories<\/code> katman\u0131ndaki aray\u00fczler ve <code>src\/frameworks\/database<\/code> katman\u0131ndaki somut uygulamalar de\u011fi\u015ftirilerek PostgreSQL, MySQL veya di\u011fer veritabanlar\u0131yla da kolayca entegre edilebilirsiniz. Tek yapman\u0131z gereken, se\u00e7ti\u011finiz veritaban\u0131na uygun bir Repository uygulamas\u0131n\u0131 yazmak ve mevcut aray\u00fczleri uygulamakt\u0131r.<\/p>\n<\/div>\n<div class=\"faq-section\">\n<p><strong>3. Express Auth Boilerplate'i mevcut bir Express projesine entegre edebilir miyim?<\/strong><\/p>\n<p>Evet, teorik olarak entegre edebilirsiniz, ancak bu biraz \u00e7aba gerektirebilir. Mevcut projenizin mimarisi ve dosya yap\u0131s\u0131 ne kadar Temiz Mimari prensiplerine yak\u0131nsa, entegrasyon o kadar kolay olacakt\u0131r. Genellikle, boilerplate'in <code>src\/core<\/code>, <code>src\/usecases<\/code> ve <code>src\/adapters<\/code> katmanlar\u0131n\u0131 mevcut projenizin ilgili b\u00f6l\u00fcmlerine ta\u015f\u0131mak ve <code>src\/frameworks<\/code> katman\u0131ndaki Express.js yap\u0131land\u0131rmas\u0131n\u0131 kendi projenize uyarlamak gerekebilir. B\u00fcy\u00fck \u00e7apl\u0131 entegrasyonlar yerine yeni bir projeyi bu boilerplate ile ba\u015flatmak genellikle daha verimli olabilir.<\/p>\n<\/div>\n<div class=\"faq-section\">\n<p><strong>4. JWT yerine ba\u015fka bir kimlik do\u011frulama y\u00f6ntemi kullanabilir miyim?<\/strong><\/p>\n<p>Evet, kullanabilirsiniz. Temiz Mimari'nin bir di\u011fer g\u00fczelli\u011fi de budur. JWT ile ilgili t\u00fcm mant\u0131k (token olu\u015fturma, do\u011frulama) <code>src\/frameworks\/utils\/JWTService.ts<\/code> gibi bir yard\u0131mc\u0131 serviste kaps\u00fcllendi\u011fi i\u00e7in, bu servisi ba\u015fka bir kimlik do\u011frulama y\u00f6ntemi (\u00f6rne\u011fin oturum tabanl\u0131 kimlik do\u011frulama veya OAuth sa\u011flay\u0131c\u0131lar\u0131) ile de\u011fi\u015ftirebilirsiniz. Sadece <code>JWTService<\/code>'in aray\u00fcz\u00fcne uygun yeni bir servis olu\u015fturman\u0131z ve bunu ilgili Use Case'lere enjekte etmeniz yeterlidir. \u00c7ekirdek i\u015f mant\u0131\u011f\u0131n\u0131z etkilenmeyecektir.<\/p>\n<\/div>\n<div class=\"faq-section\">\n<p><strong>5. Bu boilerplate mobil uygulamalar i\u00e7in uygun mu?<\/strong><\/p>\n<p>Kesinlikle! Express Auth Boilerplate ile olu\u015fturulan API'lar RESTful (veya GraphQL) prensiplerine uygun \u00e7al\u0131\u015ft\u0131\u011f\u0131 i\u00e7in, mobil uygulamalar (iOS, Android, React Native), tek sayfa uygulamalar\u0131 (SPA'lar) veya di\u011fer herhangi bir istemci uygulamas\u0131 taraf\u0131ndan kolayca t\u00fcketilebilir. JWT token'lar\u0131, mobil cihazlarda g\u00fcvenli bir \u015fekilde saklanabilir ve API isteklerinde kimlik do\u011frulama i\u00e7in kullan\u0131labilir. Boilerplate'in sundu\u011fu g\u00fcvenli ve \u00f6l\u00e7eklenebilir API yap\u0131s\u0131, mobil uygulamalar\u0131n ihtiya\u00e7 duydu\u011fu performans\u0131 ve veri g\u00fcvenli\u011fini fazlas\u0131yla kar\u015f\u0131lar.<\/p>\n<\/div>\n<p><\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede&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-31314","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>Express Auth Boilerplate: Modern API&#039;lar \u0130\u00e7in Temiz Mimari<\/title>\n<meta name=\"description\" content=\"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.\" \/>\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\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Express Auth Boilerplate: Modern API&#039;lar \u0130\u00e7in Temiz Mimari\" \/>\n<meta property=\"og:description\" content=\"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-08T11:31:42+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=\"32 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Express Auth Boilerplate: Modern API&#8217;lar \u0130\u00e7in Temiz Mimari\",\"datePublished\":\"2025-10-08T11:31:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\"},\"wordCount\":5646,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\",\"name\":\"Express Auth Boilerplate: Modern API'lar \u0130\u00e7in Temiz Mimari\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-08T11:31:42+00:00\",\"description\":\"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Express Auth Boilerplate: Modern API&#8217;lar \u0130\u00e7in Temiz Mimari\"}]},{\"@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":"Express Auth Boilerplate: Modern API'lar \u0130\u00e7in Temiz Mimari","description":"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.","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\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/","og_locale":"tr_TR","og_type":"article","og_title":"Express Auth Boilerplate: Modern API'lar \u0130\u00e7in Temiz Mimari","og_description":"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-08T11:31:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"32 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Express Auth Boilerplate: Modern API&#8217;lar \u0130\u00e7in Temiz Mimari","datePublished":"2025-10-08T11:31:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/"},"wordCount":5646,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/","url":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/","name":"Express Auth Boilerplate: Modern API'lar \u0130\u00e7in Temiz Mimari","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-08T11:31:42+00:00","description":"Modern API geli\u015ftirme s\u00fcre\u00e7lerinde kar\u015f\u0131la\u015f\u0131lan en b\u00fcy\u00fck zorluklardan biri, hem h\u0131zl\u0131 geli\u015ftirme d\u00f6ng\u00fcs\u00fc sa\u011flamak hem de uzun vadede bak\u0131m\u0131 kolay, \u00f6l\u00e7eklenebilir ve g\u00fcvenli bir kod taban\u0131 olu\u015fturmakt\u0131r. Bu karma\u015f\u0131k dengeyi sa\u011flamak i\u00e7in s\u0131kl\u0131kla temiz mimari prensipleri ve \u00f6nceden yap\u0131land\u0131r\u0131lm\u0131\u015f \u015fablonlar kullan\u0131l\u0131r. \u0130\u015fte tam da bu noktada, Express.js tabanl\u0131 g\u00fc\u00e7l\u00fc bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunan Express Auth Boilerplate devreye giriyor.","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/express-auth-boilerplate-modern-apilar-icin-temiz-mimari\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Express Auth Boilerplate: Modern API&#8217;lar \u0130\u00e7in Temiz Mimari"}]},{"@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\/31314","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=31314"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/31314\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=31314"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=31314"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=31314"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}