{"id":41701,"date":"2026-05-11T09:03:21","date_gmt":"2026-05-11T06:03:21","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/"},"modified":"2026-05-11T09:03:21","modified_gmt":"2026-05-11T06:03:21","slug":"node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/","title":{"rendered":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<h2>Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Geleneksel kullan\u0131c\u0131 ad\u0131 ve \u015fifre ikilisi, modern web uygulamalar\u0131nda hem g\u00fcvenlik a\u00e7\u0131klar\u0131 hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan giderek daha fazla sorun te\u015fkil ediyor. \u015eifre unutma d\u00f6ng\u00fcleri, zay\u0131f \u015fifre tercihleri ve kimlik av\u0131 (phishing) sald\u0131r\u0131lar\u0131, hem geli\u015ftiricilerin hem de kullan\u0131c\u0131lar\u0131n ba\u015f\u0131n\u0131 a\u011fr\u0131tan yayg\u0131n problemlerdir. Peki, kullan\u0131c\u0131lar\u0131n\u0131z\u0131 \u015fifre derdinden kurtar\u0131rken ayn\u0131 zamanda g\u00fcvenli bir kimlik do\u011frulama s\u00fcreci sunman\u0131n bir yolu var m\u0131? Elbette, Magic Link (Sihirli Ba\u011flant\u0131) tam da bu noktada devreye giriyor. Bu makalede, Node.js kullanarak ad\u0131m ad\u0131m nas\u0131l g\u00fcvenli ve kullan\u0131c\u0131 dostu bir Magic Link kimlik do\u011frulama sistemi olu\u015fturabilece\u011finizi detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h2>Giri\u015f: \u015eifresiz Kimlik Do\u011frulaman\u0131n Y\u00fckseli\u015fi ve Magic Link&#8217;in \u00d6nemi<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dijital d\u00fcnyas\u0131nda, kullan\u0131c\u0131lar\u0131n onlarca farkl\u0131 platform i\u00e7in ak\u0131lda tutmas\u0131 gereken \u015fifre say\u0131s\u0131 her ge\u00e7en g\u00fcn art\u0131yor. Bu durum, \u00e7o\u011fu kullan\u0131c\u0131n\u0131n ya \u00e7ok basit \u015fifreler se\u00e7mesine ya da ayn\u0131 \u015fifreyi birden fazla yerde kullanmas\u0131na yol a\u00e7\u0131yor. Her iki senaryo da g\u00fcvenlik a\u00e7\u0131s\u0131ndan ciddi riskler bar\u0131nd\u0131r\u0131rken, bir yandan da \u015fifre s\u0131f\u0131rlama s\u00fcre\u00e7lerinin karma\u015f\u0131kl\u0131\u011f\u0131 kullan\u0131c\u0131 deneyimini olumsuz etkiliyor. Kullan\u0131c\u0131lar, her yeni uygulamada bir hesap olu\u015fturmak ve bir \u015fifre belirlemek zorunda kalmaktan s\u0131k\u0131lm\u0131\u015f durumda. \u0130\u015fte tam da bu noktada, \u015fifresiz kimlik do\u011frulama (passwordless authentication) kavram\u0131 \u00f6nem kazan\u0131yor. \u015eifresiz kimlik do\u011frulama, kullan\u0131c\u0131lar\u0131n bir \u015fifre hat\u0131rlamak zorunda kalmadan uygulamalar\u0131n\u0131za g\u00fcvenli bir \u015fekilde eri\u015fmesini sa\u011flayan y\u00f6ntemler b\u00fct\u00fcn\u00fcd\u00fcr. Bu y\u00f6ntemler aras\u0131nda en pop\u00fcler ve etkili olanlardan biri de Magic Link&#8217;lerdir.<\/p>\n<p>Magic Link, temel olarak kullan\u0131c\u0131n\u0131n e-posta adresine g\u00f6nderilen, tek kullan\u0131ml\u0131k ve belirli bir s\u00fcre ge\u00e7erli olan \u00f6zel bir ba\u011flant\u0131d\u0131r. Kullan\u0131c\u0131 bu ba\u011flant\u0131ya t\u0131klad\u0131\u011f\u0131nda, sistem otomatik olarak kimli\u011fini do\u011frular ve oturum a\u00e7mas\u0131n\u0131 sa\u011flar. Bu y\u00f6ntem, hem kullan\u0131c\u0131lar i\u00e7in son derece pratik bir deneyim sunar hem de \u015fifrelerin \u00e7al\u0131nmas\u0131 veya unutulmas\u0131 gibi geleneksel g\u00fcvenlik risklerini ortadan kald\u0131r\u0131r. \u00d6rne\u011fin, bir haber b\u00fclteni abonelik servisinde veya bir i\u00e7erik platformunda, kullan\u0131c\u0131lar\u0131n her seferinde \u015fifre girmek yerine e-postalar\u0131na gelen bir linkle h\u0131zl\u0131ca giri\u015f yapabildiklerini d\u00fc\u015f\u00fcn\u00fcn. Bu, hem d\u00f6n\u00fc\u015f\u00fcm oranlar\u0131n\u0131 art\u0131r\u0131r hem de kullan\u0131c\u0131lar\u0131n platformla etkile\u015fimini kolayla\u015ft\u0131r\u0131r. \u00d6zellikle mobil uygulamalarda veya tek sayfal\u0131k uygulamalarda (SPA &#8211; Single Page Application), klavye giri\u015fi gerektirmeyen bu t\u00fcr bir do\u011frulama y\u00f6ntemi, kullan\u0131c\u0131 ak\u0131\u015f\u0131n\u0131 \u00e7ok daha sorunsuz hale getirir. Bu makale boyunca, Node.js ekosistemini kullanarak bu modern ve g\u00fcvenli kimlik do\u011frulama y\u00f6ntemini nas\u0131l hayata ge\u00e7irece\u011finizi ad\u0131m ad\u0131m \u00f6\u011freneceksiniz.<\/p>\n<h2>Magic Link Kimlik Do\u011frulama Nedir ve Neden Kullanmal\u0131s\u0131n\u0131z?<\/h2>\n<p>Magic Link kimlik do\u011frulama, ad\u0131ndan da anla\u015f\u0131laca\u011f\u0131 gibi &#8220;sihirli&#8221; bir ba\u011flant\u0131 arac\u0131l\u0131\u011f\u0131yla kullan\u0131c\u0131lar\u0131n kimli\u011fini do\u011frulama s\u00fcrecidir. Bu sistemde, kullan\u0131c\u0131 bir uygulamaya giri\u015f yapmak istedi\u011finde veya e-posta adresini do\u011frulamak istedi\u011finde, sisteme e-posta adresini girer. Sunucu, bu e-posta adresine \u00f6zel olarak olu\u015fturulmu\u015f, genellikle kriptografik olarak g\u00fcvenli bir token (jeton) i\u00e7eren benzersiz bir URL g\u00f6nderir. Kullan\u0131c\u0131 e-postas\u0131ndaki bu ba\u011flant\u0131ya t\u0131klad\u0131\u011f\u0131nda, sunucu linkteki token&#8217;\u0131 do\u011frular, ge\u00e7erliyse kullan\u0131c\u0131y\u0131 otomatik olarak oturum a\u00e7m\u0131\u015f kabul eder ve genellikle bir oturum jetonu (session token) veya JSON Web Token (JWT) olu\u015fturarak kullan\u0131c\u0131ya geri g\u00f6nderir. Bu i\u015flem, \u015fifre girme ihtiyac\u0131n\u0131 tamamen ortadan kald\u0131r\u0131r ve b\u00f6ylece \u015fifreyle ili\u015fkili t\u00fcm g\u00fcvenlik ve kullan\u0131labilirlik sorunlar\u0131n\u0131 \u00e7\u00f6zm\u00fc\u015f olur.<\/p>\n<p>Peki, Magic Link&#8217;i neden kullanmal\u0131s\u0131n\u0131z? \u00d6ncelikle, <strong>kullan\u0131c\u0131 deneyimi<\/strong> a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantajlar sunar. Kullan\u0131c\u0131lar\u0131n karma\u015f\u0131k \u015fifreler hat\u0131rlamas\u0131na veya s\u00fcrekli \u015fifre s\u0131f\u0131rlama s\u00fcre\u00e7leriyle u\u011fra\u015fmas\u0131na gerek kalmaz. Tek yapmalar\u0131 gereken, e-postalar\u0131n\u0131 kontrol etmek ve gelen ba\u011flant\u0131ya t\u0131klamak. Bu, \u00f6zellikle mobil cihazlarda veya h\u0131zl\u0131 eri\u015fim gerektiren platformlarda p\u00fcr\u00fczs\u00fcz bir giri\u015f deneyimi sa\u011flar. \u0130kinci olarak, <strong>g\u00fcvenlik<\/strong> a\u00e7\u0131s\u0131ndan \u00f6nemli iyile\u015ftirmeler getirir. \u015eifreler veritaban\u0131nda saklanmad\u0131\u011f\u0131 i\u00e7in, olas\u0131 bir veri ihlalinde (data breach) \u015fifrelerin \u00e7al\u0131nmas\u0131 riski ortadan kalkar. Ayr\u0131ca, her Magic Link tek kullan\u0131ml\u0131kt\u0131r ve genellikle k\u0131sa bir s\u00fcre (\u00f6rne\u011fin 5-15 dakika) i\u00e7inde sona erer, bu da ba\u011flant\u0131n\u0131n k\u00f6t\u00fc niyetli ki\u015filer taraf\u0131ndan tekrar kullan\u0131lmas\u0131n\u0131 engeller. Kimlik av\u0131 (phishing) riskini tamamen ortadan kald\u0131rmasa da, kullan\u0131c\u0131lar\u0131n \u015fifrelerini girmelerini gerektirmedi\u011fi i\u00e7in bu t\u00fcr sald\u0131r\u0131lar\u0131n etkisini azalt\u0131r. \u00dc\u00e7\u00fcnc\u00fc olarak, <strong>geli\u015ftirici y\u00fck\u00fcn\u00fc<\/strong> hafifletebilir. \u015eifre karma\u015f\u0131kl\u0131\u011f\u0131 kurallar\u0131, \u015fifre s\u0131f\u0131rlama ak\u0131\u015flar\u0131 ve \u015fifre depolama mekanizmalar\u0131 gibi karma\u015f\u0131k s\u00fcre\u00e7leri y\u00f6netme ihtiyac\u0131n\u0131 azalt\u0131r.<\/p>\n<p>Elbette, Magic Link&#8217;in baz\u0131 dezavantajlar\u0131 da bulunmaktad\u0131r. En \u00f6nemlisi, kullan\u0131c\u0131n\u0131n e-posta hesab\u0131n\u0131n g\u00fcvenli\u011finin kritik olmas\u0131d\u0131r. E\u011fer bir sald\u0131rgan kullan\u0131c\u0131n\u0131n e-posta hesab\u0131na eri\u015firse, Magic Link arac\u0131l\u0131\u011f\u0131yla uygulaman\u0131za da eri\u015fim sa\u011flayabilir. Bu nedenle, kullan\u0131c\u0131lar\u0131n g\u00fc\u00e7l\u00fc e-posta \u015fifreleri kullanmalar\u0131 ve iki fakt\u00f6rl\u00fc kimlik do\u011frulama (2FA) gibi ek g\u00fcvenlik \u00f6nlemleri almalar\u0131 te\u015fvik edilmelidir. Ayr\u0131ca, e-posta iletimindeki gecikmeler veya e-postalar\u0131n spam klas\u00f6r\u00fcne d\u00fc\u015fmesi gibi sorunlar kullan\u0131c\u0131 deneyimini olumsuz etkileyebilir. Ancak do\u011fru bir \u015fekilde uyguland\u0131\u011f\u0131nda ve ek g\u00fcvenlik \u00f6nlemleriyle desteklendi\u011finde, Magic Link modern uygulamalar i\u00e7in son derece g\u00fc\u00e7l\u00fc ve etkili bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fcd\u00fcr. Bir e-ticaret sitesinde, kullan\u0131c\u0131n\u0131n sadece e-posta adresiyle giri\u015f yap\u0131p, sepetini veya sipari\u015f ge\u00e7mi\u015fini an\u0131nda g\u00f6r\u00fcnt\u00fcleyebilmesi, m\u00fc\u015fteri memnuniyetini do\u011frudan art\u0131ran bir senaryodur.<\/p>\n<h2>Sistem Mimarisi ve Gerekli Teknolojiler: Node.js Ekosistemi<\/h2>\n<p>Magic Link kimlik do\u011frulama sistemini Node.js \u00fczerinde in\u015fa etmek i\u00e7in belirli bir mimariyi ve bir dizi teknolojiyi kullanaca\u011f\u0131z. Bu b\u00f6l\u00fcm, sistemin genel yap\u0131s\u0131n\u0131 ve her bir bile\u015fenin rol\u00fcn\u00fc a\u00e7\u0131klamaktad\u0131r. Temel olarak, bir sunucu taraf\u0131 uygulamas\u0131 (backend) ve bir istemci taraf\u0131 aray\u00fcz\u00fc (frontend) aras\u0131nda bir etkile\u015fim olacakt\u0131r. \u0130stemci taraf\u0131, kullan\u0131c\u0131n\u0131n e-posta adresini girdi\u011fi bir formdan ibaret olabilirken, as\u0131l i\u015f y\u00fck\u00fc sunucu taraf\u0131nda ger\u00e7ekle\u015fecektir.<\/p>\n<p>Sistemimizin temel bile\u015fenleri ve kullanaca\u011f\u0131m\u0131z teknolojiler \u015funlard\u0131r:<\/p>\n<ol>\n<li><strong>Node.js \u00c7al\u0131\u015fma Zaman\u0131 Ortam\u0131:<\/strong> Sunucu taraf\u0131 kodumuzu \u00e7al\u0131\u015ft\u0131rmak i\u00e7in temel platform.<\/li>\n<li><strong>Express.js (Web \u00c7at\u0131s\u0131):<\/strong> Node.js \u00fczerinde RESTful API&#8217;ler olu\u015fturmak ve HTTP isteklerini y\u00f6netmek i\u00e7in h\u0131zl\u0131 ve minimalist bir web \u00e7at\u0131s\u0131 (framework). Rot (route) tan\u0131mlamalar\u0131, ara yaz\u0131l\u0131mlar (middleware) ve istek\/cevap d\u00f6ng\u00fcs\u00fcn\u00fc kolayca y\u00f6netmemizi sa\u011flar.<\/li>\n<li><strong>JSON Web Token (JWT):<\/strong> Kullan\u0131c\u0131 oturumlar\u0131n\u0131 y\u00f6netmek ve g\u00fcvenli bir \u015fekilde bilgi ta\u015f\u0131mak i\u00e7in end\u00fcstri standard\u0131 bir y\u00f6ntem. Kullan\u0131c\u0131 Magic Link ile do\u011fruland\u0131\u011f\u0131nda, sunucu bir JWT olu\u015fturacak ve istemciye g\u00f6nderecektir. \u0130stemci, sonraki isteklerde bu JWT&#8217;yi kimlik do\u011frulama ba\u015fl\u0131\u011f\u0131nda (Authorization header) sunarak kimli\u011fini kan\u0131tlayacakt\u0131r.<\/li>\n<li><strong>Nodemailer (E-posta G\u00f6nderme K\u00fct\u00fcphanesi):<\/strong> Sunucu taraf\u0131nda e-posta g\u00f6nderme i\u015flemlerini kolayla\u015ft\u0131ran bir Node.js mod\u00fcl\u00fc. Magic Link i\u00e7eren e-postalar\u0131 kullan\u0131c\u0131lara ula\u015ft\u0131rmak i\u00e7in bu k\u00fct\u00fcphaneyi kullanaca\u011f\u0131z. SMTP sunucular\u0131, Gmail, Outlook gibi \u00e7e\u015fitli servislerle entegrasyonu destekler.<\/li>\n<li><strong>Veritaban\u0131 (\u00d6rnek olarak PostgreSQL veya MongoDB):<\/strong> Kullan\u0131c\u0131 bilgilerini ve olu\u015fturulan Magic Link token&#8217;lar\u0131n\u0131 saklamak i\u00e7in bir veritaban\u0131na ihtiyac\u0131m\u0131z olacak. Bu \u00f6rnekte belirli bir veritaban\u0131 teknolojisine ba\u011fl\u0131 kalmayaca\u011f\u0131z ancak bir ORM (Object-Relational Mapper) veya ODM (Object-Document Mapper) k\u00fct\u00fcphanesi (\u00f6rne\u011fin Sequelize veya Mongoose) kullanmak i\u015fleri kolayla\u015ft\u0131racakt\u0131r. Temel olarak, kullan\u0131c\u0131ya ait e-posta, ID ve Magic Link token&#8217;\u0131n\u0131n kendisi ile token&#8217;\u0131n son kullanma tarihi gibi bilgileri saklayaca\u011f\u0131z.<\/li>\n<li><strong>Dotenv (Ortam De\u011fi\u015fkenleri Y\u00f6netimi):<\/strong> API anahtarlar\u0131, veritaban\u0131 ba\u011flant\u0131 dizeleri ve e-posta sunucusu kimlik bilgileri gibi hassas bilgileri koddan ay\u0131rmak ve g\u00fcvenli bir \u015fekilde y\u00f6netmek i\u00e7in <code>.env<\/code> dosyalar\u0131n\u0131 kullanaca\u011f\u0131z.<\/li>\n<\/ol>\n<p>Sistemin genel ak\u0131\u015f\u0131 a\u015fa\u011f\u0131daki gibidir:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131, web aray\u00fcz\u00fcnde e-posta adresini girer ve &#8220;Giri\u015f Yap&#8221; veya &#8220;Bana Sihirli Link G\u00f6nder&#8221; d\u00fc\u011fmesine t\u0131klar.<\/li>\n<li>\u0130stemci (taray\u0131c\u0131), bu e-posta adresini sunucudaki ilgili API u\u00e7 noktas\u0131na (endpoint) bir HTTP POST iste\u011fi ile g\u00f6nderir.<\/li>\n<li>Sunucu, gelen e-posta adresini do\u011frular, veritaban\u0131nda kullan\u0131c\u0131y\u0131 bulur veya yeni bir kullan\u0131c\u0131 olu\u015fturur.<\/li>\n<li>Sunucu, bu kullan\u0131c\u0131 i\u00e7in benzersiz, kriptografik olarak g\u00fcvenli ve k\u0131sa \u00f6m\u00fcrl\u00fc bir Magic Link token&#8217;\u0131 olu\u015fturur ve bu token&#8217;\u0131 veritaban\u0131nda kullan\u0131c\u0131yla ili\u015fkilendirerek saklar.<\/li>\n<li>Sunucu, olu\u015fturdu\u011fu Magic Link URL&#8217;sini (token&#8217;\u0131 i\u00e7eren) kullan\u0131c\u0131n\u0131n e-posta adresine Nodemailer arac\u0131l\u0131\u011f\u0131yla g\u00f6nderir.<\/li>\n<li>Kullan\u0131c\u0131 e-postas\u0131n\u0131 kontrol eder ve gelen Magic Link&#8217;e t\u0131klar.<\/li>\n<li>Taray\u0131c\u0131, Magic Link URL&#8217;sini sunucudaki ba\u015fka bir API u\u00e7 noktas\u0131na (genellikle bir GET iste\u011fi olarak) y\u00f6nlendirir.<\/li>\n<li>Sunucu, URL&#8217;deki token&#8217;\u0131 al\u0131r, veritaban\u0131nda ge\u00e7erlili\u011fini kontrol eder (s\u00fcresi dolmu\u015f mu, daha \u00f6nce kullan\u0131lm\u0131\u015f m\u0131, do\u011fru kullan\u0131c\u0131ya ait mi).<\/li>\n<li>E\u011fer token ge\u00e7erliyse, sunucu token&#8217;\u0131 veritaban\u0131ndan siler veya kullan\u0131ld\u0131 olarak i\u015faretler. Ard\u0131ndan, kullan\u0131c\u0131 i\u00e7in bir JWT olu\u015fturur ve bu JWT&#8217;yi istemciye (genellikle bir \u00e7erez (cookie) i\u00e7inde veya bir y\u00f6nlendirme (redirect) ile URL parametresi olarak) g\u00f6nderir.<\/li>\n<li>\u0130stemci, ald\u0131\u011f\u0131 JWT ile uygulamada oturum a\u00e7m\u0131\u015f olur ve korumal\u0131 kaynaklara eri\u015febilir.<\/li>\n<\/ol>\n<p>Bu mimari, hem g\u00fcvenlik hem de \u00f6l\u00e7eklenebilirlik a\u00e7\u0131s\u0131ndan sa\u011flam bir temel sunar. Her ad\u0131mda g\u00fcvenlik en iyi uygulamalar\u0131n\u0131 g\u00f6z \u00f6n\u00fcnde bulundurarak sistemimizi in\u015fa edece\u011fiz.<\/p>\n<h2>Ad\u0131m 1: Temel Node.js Projesini Kurma ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131 Y\u00fckleme<\/h2>\n<p>Herhangi bir Node.js projesine ba\u015flamadan \u00f6nce, temel proje yap\u0131s\u0131n\u0131 kurmam\u0131z ve gerekli ba\u011f\u0131ml\u0131l\u0131klar\u0131 y\u00fcklememiz gerekir. Bu ad\u0131mda, projemizi ba\u015flatacak, Express.js, JWT, Nodemailer ve ortam de\u011fi\u015fkenlerini y\u00f6netmek i\u00e7in <code>dotenv<\/code> gibi temel k\u00fct\u00fcphaneleri kuraca\u011f\u0131z. Bu k\u00fct\u00fcphaneler, Magic Link sistemimizin iskeletini olu\u015fturacak ve ilerleyen ad\u0131mlarda i\u015fimizi olduk\u00e7a kolayla\u015ft\u0131racakt\u0131r.<\/p>\n<p>\u00d6ncelikle, projemiz i\u00e7in yeni bir dizin olu\u015ftural\u0131m ve bu dizine ge\u00e7elim:<\/p>\n<div class=\"code-container\">\n<pre><code>mkdir magic-link-auth\ncd magic-link-auth<\/pre>\n<p><\/code>\n<\/div>\n<p>\u015eimdi, yeni bir Node.js projesi ba\u015flatal\u0131m. Bu komut, projemizin temel bilgilerini i\u00e7eren bir <code>package.json<\/code> dosyas\u0131 olu\u015fturacakt\u0131r. Varsay\u0131lan de\u011ferleri kabul etmek i\u00e7in <code>-y<\/code> bayra\u011f\u0131n\u0131 kullanabiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>npm init -y<\/pre>\n<p><\/code>\n<\/div>\n<p><code>package.json<\/code> dosyan\u0131z a\u015fa\u011f\u0131daki gibi g\u00f6r\u00fcnecektir (detaylar biraz farkl\u0131l\u0131k g\u00f6sterebilir):<\/p>\n<div class=\"code-container\">\n<pre><code>{\n  \"name\": \"magic-link-auth\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"test\": \"echo \\\"Error: no test specified\\\" && exit 1\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\"\n}<\/pre>\n<p><\/code>\n<\/div>\n<p>S\u0131ra geldi projemizin temel ba\u011f\u0131ml\u0131l\u0131klar\u0131n\u0131 y\u00fcklemeye. A\u015fa\u011f\u0131daki komutlar\u0131 kullanarak gerekli k\u00fct\u00fcphaneleri projemize ekleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>npm install express jsonwebtoken nodemailer dotenv pg<\/pre>\n<p><\/code>\n<\/div>\n<p>Burada <code>pg<\/code> k\u00fct\u00fcphanesini PostgreSQL veritaban\u0131 i\u00e7in ekledik. E\u011fer farkl\u0131 bir veritaban\u0131 (\u00f6rne\u011fin MongoDB i\u00e7in <code>mongoose<\/code>) kullanacaksan\u0131z, ilgili k\u00fct\u00fcphaneyi y\u00fcklemeniz gerekecektir. Bu makalede veritaban\u0131 i\u015flemleri i\u00e7in genel bir yakla\u015f\u0131m sergileyece\u011fiz ancak \u00f6rnek olmas\u0131 a\u00e7\u0131s\u0131ndan <code>pg<\/code>'yi dahil ettik.<\/p>\n<p>Y\u00fckleme i\u015flemi tamamland\u0131\u011f\u0131nda, <code>package.json<\/code> dosyan\u0131z\u0131n <code>dependencies<\/code> (ba\u011f\u0131ml\u0131l\u0131klar) b\u00f6l\u00fcm\u00fcnde y\u00fckl\u00fc k\u00fct\u00fcphaneleri g\u00f6receksiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>{\n  \"name\": \"magic-link-auth\",\n  \"version\": \"1.0.0\",\n  \"description\": \"\",\n  \"main\": \"index.js\",\n  \"scripts\": {\n    \"start\": \"node index.js\"\n  },\n  \"keywords\": [],\n  \"author\": \"\",\n  \"license\": \"ISC\",\n  \"dependencies\": {\n    \"dotenv\": \"^16.4.5\",\n    \"express\": \"^4.19.2\",\n    \"jsonwebtoken\": \"^9.0.2\",\n    \"nodemailer\": \"^6.9.13\",\n    \"pg\": \"^8.11.5\"\n  }\n}<\/pre>\n<p><\/code>\n<\/div>\n<p>\u015eimdi temel bir Express sunucusu olu\u015ftural\u0131m. Proje dizininizde <code>index.js<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine a\u015fa\u011f\u0131daki kodu ekleyin:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ index.js\nrequire('dotenv').config(); \/\/ Ortam de\u011fi\u015fkenlerini y\u00fckle\n\nconst express = require('express');\nconst app = express();\nconst PORT = process.env.PORT || 3000;\n\n\/\/ JSON body parser'\u0131 etkinle\u015ftir\napp.use(express.json());\n\napp.get('\/', (req, res) => {\n  res.send('Magic Link Kimlik Do\u011frulama Sistemi \u00c7al\u0131\u015f\u0131yor!');\n});\n\napp.listen(PORT, () => {\n  console.log(<code>Sunucu http:\/\/localhost:${PORT} adresinde \u00e7al\u0131\u015f\u0131yor<\/code>);\n});<\/pre>\n<p><\/code>\n<\/div>\n<p>Ortam de\u011fi\u015fkenlerini kullanaca\u011f\u0131m\u0131z i\u00e7in, proje dizininizde <code>.env<\/code> ad\u0131nda bir dosya olu\u015fturun ve i\u00e7ine \u015fimdilik sadece port numaras\u0131n\u0131 ekleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>PORT=3000\nJWT_SECRET=cok-gizli-bir-anahtar-buraya-gelecek<\/pre>\n<p><\/code>\n<\/div>\n<p><code>JWT_SECRET<\/code>, JWT'leri imzalamak i\u00e7in kullanaca\u011f\u0131m\u0131z gizli anahtar olacakt\u0131r. Bu anahtar\u0131n ger\u00e7ekten karma\u015f\u0131k ve tahmin edilemez olmas\u0131 gerekti\u011fini unutmay\u0131n. \u00dcretim ortam\u0131nda, rastgele karakterlerden olu\u015fan uzun bir dize kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p>Sunucuyu ba\u015flatmak i\u00e7in terminalde <code>node index.js<\/code> komutunu \u00e7al\u0131\u015ft\u0131rabilirsiniz. E\u011fer <code>package.json<\/code> dosyan\u0131zdaki <code>scripts<\/code> k\u0131sm\u0131na <code>\"start\": \"node index.js\"<\/code> eklediyseniz, <code>npm start<\/code> komutuyla da ba\u015flatabilirsiniz. Taray\u0131c\u0131n\u0131zda <code>http:\/\/localhost:3000<\/code> adresine gitti\u011finizde \"Magic Link Kimlik Do\u011frulama Sistemi \u00c7al\u0131\u015f\u0131yor!\" mesaj\u0131n\u0131 g\u00f6rmelisiniz. B\u00f6ylece projemizin temelini atm\u0131\u015f olduk.<\/p>\n<h2>Ad\u0131m 2: G\u00fcvenli Magic Link Token'lar\u0131 Olu\u015fturma ve Saklama<\/h2>\n<p>Magic Link sistemimizin kalbi, g\u00fcvenli ve tek kullan\u0131ml\u0131k token'lar\u0131n olu\u015fturulmas\u0131 ve y\u00f6netilmesidir. Bu ad\u0131mda, kullan\u0131c\u0131 bir e-posta adresiyle giri\u015f yapmak istedi\u011finde sunucunun nas\u0131l benzersiz bir token olu\u015fturaca\u011f\u0131n\u0131, bunu veritaban\u0131nda nas\u0131l saklayaca\u011f\u0131n\u0131 ve son kullanma s\u00fcresi gibi \u00f6nemli detaylar\u0131 nas\u0131l y\u00f6netece\u011fini ele alaca\u011f\u0131z. Bu token, kullan\u0131c\u0131n\u0131n e-posta adresine g\u00f6nderilecek olan Magic Link'in ayr\u0131lmaz bir par\u00e7as\u0131 olacakt\u0131r.<\/p>\n<p>\u00d6ncelikle, kullan\u0131c\u0131lar\u0131n e-posta adreslerini g\u00f6nderece\u011fi bir API u\u00e7 noktas\u0131 olu\u015ftural\u0131m. Bu u\u00e7 nokta, gelen e-posta adresini alacak, veritaban\u0131nda kullan\u0131c\u0131y\u0131 kontrol edecek ve ard\u0131ndan Magic Link i\u00e7in bir token \u00fcretecektir. Veritaban\u0131 etkile\u015fimleri i\u00e7in basit bir yap\u0131 kullanaca\u011f\u0131z. Ger\u00e7ek bir uygulamada, daha sa\u011flam bir ORM\/ODM k\u00fct\u00fcphanesi ve veritaban\u0131 \u015femas\u0131 kullanman\u0131z \u00f6nerilir.<\/p>\n<p><code>index.js<\/code> dosyan\u0131za a\u015fa\u011f\u0131daki rotay\u0131 ekleyelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ index.js (\u00f6nceki kodun devam\u0131)\nconst jwt = require('jsonwebtoken');\nconst { Pool } = require('pg'); \/\/ PostgreSQL i\u00e7in\n\n\/\/ Veritaban\u0131 ba\u011flant\u0131 havuzu (\u00f6rnek)\nconst pool = new Pool({\n  user: process.env.DB_USER,\n  host: process.env.DB_HOST,\n  database: process.env.DB_NAME,\n  password: process.env.DB_PASSWORD,\n  port: process.env.DB_PORT,\n});\n\n\/\/ Veritaban\u0131 \u015femas\u0131 olu\u015fturma (ilk \u00e7al\u0131\u015ft\u0131rmada)\nasync function initializeDb() {\n  try {\n    await pool.query(<code>CREATE TABLE IF NOT EXISTS users (\n        id SERIAL PRIMARY KEY,\n        email VARCHAR(255) UNIQUE NOT NULL,\n        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n      );\n\n      CREATE TABLE IF NOT EXISTS magic_links (\n        id SERIAL PRIMARY KEY,\n        user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,\n        token VARCHAR(255) UNIQUE NOT NULL,\n        expires_at TIMESTAMP NOT NULL,\n        used BOOLEAN DEFAULT FALSE,\n        created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP\n      );<\/code>);\n    console.log('Veritaban\u0131 \u015femas\u0131 ba\u015far\u0131yla olu\u015fturuldu\/g\u00fcncellendi.');\n  } catch (err) {\n    console.error('Veritaban\u0131 \u015femas\u0131 olu\u015fturulurken hata olu\u015ftu:', err);\n  }\n}\ninitializeDb();\n\napp.post('\/auth\/magic-link-request', async (req, res) => {\n  const { email } = req.body;\n\n  if (!email) {\n    return res.status(400).json({ message: 'E-posta adresi gerekli.' });\n  }\n\n  try {\n    let userResult = await pool.query('SELECT * FROM users WHERE email = $1', [email]);\n    let user = userResult.rows[0];\n\n    if (!user) {\n      \/\/ Kullan\u0131c\u0131 yoksa yeni bir kullan\u0131c\u0131 olu\u015ftur\n      const newUserResult = await pool.query('INSERT INTO users (email) VALUES ($1) RETURNING *', [email]);\n      user = newUserResult.rows[0];\n    }\n\n    \/\/ Benzersiz bir Magic Link token'\u0131 olu\u015ftur\n    const magicLinkToken = jwt.sign(\n      { userId: user.id, email: user.email },\n      process.env.JWT_SECRET,\n      { expiresIn: '15m' } \/\/ Token 15 dakika ge\u00e7erli olsun\n    );\n\n    \/\/ Token'\u0131n son kullanma zaman\u0131n\u0131 hesapla\n    const expiresAt = new Date(Date.now() + 15 * 60 * 1000); \/\/ 15 dakika sonras\u0131\n\n    \/\/ Token'\u0131 veritaban\u0131na kaydet\n    await pool.query(\n      'INSERT INTO magic_links (user_id, token, expires_at) VALUES ($1, $2, $3)',\n      [user.id, magicLinkToken, expiresAt]\n    );\n\n    \/\/ E-posta g\u00f6nderme ad\u0131m\u0131na ge\u00e7ece\u011fiz...\n    \/\/ Bu k\u0131s\u0131mda e-posta g\u00f6nderme fonksiyonunu \u00e7a\u011f\u0131raca\u011f\u0131z\n    \/\/ sendMagicLinkEmail(email, magicLinkToken); \/\/ Placeholder\n\n    res.status(200).json({ message: 'Magic Link e-posta adresinize g\u00f6nderildi. L\u00fctfen gelen kutunuzu kontrol edin.' });\n\n  } catch (error) {\n    console.error('Magic Link iste\u011fi s\u0131ras\u0131nda hata:', error);\n    res.status(500).json({ message: 'Sunucu hatas\u0131.' });\n  }\n});\n\n\/\/ ... app.listen k\u0131sm\u0131<\/pre>\n<p><\/code>\n<\/div>\n<p><code>.env<\/code> dosyan\u0131za veritaban\u0131 ba\u011flant\u0131 bilgilerini eklemeniz gerekecektir:<\/p>\n<div class=\"code-container\">\n<pre><code>PORT=3000\nJWT_SECRET=cok-gizli-bir-anahtar-buraya-gelecek\nDB_USER=postgres\nDB_HOST=localhost\nDB_NAME=magic_link_db\nDB_PASSWORD=your_db_password\nDB_PORT=5432<\/pre>\n<p><\/code>\n<\/div>\n<p>Bu kod blo\u011funda neler oluyor, ad\u0131m ad\u0131m inceleyelim:<\/p>\n<ol>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131s\u0131 ve \u015eema:<\/strong> PostgreSQL i\u00e7in <code>pg<\/code> k\u00fct\u00fcphanesini kullanarak bir ba\u011flant\u0131 havuzu olu\u015fturuyoruz. <code>initializeDb<\/code> fonksiyonu, <code>users<\/code> ve <code>magic_links<\/code> tablolar\u0131n\u0131 olu\u015fturur. <code>users<\/code> tablosu temel kullan\u0131c\u0131 bilgilerini (ID, e-posta) saklarken, <code>magic_links<\/code> tablosu her olu\u015fturulan token'\u0131, ilgili kullan\u0131c\u0131y\u0131, token<br \/>\n","protected":false},"excerpt":{"rendered":"Geleneksel kullan\u0131c\u0131 ad\u0131 ve \u015fifre ikilisi, modern web uygulamalar\u0131nda hem g\u00fcvenlik a\u00e7\u0131klar\u0131 hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan giderek daha fazla sorun te\u015fkil ediyor.","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":[136],"tags":[],"class_list":{"0":"post-41701","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-node-js","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>Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Geleneksel kullan\u0131c\u0131 ad\u0131 ve \u015fifre ikilisi, modern web uygulamalar\u0131nda hem g\u00fcvenlik a\u00e7\u0131klar\u0131 hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan giderek daha fazla sorun te\u015fkil ediyor.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-05-11T06:03:21+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=\"15 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2026-05-11T06:03:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\"},\"wordCount\":2408,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Node.js\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\",\"name\":\"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-05-11T06:03:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?\"}]},{\"@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":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?","og_description":"Geleneksel kullan\u0131c\u0131 ad\u0131 ve \u015fifre ikilisi, modern web uygulamalar\u0131nda hem g\u00fcvenlik a\u00e7\u0131klar\u0131 hem de kullan\u0131c\u0131 deneyimi a\u00e7\u0131s\u0131ndan giderek daha fazla sorun te\u015fkil ediyor.","og_url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-05-11T06:03:21+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"15 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?","datePublished":"2026-05-11T06:03:21+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/"},"wordCount":2408,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Node.js"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/","name":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-05-11T06:03:21+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/node-js-ile-e-posta-dogrulama-icin-magic-link-kimlik-dogrulama-sistemi-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Node.js ile E-posta Do\u011frulama i\u00e7in Magic Link Kimlik Do\u011frulama Sistemi Nas\u0131l Olu\u015fturulur?"}]},{"@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\/41701","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=41701"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/41701\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=41701"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=41701"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=41701"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}