﻿
{"id":28550,"date":"2026-03-29T21:49:13","date_gmt":"2026-03-29T21:49:13","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28550"},"modified":"2026-03-29T21:49:13","modified_gmt":"2026-03-29T21:49:13","slug":"keycloakda-token-mapperlari-inceleyelim-11","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/","title":{"rendered":"Keycloak&#8217;da Token Mapper&#8217;lar\u0131 \u0130nceleyelim&#8230; #11"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n<br \/>\nBu i\u00e7eri\u011fimizde, Keycloak&#8217;da \u00fcretilen token&#8217;lar\u0131n i\u00e7ine ek veri eklenmesini sa\u011flayan <strong>Token Mapper<\/strong> mekanizmas\u0131n\u0131 mercek alt\u0131na al\u0131yor olacak ve <em>nedir<\/em>, <em>ne i\u015fe yarar<\/em> ve <em>hangi senaryolarda kullan\u0131l\u0131r?<\/em> gibi sorulara cevap ararken, konuyu sadece teoride b\u0131rakmay\u0131p pratik \u00f6rneklerle de peki\u015ftirerek ad\u0131m ad\u0131m inceliyor olaca\u011f\u0131z. Evet, haz\u0131rsan\u0131z ba\u015flayabiliriz&#8230;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Ba\u015fl\u0131klar<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u0130\u00e7indekiler Tablosunu A\u00e7\/Kapat\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Token_Mapper_Nedir\" >Token Mapper Nedir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Ne_Amaca_Hizmet_Etmektedir\" >Ne Amaca Hizmet Etmektedir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Mapperlar_Nerelerde_Kullanilir\" >Mapper&#8217;lar Nerelerde Kullan\u0131l\u0131r?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Mapperlar_Nasil_Calisir\" >Mapper&#8217;lar Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Mapper_Turleri_Nelerdir\" >Mapper T\u00fcrleri Nelerdir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Token_Mapperlarin_Ic_Yapisi\" >Token Mapper&#8217;lar\u0131n \u0130\u00e7 Yap\u0131s\u0131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Token_Mapperlari_Kullanirken_Nelere_Dikkat_Edilmelidir\" >Token Mapper&#8217;lar\u0131 Kullan\u0131rken Nelere Dikkat Edilmelidir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#13_Kritik_Soru_13_Kritik_Cevap\" >13 Kritik Soru \/ 13 Kritik Cevap<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-3'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Token_Mapperlarin_Kullanimi\" >Token Mapper&#8217;lar\u0131n Kullan\u0131m\u0131<\/a><ul class='ez-toc-list-level-4' ><li class='ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Token_Mapper_Olusturma\" >Token Mapper Olu\u015fturma<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#User_Attribute_Mapper_Olusturma\" >User Attribute Mapper Olu\u015fturma<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-token-mapperlari-inceleyelim-11\/#Hardcoded_Mapper_Olusturma\" >Hardcoded Mapper Olu\u015fturma<\/a><\/li><\/ul><\/li><\/ul><\/li><\/ul><\/nav><\/div>\n<h3><span class=\"ez-toc-section\" id=\"Token_Mapper_Nedir\"><\/span>Token Mapper Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Token Mapper, Keycloak&#8217;un token issuance (token \u00fcretme) s\u00fcrecinde kullan\u0131c\u0131 bilgilerini, rollerini, grup bilgilerini, session notlar\u0131n\u0131 vs. access token, ID token ve UserInfo endpoint gibi OIDC token&#8217;lar\u0131na eklememizi sa\u011flayan olduk\u00e7a kullan\u0131\u015fl\u0131 ve kritik bir mekanizmad\u0131r.<\/p>\n<p>Token Mapper&#8217;lar ile kullan\u0131c\u0131dan gelen veri token&#8217;daki bir claim haline getirilmekte, yani <em>&#8220;Token&#8217;\u0131n i\u00e7ine ne koyay\u0131m?&#8221;<\/em> sorusunun cevab\u0131 verilmektedir&#8230;<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Ne_Amaca_Hizmet_Etmektedir\"><\/span>Ne Amaca Hizmet Etmektedir?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Token Mapper, Keycloak&#8217;ta olu\u015fturulan token&#8217;lar\u0131n i\u00e7ine varsay\u0131lan olarak gelen kullan\u0131c\u0131 id, username ve s\u00fcre gibi temel bilgilerin \u00f6tesine ge\u00e7erek, ger\u00e7ek hayatta ihtiya\u00e7 duyulan rol, yetki, departman, \u00f6zel alanlar veya d\u0131\u015f sistemlerden gelen verileri eklemeye yaramaktad\u0131r. Yani sistemdeki farkl\u0131 veri kaynaklar\u0131ndan belirli bilgileri al\u0131p bunlar\u0131 token i\u00e7inde anlaml\u0131 claim&#8217;ler olarak yerle\u015ftirir ve b\u00f6ylece API&#8217;lerin veya uygulamalar\u0131n ekstra bir sorguya ihtiya\u00e7 duymadan bu bilgilere do\u011frudan token \u00fczerinden eri\u015fmesini sa\u011flar.<\/p>\n<div style=\"background-color: #f4f4f4; padding: 15px; border-left: 5px solid #3498db; margin: 20px 0; font-style: italic; color: #333; font-size: 14px; box-shadow: 0 2px 6px rgba(0, 0, 0, 0.1); border-radius: 8px; width: 40%; float: right; box-sizing: border-box;\">\n  <strong><em>Introspection  nedir?<\/em><\/strong><br \/>\nBir token&#8217;\u0131n ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 ve i\u00e7eri\u011fini auth server&#8217;a sorarak \u00f6\u011frenme y\u00f6ntemidir.<\/p>\n<p>JWT h\u0131zl\u0131d\u0131r ama eski veriye sahip olabilir. Ancak introspection yava\u015f olsa da her zaman do\u011fru veriyi getirecektir.<\/p>\n<p>Bunu \u015f\u00f6yle \u00f6rneklendirebiliriz;<\/p>\n<p>Token bir kere, de\u011fi\u015ftirilemez \u015fekilde olu\u015fturulur. Misal olarak &#8216;admin&#8217; rol\u00fcne sahip bir kullan\u0131c\u0131ya token \u00fcretildi\u011finde bu token&#8217;a <code>role: admin<\/code> claim&#8217;i eklenecektir. Kullan\u0131c\u0131dan bu rol al\u0131nsa dahi ilgili token \u00f6mr\u00fcn\u00fcn sonuna kadar o yetkiye sahip olacakt\u0131r. Ancak introspection&#8217;da ise her istekte gidip en g\u00fcncel durum elde edilecek ve kullan\u0131c\u0131 &#8216;admin&#8217; de\u011filse bu o anda fark edilecektir!\n<\/div>\n<p>Token Mapper, token i\u00e7eri\u011finin uygulaman\u0131n ihtiya\u00e7lar\u0131na g\u00f6re esnek bi\u00e7imde \u015fekillendirilmesini sa\u011flayarak sadece gerekli verilerin eklenmesini ve gereksiz ya da hassas bilgilerin d\u0131\u015far\u0131da b\u0131rak\u0131lmas\u0131n\u0131 m\u00fcmk\u00fcn k\u0131lmaktad\u0131r. Bu sayede hem g\u00fcvenlik hem de token boyutu optimize edilirken; <em>sub<\/em>, <em>name<\/em>, <em>email<\/em>, <em>roles<\/em> gibi standart claim&#8217;ler dahil edilebilir ya da tamamen ihtiyaca \u00f6zel custom claim&#8217;ler \u00fcretilebilir. Ayr\u0131ca farkl\u0131 client&#8217;lar i\u00e7in farkl\u0131 claim set&#8217;leri tan\u0131mlanarak her uygulaman\u0131n yaln\u0131zca kendi ihtiya\u00e7 duydu\u011fu veriyi almas\u0131 da sa\u011flanabilir. Bunun yan\u0131nda kullan\u0131c\u0131ya g\u00f6sterilecek bilgilerin consent ekranlar\u0131nda kontrol edilmesine imkan tan\u0131r ve lightweight access token, token exchange veya introspection gibi ileri seviye kimlik do\u011frulama ve yetkilendirme senaryolar\u0131yla da uyumlu \u00e7al\u0131\u015farak sistemin hem esnek hem de \u00f6l\u00e7eklenebilir olmas\u0131na katk\u0131 sa\u011flayabilir.<\/p>\n<h3><span class=\"ez-toc-section\" id=\"Mapperlar_Nerelerde_Kullanilir\"><\/span>Mapper&#8217;lar Nerelerde Kullan\u0131l\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<ol style=\"font-size:14px;\">\n<li><strong><em>Authorization (Yetkilendirme) S\u00fcre\u00e7lerinde<\/em><\/strong><br \/>\nAuthorization senaryolar\u0131nda token mapper kullan\u0131m\u0131, kullan\u0131c\u0131 sisteme giri\u015f yapt\u0131\u011f\u0131 taktirde sahip oldu\u011fu rol ve izinlerin (\u00f6rne\u011fin <code>admin<\/code> rol\u00fc ya da <code>read<\/code>, <code>write<\/code> gibi yetkiler) token i\u00e7ine eklenmesi ve API&#8217;nin her istekte bu bilgileri okuyarak karar vermesi mant\u0131\u011f\u0131na dayanmaktad\u0131r. Yani API ekstra bir veritaban\u0131 sorgusu yapmaks\u0131z\u0131n, sadece token i\u00e7indeki <code>role<\/code> veya <code>permissions<\/code> gibi claim&#8217;lere bakarak kullan\u0131c\u0131n\u0131n belirli bir i\u015flemi yapmaya yetkisi olup olmad\u0131\u011f\u0131n\u0131 h\u0131zl\u0131 ve do\u011frudan kontrol edebilir.\n<\/li>\n<li><strong><em>Microservice Mimarisinde<\/em><\/strong><br \/>\nMicroservice mimarisinde her servisin kullan\u0131c\u0131 bilgisi i\u00e7in ayr\u0131 ayr\u0131 veritaban\u0131na gitmesini engellemek amac\u0131yla kullan\u0131c\u0131 ad\u0131, rol\u00fc veyahut farkl\u0131 \u00f6zellikleri gibi gerek duyulan kullan\u0131c\u0131 verileri token i\u00e7erisine token mapper&#8217;lar arac\u0131l\u0131\u011f\u0131yla \u00f6nceden eklenerek t\u00fcm servislerin bu bilgileri do\u011frudan token \u00fczerinden okumas\u0131 sa\u011flan\u0131p olduk\u00e7a h\u0131zl\u0131 ve ba\u011f\u0131ms\u0131z bir \u00e7al\u0131\u015fma sergilenebilir.\n<\/li>\n<li><strong><em>External Sistem Entegrasyonunda<\/em><\/strong><br \/>\nExternal sistem entegrasyonu ba\u011flam\u0131nda token mapper kullan\u0131m\u0131, kullan\u0131c\u0131ya ait bilgilerin sadece Keycloak i\u00e7inden de\u011fil, LDAP, veritaban\u0131 veya ba\u015fka bir \u00f6zel kaynaktan al\u0131narak token i\u00e7ine eklenmesini ifade etmektedir. Yani, kullan\u0131c\u0131ya ait bir attribute d\u0131\u015f bir sistemde tutuluyor olsa bile, bu bilgi login s\u0131ras\u0131nda \u00e7ekilip token&#8217;a yerle\u015ftirilir ve b\u00f6ylece uygulamalar bu veriye do\u011frudan token \u00fczerinden eri\u015febilir, ekstra bir entegrasyon \u00e7a\u011fr\u0131s\u0131 yapma ihtiyac\u0131 ortadan kalkar.<\/li>\n<li><strong><em>Frontend Kullan\u0131m\u0131nda<\/em><\/strong><br \/>\nFrontend kullan\u0131m\u0131nda token mapper ise kullan\u0131c\u0131 giri\u015f yapt\u0131ktan sonra gerekli baz\u0131 bilgilerin (\u00f6rne\u011fin kullan\u0131c\u0131 ad\u0131, rol veya feature flag gibi verilerin) token i\u00e7ine eklenmesini sa\u011flayarak frontend uygulamas\u0131n\u0131n bu bilgilere ekstradan bir API \u00e7a\u011fr\u0131s\u0131 yapmadan do\u011frudan token \u00fczerinden ula\u015fmas\u0131n\u0131 sa\u011flamakta ve b\u00f6ylece hem performans\u0131 art\u0131rmakta hem de uygulaman\u0131n daha h\u0131zl\u0131 ve ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fmas\u0131na imkan tan\u0131maktad\u0131r.\n<\/li>\n<\/ol>\n<h3><span class=\"ez-toc-section\" id=\"Mapperlar_Nasil_Calisir\"><\/span>Mapper&#8217;lar Nas\u0131l \u00c7al\u0131\u015f\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<blockquote style=\"font-size:14px;\"><p><em>Token mapper&#8217;lar, token \u00fcretim pipeline&#8217;\u0131n\u0131n bir par\u00e7as\u0131d\u0131r.<\/em><\/p><\/blockquote>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"1536\" height=\"414\" class=\"aligncenter size-full wp-image-28556\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11.png 1536w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-300x81.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-1024x276.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-768x207.png 768w\" sizes=\"auto, (max-width: 1536px) 100vw, 1536px\" \/><\/a>Token mapper&#8217;lar\u0131n \u00e7al\u0131\u015fma mant\u0131\u011f\u0131 yukar\u0131daki g\u00f6rseldeki gibidir&#8230; Burada tek dikkat edilmesi gereken 2. ad\u0131m olan bilgi toplama a\u015famas\u0131d\u0131r. Evet&#8230; Keycloak, token \u00fcretmeden \u00f6nce a\u015fa\u011f\u0131daki bilgileri toplamaya koyulmaktad\u0131r:<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong>User Bilgileri<\/strong>\n<ul>\n<li>id<\/li>\n<li>username<\/li>\n<li>attributes<\/li>\n<li>roles<\/li>\n<\/ul>\n<\/li>\n<li><strong>Client Bilgileri<\/strong>\n<ul>\n<li>hangi uygulama istek att\u0131?<\/li>\n<li>bu client&#8217;\u0131n mapper&#8217;lar\u0131 nelerdir?<\/li>\n<li>hangi scope&#8217;lar ba\u011fl\u0131?<\/li>\n<\/ul>\n<\/li>\n<li><strong>Realm Bilgileri<\/strong>\n<ul>\n<li>global ayarlar<\/li>\n<li>default scope&#8217;lar<\/li>\n<li>realm-level roller<\/li>\n<\/ul>\n<\/li>\n<\/li>\n<\/ul>\n<p>Ard\u0131ndan sistemdeki t\u00fcm mapper&#8217;lar\u0131 toplayarak, bu bilgiler e\u015fli\u011finde bu mapper&#8217;lar\u0131 \u00e7al\u0131\u015ft\u0131racakt\u0131r.<\/p>\n<blockquote style=\"font-size:14px;\"><p><em>Mapper veri \u00fcretmez, var olan veriyi ta\u015f\u0131r \/ d\u00f6n\u00fc\u015ft\u00fcr\u00fcr.<\/em><\/p><\/blockquote>\n<h3><span class=\"ez-toc-section\" id=\"Mapper_Turleri_Nelerdir\"><\/span>Mapper T\u00fcrleri Nelerdir?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u015eimdi gelin en \u00f6nemli mapper t\u00fcrlerine dair fark\u0131ndal\u0131k olu\u015ftural\u0131m&#8230;<\/p>\n<table style=\"width:100%; border-collapse:collapse; font-family:Arial, sans-serif; font-size:13px; line-height:1.3;\">\n<thead>\n<tr style=\"background-color:#2c3e50; color:#fff;\">\n<th style=\"padding:6px; border:1px solid #ddd; text-align:left; width:140px; font-weight:bold;width:15%\">Mapper T\u00fcr\u00fc<\/th>\n<th style=\"padding:6px; border:1px solid #ddd; text-align:left;width:50%\">A\u00e7\u0131klama<\/th>\n<th style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\u00d6rnek<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left; font-weight:bold;\">User Attribute<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:justify;\">Keycloak&#8217;da bir kullan\u0131c\u0131n\u0131n sahip oldu\u011fu ek bilgileri (attribute&#8217;lar\u0131) al\u0131p token i\u00e7ine eklemeye yarayan bir mapper t\u00fcr\u00fcd\u00fcr. \u00d6rne\u011fin; kullan\u0131c\u0131 profilinde tan\u0131ml\u0131 olan <code>department = IT<\/code> gibi bir de\u011feri, bu mapper sayesinde token olu\u015fturma s\u00fcrecinde uygun bir claim olarak token&#8217;a yerle\u015ftirebilir ve nihai olarak \u00fcretilen token i\u00e7inde \u00f6rnekte verildi\u011fi \u015fekilde okunabilir bir de\u011fer \u00fcretilebilir. B\u00f6ylece API&#8217;lerden yahut frontend&#8217;den ekstra bir sorgu yapmaks\u0131z\u0131n bu bilgiye do\u011frudan token \u00fczerinden eri\u015filebilir.<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\n<pre style=\"margin:0; font-size:12px; line-height:1.2;\">{\r\n  \"department\": \"IT\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<tr style=\"background-color:#f9f9f9;\">\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left; font-weight:bold;\">Role Mapper<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:justify;\">Keycloak&#8217;da kullan\u0131c\u0131n\u0131n sahip oldu\u011fu rolleri al\u0131p token i\u00e7erisine claim olarak ekleyen bir mapper t\u00fcr\u00fcd\u00fcr. Yani kullan\u0131c\u0131ya atanm\u0131\u015f olan &#8216;admin&#8217; veya &#8216;user&#8217; gibi roller, token olu\u015fturulurken otomatik olarak toplan\u0131r ve \u00f6rnekteki \u015fekilde token i\u00e7ine yerle\u015ftirilebilir. Bu vesileyle API veya uygulama taraf\u0131 yine ek bir sorguya ihtiya\u00e7 duymaks\u0131z\u0131n kullan\u0131c\u0131n\u0131n yetkilerini do\u011frudan token \u00fczerinden okuyabilir ve hatta bu de\u011ferlere g\u00f6re authorization i\u015flemlerini de ger\u00e7ekle\u015ftirebilir.<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\n<pre style=\"margin:0; font-size:12px; line-height:1.2;\">{\r\n  \"roles\": [\"admin\",\"user\"]\r\n}<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left; font-weight:bold;\">Hardcoded<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:justify;\">Hardcoded mapper, Keycloak&#8217;da herhangi bir veri kayna\u011f\u0131na ihtiya\u00e7 duymaks\u0131z\u0131n token i\u00e7erisine sabit (statik) bir de\u011fer eklenmesine yaramaktad\u0131r. Kullan\u0131c\u0131ya veya role ba\u011fl\u0131 olmaks\u0131z\u0131n \u00f6nceden belirlenen bir bilgiyi her token olu\u015fturuldu\u011funda otomatik olarak i\u00e7ine yerle\u015ftirir.<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\n<pre style=\"margin:0; font-size:12px; line-height:1.2;\">{\r\n  \"app\": \"mobile\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<tr style=\"background-color:#f9f9f9;\">\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left; font-weight:bold;\">Group Mapper<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:justify;\">Kullan\u0131c\u0131n\u0131n dahil oldu\u011fu gruplar\u0131 alarak bunlar\u0131 token i\u00e7erisine claim olarak ekleyen bir mapper t\u00fcr\u00fcd\u00fcr. Kullan\u0131c\u0131 hangi gruplara \u00fcyeyse bu bilgiler token olu\u015fturulurken toplan\u0131r ve \u00f6rnekteki \u015fekilde token i\u00e7erisine yerle\u015ftirilir. B\u00f6ylece uygulamalar kullan\u0131c\u0131n\u0131n grup bazl\u0131 yetkilerini do\u011frudan token \u00fczerinden edinebilme \u015fans\u0131 elde etmi\u015f olur.<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\n<pre style=\"margin:0; font-size:12px; line-height:1.2;\">{\r\n  \"groups\": [\"admin-group\"]\r\n}<\/pre>\n<\/td>\n<\/tr>\n<tr>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left; font-weight:bold;\">Script Mapper<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:justify;\">Script mapper, yukar\u0131daki standart mapper&#8217;lar\u0131n sundu\u011fu sabit ve do\u011frudan veri ta\u015f\u0131ma mant\u0131\u011f\u0131n\u0131n \u00f6tesine ge\u00e7erek JavaScript tabanl\u0131 \u00f6zel bir mant\u0131k \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131na imkan veren geli\u015fmi\u015f bir mapper t\u00fcr\u00fcd\u00fcr. Bu mapper ile kullan\u0131c\u0131ya ait rol, attribute veya di\u011fer bilgiler \u00fczerinde i\u015flem yap\u0131labilir, bunlar birle\u015ftirilebilir ya da belirli ko\u015fullara g\u00f6re yeni claim&#8217;ler \u00fcretilebilir. Misal olarak kullan\u0131c\u0131 rol\u00fc &#8216;admin&#8217; ise token i\u00e7erisine <code>permission = full<\/code> gibi dinamik bir de\u011fer eklenerek daha esnek ve senaryoya \u00f6zel bir yap\u0131 kurulabilir.<\/td>\n<td style=\"padding:6px; border:1px solid #ddd; text-align:left;\">\n<pre style=\"margin:0; font-size:12px; line-height:1.2;\">{\r\n  \"permission\": \"full\"\r\n}<\/pre>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3><span class=\"ez-toc-section\" id=\"Token_Mapperlarin_Ic_Yapisi\"><\/span>Token Mapper&#8217;lar\u0131n \u0130\u00e7 Yap\u0131s\u0131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<blockquote style=\"font-size:14px;\"><p><em>Mimarisel olarak her bir mapper, token&#8217;a claim eklemeyi sa\u011flayan birer plugin&#8217;dir.<\/em><\/p><\/blockquote>\n<p>Bir mapper&#8217;\u0131n i\u00e7 yap\u0131s\u0131nda a\u015fa\u011f\u0131daki gibi d\u00f6rt ana husus s\u00f6z konusudur;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong>Yap\u0131land\u0131rma<\/strong>: Keycloak dashboard&#8217;da g\u00f6r\u00fclen alanlar yap\u0131land\u0131rma kapsam\u0131nda de\u011ferlendirilir. Bu a\u015famada kurgulanan yap\u0131land\u0131rma sayesinde runtime&#8217;da mapper&#8217;a nas\u0131l davranaca\u011f\u0131 s\u00f6ylenir.<\/li>\n<li><strong>Veri Kayna\u011f\u0131<\/strong>: Mapper&#8217;\u0131n beslendi\u011fi kaynaklard\u0131r. Mapper, <em>-veriyi nereden alaca\u011f\u0131m?-<\/em> sorusuna buradan cevap bulacakt\u0131r.<\/li>\n<li><strong>D\u00f6n\u00fc\u015ft\u00fcrme (Mapping Logic)<\/strong>: Mapper&#8217;\u0131n kaynaktan elde etti\u011fi veriyi claim format\u0131na d\u00f6n\u00fc\u015ft\u00fcrmesidir.<\/li>\n<li><strong>Token&#8217;a Entekte Etme<\/strong>: Nihai olarak elde edilen veri token i\u00e7erisine yerle\u015ftirilir.<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"Token_Mapperlari_Kullanirken_Nelere_Dikkat_Edilmelidir\"><\/span>Token Mapper&#8217;lar\u0131 Kullan\u0131rken Nelere Dikkat Edilmelidir?<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>Token mapper&#8217;larda olay sadece &#8216;claim eklemek&#8217; de\u011fildir! Esas\u0131nda performans, g\u00fcvenlik ve mimarisel dengeyi do\u011fru kurgulamak gerekmektedir! Keycloak&#8217;u kullanan \u00e7o\u011fu sistemin bu noktada hata yapt\u0131\u011f\u0131n\u0131 s\u00f6yleyebilirim. Haliyle bu a\u00e7\u0131dan olay\u0131 de\u011ferlendirdi\u011fimizde sahada en ideal olabilecek yakla\u015f\u0131m i\u00e7in dikkat edilmesi gereken noktalara temas etmekte fayda g\u00f6rmekteyim&#8230;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong>Token gereksiz yere \u015fi\u015firilmemelidir!<\/strong><br \/>\nToken mapper kullan\u0131rken en kritik noktalardan biri token&#8217;\u0131n gereksiz verilerle l\u00fczumsuz yere \u015fi\u015firilmemesine \u00f6zen g\u00f6sterilmesidir. \u00c7\u00fcnk\u00fc, JWT her istekte client ile server aras\u0131nda ta\u015f\u0131nacakt\u0131r. Ee bu durumda her fazladan verinin a\u011f trafi\u011fine maliyet olarak yans\u0131yaca\u011f\u0131 anlam\u0131na gelmektedir. Bu durum, \u00f6zellikle mobil veya d\u00fc\u015f\u00fck bant geni\u015fli\u011fine sahip ortamlarda ciddi performans problemlerine yol a\u00e7abilir. Bu y\u00fczden en do\u011fru yakla\u015f\u0131m, her istekte sadece ger\u00e7ekten ihtiya\u00e7 duyulan minimum bilginin token i\u00e7erisine konulmas\u0131d\u0131r.\n<\/li>\n<li><strong>Token&#8217;a hassas veriler koyulmamal\u0131d\u0131r!<\/strong><br \/>\nToken mapper kullan\u0131rken dikkat edilmesi gereken en \u00f6nemli konulardan biri de hassas verilerin token i\u00e7ine konulmamas\u0131na dikkat edilmesidir. Malumunuz, JWT yap\u0131sal olarak sadece base64 ile encode edilir ve asl\u0131nda \u015fifrelenmemektedir! Yani token&#8217;\u0131 ele ge\u00e7iren herkes \u00e7ok kolay bir \u015fekilde decode ederek i\u00e7eri\u011fini okuyabilir! Bu nedenle TCKN, gereksiz e-posta bilgileri yahut \u00f6zel kullan\u0131c\u0131 verileri gibi hassas bilgiler token i\u00e7ine eklenmemelidir.\n<\/li>\n<li><strong>Access Token ile ID Token ayr\u0131m\u0131 ger\u00e7ekle\u015ftirilmelidir!<\/strong><br \/>\nToken mapper kullan\u0131rken en s\u0131k yap\u0131lan olas\u0131 hatalardan biri de Access Token ile ID Token ayr\u0131m\u0131n\u0131n g\u00f6zetilmemesidir! Access Token, asl\u0131nda API&#8217;lerin kullanmas\u0131 ve yetkilendirme gibi backend tarafl\u0131 kontrollerin sa\u011flanmas\u0131 i\u00e7in tasarlanm\u0131\u015fken, ID Token ise genellikle frontend uygulamalar\u0131n\u0131n kullan\u0131c\u0131ya ait bilgilere eri\u015febilmesi i\u00e7in tasarlanm\u0131\u015ft\u0131r. Bu teorik ayr\u0131mdan yola \u00e7\u0131karak rol ve yetki gibi authorization s\u00fcrecini ilgilendiren veriler Access Token i\u00e7erisinde yer almal\u0131yken; kullan\u0131c\u0131 ad\u0131, anas\u0131n\u0131n k\u0131zl\u0131k soyad\u0131 vs. gibi frontend&#8217;in ilgilenece\u011fi veriler ise ID Token&#8217;da bulunmal\u0131d\u0131r.\n<\/li>\n<li><strong>Token&#8217;\u0131n de\u011fi\u015ftirilemez (immutable) oldu\u011fu unutulmamal\u0131d\u0131r!<\/strong><br \/>\nToken mapper kullan\u0131rken g\u00f6zden ka\u00e7\u0131r\u0131lmamas\u0131 gereken bir di\u011fer nokta ise token&#8217;\u0131n de\u011fi\u015ftirilemez (immutable) olmas\u0131d\u0131r. Yani kullan\u0131c\u0131ya ait bir rol veya yetki de\u011fi\u015fti\u011finde daha \u00f6nce \u00fcretilmi\u015f token&#8217;lar bu de\u011fi\u015fiklikten etkilenmeyecek ve eski bilgileri ta\u015f\u0131maya devam edecektir! Bu durum, zaman zaman sistemde istemsizce tutars\u0131zl\u0131klara yol a\u00e7abilecektir. \u0130\u015fte bundan kaynakl\u0131 bu durumu y\u00f6netebilmek ad\u0131na token s\u00fcrelerini k\u0131sa tutmal\u0131 ve m\u00fcmk\u00fcnse <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/refresh-token\/\" target=\"_blank\">refresh token<\/a> mekanizmas\u0131yla s\u00fcre\u00e7 desteklenerek gerekti\u011fi taktirde kullan\u0131c\u0131y\u0131 sistemden d\u00fc\u015f\u00fcr\u00fcp (revoke\/logout) yeni token almas\u0131 sa\u011flanmal\u0131d\u0131r. Bu ve buna benzer stratejilerle s\u00fcre\u00e7 daha korunakl\u0131 ve g\u00fcvenilir hale getirilmelidir.\n<\/li>\n<li><strong>Script mapper&#8217;lar dikkatli kullan\u0131lmal\u0131d\u0131r!<\/strong><br \/>\nScript mapper&#8217;lar olduk\u00e7a g\u00fc\u00e7l\u00fc olmalar\u0131na ra\u011fmen beraberinde kritik riskler bar\u0131nd\u0131rmaktad\u0131rlar. Bu mapper&#8217;lar JavaScript tabanl\u0131 \u00f6zel logic \u00e7al\u0131\u015ft\u0131rd\u0131\u011f\u0131 i\u00e7in her token \u00fcretiminde ekstra i\u015flem y\u00fck\u00fc olu\u015fturabilir ve bu da \u00f6zellikle yo\u011fun sistemlerde performans d\u00fc\u015f\u00fc\u015f\u00fcne neden olabilir. Ayr\u0131ca bu t\u00fcr dinamik yap\u0131lar\u0131n debug edilmesi zor oldu\u011fu i\u00e7in bak\u0131m maliyetlerinin y\u00fcksek hale gelebilme olas\u0131l\u0131\u011f\u0131 s\u00f6z konusudur. Bu y\u00fczden, Script mapper&#8217;lar\u0131n yaln\u0131zca standart mapper&#8217;lar\u0131n yeterli olmad\u0131\u011f\u0131 ve ger\u00e7ekten \u00f6zel bir i\u015f kural\u0131na ihtiya\u00e7 duyuldu\u011fu durumlarda tercih edilmesine \u00f6zen g\u00f6sterilmelidir.\n<\/li>\n<li><strong>Claim isimlendirme standard\u0131na \u00f6zen g\u00f6sterilmelidir!<\/strong><br \/>\nGeli\u015fi g\u00fczel veya belirsiz isimler kullanmak zamanla sistemde ciddi bir karma\u015faya yol a\u00e7abilir. Bu her konuda ge\u00e7erli oldu\u011fu gibi claim&#8217;ler i\u00e7in de ge\u00e7erlidir. Neyi temsil etti\u011fi belli olmayan alanlar yerine a\u00e7\u0131k ve anlaml\u0131 isimler tercih edilmeli ve m\u00fcmk\u00fcn mertebe <code>camelCase<\/code> yahut <code>snake_case<\/code> gibi isimlendirme standard\u0131 benimsenmelidir. Ve daha da \u00f6nemlisi OpenID Connect (OIDC) taraf\u0131ndan zaten tan\u0131mlanm\u0131\u015f standart claim isimleri mevcutsa bunlara sad\u0131k kal\u0131nmal\u0131d\u0131r.\n<\/li>\n<li><strong>Yerine g\u00f6re client scope kullan\u0131lmal\u0131d\u0131r!<\/strong><br \/>\nToken mapper kullan\u0131m\u0131nda yap\u0131lan bir di\u011fer hata ise bir mapper&#8217;\u0131 birden fazla client i\u00e7in tekrar tekrar tan\u0131mlamakt\u0131r. Bu yakla\u015f\u0131m, k\u0131sa vadede \u00e7al\u0131\u015fsa da uzun vadede ciddi bir y\u00f6netim ve bak\u0131m karma\u015fas\u0131na yol a\u00e7acakt\u0131r. \u00c7\u00fcnk\u00fc, herhangi bir de\u011fi\u015fiklik gerekti\u011finde t\u00fcm client&#8217;larda tek tek g\u00fcncelleme yapmak gerekecektir. Bunun yerine Keycloak&#8217;ta <a href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakta-hazir-gelen-clientlari-gorevlerini-ve-clientlarla-ilgili-scope-ve-rolleri-inceleyelim-2\/\" target=\"_blank\">Client Scope<\/a> kullanarak mapper&#8217;lar\u0131 merkezi bir yap\u0131ya almak \u00e7ok daha do\u011fru bir yakla\u015f\u0131m olacakt\u0131r. B\u00f6ylece ilgili mapper&#8217;\u0131 bir kez tan\u0131mlayabilir ve ihtiya\u00e7 duyulan t\u00fcm client&#8217;lara bu scope&#8217;u ba\u011flayarak hem tekrar\u0131n \u00f6n\u00fcne ge\u00e7ilebilir hem de daha temiz, s\u00fcrd\u00fcr\u00fclebilir ve \u00f6l\u00e7eklenebilir bir yap\u0131 kurulabilir.\n<\/li>\n<li><strong>Gereksiz mapper yazmaktan \u00e7ekinilmelidir!<\/strong><br \/>\nHer mapper, uygulaman\u0131n login ve authentication s\u00fcre\u00e7lerinde ekstra bir katman olarak devreye girecektir. Bu da her istekte ek i\u015flem, bellek kullan\u0131m\u0131 ve CPU maliyeti anlam\u0131na gelir. \u00d6zellikle birden fazla mapper kulland\u0131\u011f\u0131n\u0131zda bu etki katlanarak b\u00fcy\u00fcyebilir ve auth i\u015flemlerinde belirgin \u015fekilde yava\u015flama s\u00f6z konusu olabilir. Bu y\u00fczden prensip \u00e7ok nettir! M\u00fcmk\u00fcn oldu\u011funca az ve ger\u00e7ekten gerekliyse mapper yaz\u0131lmal\u0131d\u0131r&#8230;\n<\/li>\n<li><strong>Token boyutu test edilmelidir!<\/strong><br \/>\nJWT token boyutu, \u00e7o\u011fu geli\u015ftiricinin g\u00f6z ard\u0131 etti\u011fi ama performans a\u00e7\u0131s\u0131ndan olduk\u00e7a kritik bir konudur. Token ne kadar b\u00fcy\u00fckse, her HTTP iste\u011finin header&#8217;\u0131nda o kadar fazla veri ta\u015f\u0131nacak, bu da a\u011f trafi\u011fini \u015fi\u015firecek ve latency&#8217;yi art\u0131racakt\u0131r. Bundan kaynakl\u0131 token&#8217;\u0131n ka\u00e7 KB oldu\u011fu mutlaka test edilmeli ve header size&#8217;\u0131 \u00f6l\u00e7\u00fclmelidir. \u0130deal olarak token boyutunu m\u00fcmk\u00fcn mertebe 2-3 KB&#8217;\u0131n alt\u0131nda tutmakt\u0131r. <u>Bu kontrol performans optimizasyonunun bir par\u00e7as\u0131d\u0131r.<\/u>\n<\/li>\n<li><strong>Microservice uyumu d\u00fc\u015f\u00fcn\u00fclmelidir!<\/strong><br \/>\nMapper&#8217;\u0131 tasarlarken en \u00f6nemli sorulardan biri <em>-bu veri ger\u00e7ekten t\u00fcm microservice&#8217;lerde laz\u0131m m\u0131?-<\/em> sorusudur&#8230; E\u011fer cevap evet ise, yani veri bir\u00e7ok servisin ortak ihtiyac\u0131ysa, o taktirde token&#8217;a koymakta fayda olacakt\u0131r. Yok e\u011fer birka\u00e7 servise \u00f6zg\u00fc bir veri ise token&#8217;\u0131 \u015fi\u015firmek yerine o verinin o servislere \u00f6zel olarak ba\u015fka \u015fekillerde ta\u015f\u0131nmas\u0131 daha ak\u0131ll\u0131ca olacakt\u0131r. Bu hassasiyet, token boyutunu gereksiz yere b\u00fcy\u00fctmeksizin microservice mimarisindeki veri ak\u0131\u015f\u0131n\u0131 daha temiz ve verimli hale getirecektir.\n<\/li>\n<li><strong>Versiyonlama \u00f6nemsenmelidir!<\/strong><br \/>\nToken yap\u0131s\u0131 de\u011fi\u015fti\u011finde (yeni claim eklendi\u011finde, mevcut bir claim&#8217;in yap\u0131s\u0131 yahut ad\u0131 de\u011fi\u015fti\u011finde) eski versiyona tabii client&#8217;lar aniden patlayabilir ve kullan\u0131c\u0131lar giri\u015f yapamaz hale gelebilir. Bu riski \u00f6nlemenin ileri seviye \u00e7\u00f6z\u00fcm\u00fc, token&#8217;lara claim versiyonlamas\u0131 eklemek ve her daim backward compatibility&#8217;yi (geriye d\u00f6n\u00fck uyumluluk) g\u00f6zetmektir. B\u00f6ylece yeni token yap\u0131s\u0131na ge\u00e7ilse bile eski client&#8217;lar sorunsuz \u00e7al\u0131\u015fmaya devam edecektir. Versiyonlama sayesinde token yap\u0131s\u0131n\u0131 \u00f6zg\u00fcrce evriltebilir ve yeni \u00f6zellikler ekleyebilirken bir yandan da mevcut kullan\u0131c\u0131 deneyimini koruyabiliriz. Bu yakla\u015f\u0131m, uzun \u00f6m\u00fcrl\u00fc ve sa\u011flam bir authentication sistemi kurman\u0131n en kritik par\u00e7alar\u0131ndan birisidir.\n<\/li>\n<\/ul>\n<h3><span class=\"ez-toc-section\" id=\"13_Kritik_Soru_13_Kritik_Cevap\"><\/span>13 Kritik Soru \/ 13 Kritik Cevap<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 1 | <span style=\"color:#877572;\">Token Mapper olmasayd\u0131 ne yapard\u0131k?<\/span><\/summary>\n<p>Mapper, token i\u00e7ine veri koyarak stateless authentication sa\u011flar. Dolay\u0131s\u0131yla olmasayd\u0131, her request&#8217;te eri\u015fmemiz gereken verilere DB \/ UserInfo endpoint&#8217;lerini \u00e7a\u011f\u0131rarak eri\u015fmemiz gerecekti! B\u00f6ylece latency artacak, sistem yava\u015flayacak ve microservice&#8217;lerde de ba\u011f\u0131ml\u0131l\u0131k riski s\u00f6z konusu olabilecektir. Mapper&#8217;lar sayesinde laz\u0131m olan veriler her servisin direkt okuyaca\u011f\u0131 \u015fekilde ba\u015ftan token&#8217;a koyulmaktad\u0131r. Bu da bizlere performans ve olas\u0131 maliyetler a\u00e7\u0131s\u0131ndan b\u00fcy\u00fck avantajlar sa\u011flamaktad\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 2 | <span style=\"color:#877572;\">Token&#8217;a neler koyulmamal\u0131d\u0131r?<\/span><\/summary>\n<p>\u015eifreler, TCKN gibi hassas ki\u015fisel veriler koyulmamal\u0131d\u0131r. \u00c7\u00fcnk\u00fc, token decode edilerek hassas veriler ba\u015fkalar\u0131 taraf\u0131ndan rahatl\u0131kla elde edilebilmektedir.<\/p>\n<p>Ayr\u0131ca listeler ve JSON blob&#8217;lar gibi b\u00fcy\u00fck veriler de koyulmamal\u0131d\u0131r! \u00c7\u00fcnk\u00fc, token boyutu performans\u0131 etkilemektedir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 3 | <span style=\"color:#877572;\">Mapper&#8217;\u0131 access token&#8217;a m\u0131 yoksa ID token&#8217;a m\u0131 eklemeliyiz?<\/span><\/summary>\n<p>E\u011fer API&#8217;de kullan\u0131lacaksa access token&#8217;a, yok e\u011fer UI&#8217;da kullan\u0131lacaksa ID token&#8217;a eklenmelidir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 4 | <span style=\"color:#877572;\">Neden client scope diye bir \u015fey var?<\/span><\/summary>\n<p>Client scope, mapper&#8217;lar\u0131 tek tek her client manuel olarak eklemek yerine, reusable bir paket olarak y\u00f6netilmesini sa\u011flayan ak\u0131ll\u0131 bir mekanizmad\u0131r. Misal olarak; 10 adet microservice&#8217;in s\u00f6z konusu oldu\u011fu bir senaryoda bir mapper&#8217;\u0131 hepsinde kullanmak gerekiyorsa her servise ayr\u0131 ayr\u0131 mapper eklemek hem zaman hem de bak\u0131m a\u00e7\u0131s\u0131ndan k\u00fclfettir. Bunun yerine bir client scope olu\u015fturup mapper&#8217;\u0131 bu scope&#8217;un i\u00e7ine koyar, ard\u0131ndan ilgili t\u00fcm client&#8217;lar bu scope&#8217;a ba\u011flan\u0131rsa, hem mapper tek bir yerden y\u00f6netilmi\u015f hem de t\u00fcm client&#8217;lara otomatik olarak uygulanm\u0131\u015f olacakt\u0131r. Bu sayede merkezi yap\u0131land\u0131rma e\u015fli\u011finde temiz ve d\u00fczenli bir y\u00f6netim sa\u011flanm\u0131\u015f olur.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 5 | <span style=\"color:#877572;\">Mapper runtime&#8217;da m\u0131 \u00e7al\u0131\u015f\u0131r yoksa login s\u0131ras\u0131nda m\u0131?<\/span><\/summary>\n<p>Sadece token olu\u015fturulurken yani login s\u0131ras\u0131nda \u00e7al\u0131\u015f\u0131r! Ayr\u0131ca refresh token kullan\u0131ld\u0131\u011f\u0131nda da \u00e7al\u0131\u015facakt\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 6 | <span style=\"color:#877572;\">Token&#8217;daki veri g\u00fcncel de\u011filse ne olur?<\/span><\/summary>\n<p>Token immutable&#8217;d\u0131r. Haliyle eski token&#8217;lar da eski veriler mevcuttur. \u00c7\u00f6z\u00fcm olarak k\u0131sa token \u00f6mr\u00fc verilmeli, m\u00fcmk\u00fcn mertebe refresh token ve revoke mekanizmas\u0131ndan istifade edilmelidir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 7 | <span style=\"color:#877572;\">Mapper ile authorization yap\u0131l\u0131r m\u0131?<\/span><\/summary>\n<p>Mapper sadece token&#8217;a veri ta\u015f\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 8 | <span style=\"color:#877572;\">Script Mapper ne zaman kullan\u0131l\u0131r?<\/span><\/summary>\n<ul>\n<li>Veri transform edilecekse<\/li>\n<li>Birden fazla attribute birle\u015fecekse<\/li>\n<li>Conditional logic gerekiyorsa<\/li>\n<\/ul>\n<p>Bu durumlarda script mapper tercih edilebilir. Misal olarak; <code>role + department \u2192 permission<\/code> \u00fcretimi gibi durumlar i\u00e7in akla gelmelidir.<\/p>\n<p>Ama unutulmamal\u0131d\u0131r ki, performans maliyeti mevcuttur ve bak\u0131m s\u00fcreci ister istemez zorla\u015fmaktad\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 9 | <span style=\"color:#877572;\">Mapper performans\u0131 etkiler mi?<\/span><\/summary>\n<p>Elbet etkileyecektir. \u00d6zellikle login s\u00fcrecinde mapper&#8217;lar\u0131n devreye girmesi hem s\u00fcreci uzataca\u011f\u0131 hem de token boyutunu b\u00fcy\u00fctece\u011fi i\u00e7in t\u00fcm bunlar network maliyetine yans\u0131yacakt\u0131r.<\/p>\n<p>\u00d6zellikle script mapper ve external data mapper durumlar\u0131 haddinden fazla maliyetli olaca\u011f\u0131 i\u00e7in dikkat edilmelidir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 10 | <span style=\"color:#877572;\">Mapper ile multi-tenant yap\u0131 kurulur mu? Ya da bir ba\u015fka deyi\u015fle tenant bilgisi mapper ile y\u00f6netilebilir mi?<\/span><\/summary>\n<p>Mapper&#8217;lar kullan\u0131larak <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/multitenancy\/\" target=\"_blank\">multi-tenant<\/a> bir yap\u0131 kurmak olduk\u00e7a yayg\u0131n ve pratik bir yakla\u015f\u0131md\u0131r. Kullan\u0131c\u0131ya ait tenant bilgisi token i\u00e7ine bir claim olarak eklenerek her istekte bu bilginin ta\u015f\u0131nmas\u0131 sa\u011flan\u0131r ve b\u00f6ylece backend taraf\u0131nda gelen request&#8217;lerdeki tenant bilgisi ile token&#8217;daki tenant kar\u015f\u0131la\u015ft\u0131r\u0131larak yetki kontrol\u00fc ilgili tenant kapsam\u0131nda ger\u00e7ekle\u015ftirilip i\u015flemler y\u00fcr\u00fct\u00fcl\u00fcr.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 11 | <span style=\"color:#877572;\">Mapper ile dynamic permission yap\u0131l\u0131r m\u0131?<\/span><\/summary>\n<p>Hay\u0131r&#8230; Mapper, permission&#8217;\u0131 token&#8217;a koyar ama runtime&#8217;da de\u011fi\u015ftiremez! Yani bu ihtiya\u00e7 i\u00e7in token mapper&#8217;lar yetersiz kalmaktad\u0131r. Dinamik yetkilendirme senaryolar\u0131n\u0131 \u00e7\u00f6zebilmek i\u00e7in policy engine veya DB lookup gibi \u00e7\u00f6z\u00fcmlere gidilmesi \u00f6nerilmektedir.<\/p>\n<p><em><strong>Policy Engine<\/strong><\/em>, yetki kararlar\u0131n\u0131 sabit token i\u00e7inden okumak yerine, d\u0131\u015far\u0131da \u00e7al\u0131\u015fan bir <u>karar motoruna<\/u> soran bir yap\u0131lanmad\u0131r. \u00d6rne\u011fin; <em>Open Policy Agent (OPA)<\/em>, <em>-bu kullan\u0131c\u0131 \u015fu kayna\u011fa eri\u015febilir mi?-<\/em> sorusunu runtime&#8217;da kurallara g\u00f6re de\u011ferlendirerek dinamik bir \u015fekilde y\u00f6nlendirmede bulunabilir. B\u00f6ylece roller veya claim&#8217;ler statik de\u011fildir, bilakis anl\u0131k kurallar ve ba\u011flama g\u00f6re \u015fekillenecektir.<\/p>\n<p><em><strong>DB lookup<\/strong><\/em> ise daha basit olsa da yine de dinamik bir davran\u0131\u015f sergileyen yakla\u015f\u0131md\u0131r. Burada uygulama, gelen request&#8217;teki kullan\u0131c\u0131 bilgisine bak\u0131p veritaban\u0131na gider ve g\u00fcncel yetkileri, tenant bilgisini veya izinleri o anda \u00e7eker. ani token&#8217;daki bilgiye k\u00f6r\u00fc k\u00f6r\u00fcne g\u00fcvenmek yerine <em>-en g\u00fcncel veri ne?-<\/em> diyerek her istekte kontrol sa\u011flar.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 12 | <span style=\"color:#877572;\">Mapper ile UserInfo endpoint fark\u0131 nedir?<\/span><\/summary>\n<p>Mapper ile UserInfo ayn\u0131 amaca hizmet eden iki farkl\u0131 yakla\u015f\u0131md\u0131r.<\/p>\n<p>Mapper, Keycloak i\u00e7inde tan\u0131mlanan bir \u00f6zelliktir, yani config&#8217;tir. Login an\u0131nda \u00e7al\u0131\u015f\u0131r ve kullan\u0131c\u0131 bilgilerini token&#8217;\u0131n i\u00e7ine g\u00f6mmemizi sa\u011flar. Sonras\u0131nda ise uygulama bu bilgileri ba\u015fka hi\u00e7bir yere gitmeye gerek kalmaks\u0131z\u0131n direkt token i\u00e7erisinden okuyabilir. Yani stateless&#8217;dir.<\/p>\n<p>UserInfo ise endpoint&#8217;tir. Token&#8217;\u0131 al\u0131p Keycloak&#8217;a tekrar istek atarak kullan\u0131c\u0131ya dair bilgiler edinilmesini sa\u011flar. Keycloak, bu istek neticesinde o anki bilgiyi d\u00f6ner. Dolay\u0131s\u0131yla her seferinde bir d\u0131\u015f \u00e7a\u011fr\u0131 gerektirir. Bundan kaynakl\u0131 stateful&#8217;dur.<\/p>\n<blockquote style=\"font-size:12px;\"><p><em>Stateless, sistemin \u00e7al\u0131\u015fmak i\u00e7in ekstra bir yere (DB, servis vs.) gidip bilgi talep etmesine gerek olmamas\u0131, yani t\u00fcm gerekli bilginin token&#8217;da bulunmas\u0131d\u0131r.<\/p>\n<p>Stateful ise, sistmein karar verebilmesi i\u00e7in her istekte d\u0131\u015f bir kayna\u011fa gidip g\u00fcncel durumu kontrol etmesi demektir.<\/em><\/p><\/blockquote>\n<p>Mapper \u2192 Bilgiyi ba\u015ftan cebime koyar\u0131m&#8230;<br \/>\nUserInfo \u2192 Bilgi gerektik\u00e7e gidip sorar\u0131m&#8230;<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 13 | <span style=\"color:#877572;\">Mapper ile security a\u00e7\u0131\u011f\u0131 olu\u015fur mu?<\/span><\/summary>\n<p>Evet! token&#8217;\u0131n public olmas\u0131ndan dolay\u0131 hassas verilerin s\u0131zd\u0131r\u0131lmas\u0131 olas\u0131d\u0131r. Dikkat edilmelidir!<br \/>\n<\/details>\n<h3><span class=\"ez-toc-section\" id=\"Token_Mapperlarin_Kullanimi\"><\/span>Token Mapper&#8217;lar\u0131n Kullan\u0131m\u0131<span class=\"ez-toc-section-end\"><\/span><\/h3>\n<p>\u015eimdi s\u0131ra token mapper&#8217;lar\u0131 deneyimlemeye geldi.<\/p>\n<p>\u0130lk olarak Keycloak&#8217;da bir kullan\u0131c\u0131n\u0131n edindi\u011fi token&#8217;\u0131n en sade haliyle  nas\u0131l bir i\u00e7eri\u011fe sahip oldu\u011funu inceleyelim&#8230;<br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-1.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"128\" height=\"407\" class=\"alignleft size-full wp-image-28564\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-1.png 128w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-1-94x300.png 94w\" sizes=\"auto, (max-width: 128px) 100vw, 128px\" \/><\/a>Evet&#8230; G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere bir kullan\u0131c\u0131da varsay\u0131lan olarak a\u015fa\u011f\u0131 yukar\u0131 yandaki g\u00f6rseldeki gibi i\u00e7eri\u011fe sahip bir token yap\u0131s\u0131 gelmektedir.<\/p>\n<p>Tabi ki de kullan\u0131c\u0131ya rol yahut yetki verdik\u00e7e buradaki payload \u015fekillenecektir. \u00c7\u00fcnk\u00fc bu claim&#8217;ler zaten bu kaynaklardan beslenmektedir. Ancak ana claim&#8217;lerin yan\u0131na ekstradan bir kullan\u0131c\u0131 bilgisi eklemek isterseniz burada attribute olu\u015fturup mapper&#8217;lar ile eklemeniz en do\u011fru yakla\u015f\u0131m olacakt\u0131r. Bu yakla\u015f\u0131m, yukar\u0131daki sat\u0131rlarda <a class=\"ez-toc-link ez-toc-heading-5\" href=\"#Mapper_Turleri_Nelerdir\">Mapper T\u00fcrleri Nelerdir?<\/a> ba\u015fl\u0131\u011f\u0131 alt\u0131nda de\u011ferlendirdi\u011fimiz <strong>User Attribute Mapper<\/strong> t\u00fcr\u00fcne kar\u015f\u0131l\u0131k gelmektedir.<\/p>\n<p>Diyelim ki, kullan\u0131c\u0131lar\u0131n <code>department<\/code> bilgisini token&#8217;a claim olarak eklemek istiyoruz. Tabi bunun i\u00e7in \u00f6ncelikle ilgili isimde bir attribute eklenmesi gerekecektir.<\/p>\n<p>Bu da <code>Realm settings<\/code> \u00fczerinden <code>User profile<\/code> sekmesine gelerek ger\u00e7ekle\u015ftirilebilir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-2.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"1959\" height=\"954\" class=\"aligncenter size-full wp-image-28565\" \/><\/a>\u015eimdi normal \u015fartlarda, bu attribute&#8217;u ekledikten sonra a\u015fa\u011f\u0131daki gibi kullan\u0131c\u0131 detaylar\u0131ndan doldurulup kaydedildi\u011finde token&#8217;a gelmesini bekleyebilirsiniz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-3.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"525\" height=\"239\" class=\"aligncenter size-full wp-image-28567\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-3.png 525w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-3-300x137.png 300w\" sizes=\"auto, (max-width: 525px) 100vw, 525px\" \/><\/a>Ancak nafile&#8230; Bu attribute taraf\u0131m\u0131zca olu\u015fturuldu\u011fu ve sistem taraf\u0131ndan bilinmedi\u011fi i\u00e7in bizim taraf\u0131m\u0131zdan token&#8217;a eklenmesi gerekecektir. Bunun i\u00e7in mapper olu\u015fturulmas\u0131 gerekmektedir.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Token_Mapper_Olusturma\"><\/span>Token Mapper Olu\u015fturma<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-4.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"287\" height=\"484\" class=\"alignleft size-full wp-image-28568\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-4.png 287w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-4-178x300.png 178w\" sizes=\"auto, (max-width: 287px) 100vw, 287px\" \/><\/a>Token mapper olu\u015fturman\u0131n en temiz ve do\u011fru yolu scope olarak olu\u015fturmakt\u0131r. Bunun i\u00e7in <code>Client Scopes<\/code> men\u00fcs\u00fcne gelerek bir scope olu\u015fturulmal\u0131d\u0131r.<\/p>\n<p>\u015eimdi bu scope&#8217;a olu\u015fturaca\u011f\u0131m\u0131z mapper ile hem istedi\u011fimiz attribute&#8217;u token&#8217;a ekleyebilece\u011fiz hem de istedi\u011fimiz client&#8217;ta bu scope&#8217;u \u00e7a\u011f\u0131rarak, o client&#8217;tan olacak login s\u00fcre\u00e7lerinde mapper&#8217;dan istifade edebiliyor olaca\u011f\u0131z. B\u00f6ylece bir mapper&#8217;\u0131 scope \u00fczerinden tek seferde tan\u0131mlay\u0131p, farkl\u0131 client&#8217;larda kullanabilecek ve tekrar tekrar tan\u0131mlama  zahmetinden kurtulmu\u015f olaca\u011f\u0131z.<\/p>\n<p>Devam etmeden \u00f6nce ak\u0131llara gelebilecek olan <em><strong>ideal olan her mapper i\u00e7in ayr\u0131 bir scope olu\u015fturmak m\u0131?<\/strong><\/em> sorusunu cevapland\u0131ral\u0131m istiyorum&#8230; El-cevap: Hay\u0131r. Her mapper i\u00e7in ayr\u0131 bir scope olu\u015fturmak do\u011fru bir kabul olmayacakt\u0131r. \u00c7\u00fcnk\u00fc, scope  dedi\u011fimiz \u015fey esas\u0131nda mant\u0131ksal bir paket gibi d\u00fc\u015f\u00fcn\u00fclebilir. Yani claim&#8217;leri tek tek ayr\u0131 scope&#8217;lara da\u011f\u0131tmak yerine, birbiriyle ili\u015fkili olanlar\u0131 ayn\u0131 scope i\u00e7ine toplamak en do\u011frusu olacakt\u0131r. Misal olarak; <code>profile-data<\/code> diye bir scope a\u00e7\u0131p i\u00e7ine <em>name<\/em>, <em>surname<\/em>, <em>department<\/em> vs. gibi mapper&#8217;lar\u0131 koymak ya da <code>authorization-data<\/code> diye bir scope i\u00e7erisine de <em>roles<\/em>, <em>groups<\/em> vs. gibi claim&#8217;leri depolamak en mant\u0131kl\u0131s\u0131d\u0131r. Olaya mant\u0131ksal olarak bakarsak e\u011fer; mapper&#8217;lar, tekil kuralken, scope&#8217;lar ise bu kurallar\u0131n mant\u0131kl\u0131 grupland\u0131\u011f\u0131 paketler olarak d\u00fc\u015f\u00fcn\u00fclebilir. O y\u00fczden her mapper&#8217;a ayr\u0131 bir scope de\u011fil, anlaml\u0131 gruplara g\u00f6re scope olu\u015fturmak en sa\u011fl\u0131kl\u0131 kabul olacakt\u0131r.<\/p>\n<p>Velhas\u0131l&#8230;<\/p>\n<p>\u0130lgili scope&#8217;a t\u0131klay\u0131p Mappers sekmesine geldi\u011fimizde bizleri a\u015fa\u011f\u0131daki gibi iki se\u00e7enek kar\u015f\u0131layacakt\u0131r:<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"1523\" height=\"639\" class=\"aligncenter size-full wp-image-28569\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5.png 1523w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5-300x126.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5-1024x430.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-5-768x322.png 768w\" sizes=\"auto, (max-width: 1523px) 100vw, 1523px\" \/><\/a><\/p>\n<table style=\"width:100%; border-collapse:collapse; font-family:Arial, sans-serif; font-size:13px; text-align:left;\">\n<tr>\n<td style=\"width:50%; border:1px solid #ddd; padding:8px; vertical-align:top;\">\n<div style=\"font-weight:bold; margin-bottom:4px;\">Add predefined mapper<\/div>\n<div style=\"margin-bottom:6px;\">Haz\u0131r mapper\u2019lar\u0131 tek t\u0131kla eklemesini sa\u011flar, ekstra config gerektirmez.<\/div>\n<div><code>email, preferred_username, roles<\/code><\/div>\n<\/td>\n<td style=\"width:50%; border:1px solid #ddd; padding:8px; vertical-align:top;\">\n<div style=\"font-weight:bold; margin-bottom:4px;\">Configure a new mapper<\/div>\n<div style=\"margin-bottom:6px;\">Custom mapper olu\u015fturulmas\u0131n\u0131 sa\u011flar, claim tamamen taraf\u0131m\u0131zca tan\u0131mlan\u0131r.<\/div>\n<div><code>department \u2192 \"IT\"<\/code><\/div>\n<\/td>\n<\/tr>\n<\/table>\n<p>Bizler senaryomuza uygun olarak <em><strong>Configure a new mapper<\/strong><\/em> se\u00e7ene\u011finden devam edece\u011fiz.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"User_Attribute_Mapper_Olusturma\"><\/span>User Attribute Mapper Olu\u015fturma<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>\u0130lgili se\u00e7ene\u011fe t\u0131klad\u0131\u011f\u0131m\u0131zda a\u00e7\u0131lan pencereden a\u015fa\u011f\u0131daki gibi <strong>User Attribute<\/strong> t\u00fcr\u00fc se\u00e7ilmeli,<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-6.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"572\" height=\"222\" class=\"aligncenter size-full wp-image-28573\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-6.png 572w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-6-300x116.png 300w\" sizes=\"auto, (max-width: 572px) 100vw, 572px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-7.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-7.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"345\" height=\"754\" class=\"alignleft size-full wp-image-28574\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-7.png 345w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-7-137x300.png 137w\" sizes=\"auto, (max-width: 345px) 100vw, 345px\" \/><\/a>ve ard\u0131ndan yandaki gibi ilgili mapper yap\u0131land\u0131r\u0131lmal\u0131d\u0131r.<\/p>\n<p>Buradaki yap\u0131land\u0131rmalara de\u011finmemiz gerekirse e\u011fer;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong>Mapper type<\/strong>: Mapper&#8217;\u0131n t\u00fcr\u00fcn\u00fc ifade etmektedir.<\/li>\n<li><strong>Name<\/strong>: Teknik olarak hi\u00e7bir \u015feye etki etmiyor olsa da mapper&#8217;\u0131n Keycloak i\u00e7indeki ismine kar\u015f\u0131l\u0131k gelmektedir.<\/li>\n<li><strong>User Attribute<\/strong>: User&#8217;\u0131n hangi attribute&#8217;una kar\u015f\u0131l\u0131k bu mapper&#8217;\u0131n olu\u015fturuldu\u011fu belirlenmektedir.<\/li>\n<li><strong>Token Claim Name<\/strong>: Token&#8217;da hangi claim&#8217;e kar\u015f\u0131l\u0131k bu de\u011ferin eklenece\u011fi belirlenmektedir.<\/li>\n<li><strong>Claim JSON Type<\/strong>: Verinin tipi belirlenmektedir.<\/li>\n<li><strong>Add to ID token<\/strong>: Claim&#8217;in ID token&#8217;a eklenip eklenmeyece\u011fini yap\u0131land\u0131rmaktad\u0131r.<\/li>\n<li><strong>Add to access token<\/strong>: Benzer mant\u0131kla claim&#8217;in access token&#8217;a eklenip eklenmeyece\u011fini yap\u0131land\u0131rmaktad\u0131r.<\/li>\n<li><strong>Add to lightweight access token<\/strong>: Standart kullan\u0131m\u0131n d\u0131\u015f\u0131nda kalan bir optimizasyondur. Keycloak, token&#8217;\u0131 k\u00fc\u00e7\u00fcltmek ve daha h\u0131zl\u0131 ta\u015f\u0131yabilmek i\u00e7in kimi zaman hafif (lightweight) access token \u00fcretimi ger\u00e7ekle\u015ftirebilmektedir. \u0130\u015fte bu ayar, bu durumlarda ilgili claim&#8217;in eklenip eklenmeyece\u011fini yap\u0131land\u0131rmaktad\u0131r.<\/li>\n<li><strong>Add to userinfo<\/strong>: UserInfo endpoint&#8217;i \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda bu verinin d\u00f6n\u00fcp d\u00f6nmeyece\u011fi belirlenmektedir.<\/li>\n<li><strong>Add to token introspection<\/strong>: Token introspection endpoint&#8217;inde bu claim&#8217;in g\u00f6r\u00fcn\u00fcp g\u00f6r\u00fcnmeyece\u011fi yap\u0131land\u0131r\u0131lmaktad\u0131r.<\/li>\n<li><strong>Multivalued<\/strong>: \u0130lgili claim&#8217;in de\u011ferinin \u00e7oklu olup olmayaca\u011f\u0131n\u0131 yap\u0131land\u0131rmaktad\u0131r. E\u011fer \u00e7oklu olursa de\u011feri bir array i\u00e7erisinde getirecektir.\n<ul>\n<li><em>Off<\/em>\n<pre style=\"margin:0; font-size:12px; line-height:1.2;width:200px;\">\"department\": \"IT\"<\/pre>\n<\/li>\n<li><em>On<\/em>\n<pre style=\"margin:0; font-size:12px; line-height:1.2;width:200px;\">\"department\": [\"IT\", \"HR\"]<\/pre>\n<\/li>\n<\/ul>\n<\/li>\n<li><strong>Aggregate attribute values<\/strong>: E\u011fer kullan\u0131c\u0131da ayn\u0131 attribute&#8217;tan birden fazla mevcutsa hepsini birle\u015ftirip birle\u015ftirmeyece\u011fini yap\u0131land\u0131rmaktad\u0131r. Kapal\u0131 kald\u0131\u011f\u0131 taktirde ilk de\u011feri alacakt\u0131r.<\/li>\n<\/ul>\n<p>Evet, bu yap\u0131land\u0131rma ayarlar\u0131nda bir mapper&#8217;\u0131 olu\u015fturduktan sonra ilgili client \u00fczerinden elde edilen token&#8217;\u0131n payload&#8217;una g\u00f6z atarsak a\u015fa\u011f\u0131daki gibi <code>department<\/code> de\u011ferinin geldi\u011fini g\u00f6zlemlemi\u015f olaca\u011f\u0131z&#8230;<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-8.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-8.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"264\" height=\"77\" class=\"aligncenter size-full wp-image-28575\" \/><\/a><\/p>\n<h5><span class=\"ez-toc-section\" id=\"Hardcoded_Mapper_Olusturma\"><\/span>Hardcoded Mapper Olu\u015fturma<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Peki&#8230; \u00d6rne\u011fimizi geni\u015fletmek ad\u0131na bir de sabit de\u011ferlerin token&#8217;a nas\u0131l eklendi\u011fini inceleyelim. Tabi bunun i\u00e7in de <strong>Hardcoded Mapper<\/strong> olu\u015fturmam\u0131z gerekecektir.<\/p>\n<p>Bu sabit de\u011fer i\u00e7in uygun bir scope olu\u015fturabiliriz. Mesela; <code>info<\/code> ad\u0131nda bir scope&#8217;umuz olsun.<\/p>\n<p>Bu scope&#8217;a <strong><em>Configure a new mapper<\/em><\/strong> se\u00e7ene\u011fi \u00fczerinden <strong>Hardcoded claim<\/strong>&#8216;i se\u00e7erek sabit bir de\u011fer ekleyebiliriz. <a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-9.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-9.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"316\" height=\"334\" class=\"aligncenter size-full wp-image-28576\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-9.png 316w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-9-284x300.png 284w\" sizes=\"auto, (max-width: 316px) 100vw, 316px\" \/><\/a>Evet, g\u00f6rselde eksik kalan yap\u0131land\u0131rmalar\u0131 \u00f6nceki sat\u0131rdakilerle ayn\u0131 olaca\u011f\u0131 i\u00e7in es ge\u00e7mi\u015f bulunuyorum. Bu \u015fekilde bir mapper&#8217;\u0131 olu\u015fturup, <code>info<\/code> scope&#8217;unu da ilgili client&#8217;a ekleyerek bir token talep edersek, bu token i\u00e7erisinde a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi sabit de\u011ferin de geldi\u011fini g\u00f6rm\u00fc\u015f olaca\u011f\u0131z.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-Token-Mapperlari-Inceleyelim.-11-10.png\" alt=\"Keycloak&#039;da Token Mapper&#039;lar\u0131 \u0130nceleyelim... #11\" width=\"285\" height=\"103\" class=\"aligncenter size-full wp-image-28577\" \/><\/a><\/p>\n<p>\u0130\u015fte bu kadar&#8230;<\/p>\n<p>Geri kalan mapper t\u00fcrlerini tecr\u00fcbe etmeyi sizlere b\u0131rak\u0131yorum \ud83d\ude09<\/p>\n<p>Nihai olarak;<\/p>\n<p>Token&#8217;a koyulan her veri, esas\u0131nda sisteme at\u0131lan bir imzad\u0131r&#8230; Ya performans\u0131 h\u0131zland\u0131r\u0131r ya da fark etmeden sistemi yava\u015flat\u0131r&#8230; Ya g\u00fcveli\u011fi g\u00fc\u00e7lendirir ya da zafiyet olu\u015fturabilir&#8230; Token Mapper&#8217;lar bu y\u00fczden basit bir \u00f6zellik de\u011fildir, bilakis do\u011fru kullan\u0131ld\u0131\u011f\u0131nda ihtiya\u00e7 gideren ancak yanl\u0131\u015f kullan\u0131ld\u0131\u011f\u0131nda aya\u011fa dola\u015f\u0131p t\u00f6kezleten stratejik bir yap\u0131lanmad\u0131r. Bu y\u00fczden mesele hi\u00e7bir zaman <em>-token&#8217;a ne koyabilirim?-<\/em> sorusu de\u011fildir! <em>-ger\u00e7ekten neyi koymal\u0131y\u0131m?-<\/em> sorusudur&#8230; Bu soruya verilen cevap, kurulan sistemin kalitesiyle do\u011fru orant\u0131l\u0131d\u0131r.<\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde, Keycloak&#8217;da \u00fcretilen token&#8217;lar\u0131n i\u00e7ine ek veri eklenmesini sa\u011flayan Token Mapper mekanizmas\u0131n\u0131 mercek alt\u0131na al\u0131yor olacak ve nedir, ne i\u015fe yarar ve hangi senaryolarda kullan\u0131l\u0131r? gibi sorulara cevap ararken, konuyu sadece teoride&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":28235,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,5554],"tags":[5690,1136,5689,5686,5555,5692,5693,5588,5688,5691,5685,5687],"class_list":["post-28550","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-keycloak","tag-group-mapper","tag-hardcoded","tag-hardcoded-mapper","tag-introspection","tag-keycloak","tag-opa","tag-open-policy-agent","tag-policy-engine","tag-role-mapper","tag-script-mapper","tag-token-mapper","tag-user-attribute"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28550","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=28550"}],"version-history":[{"count":15,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28550\/revisions"}],"predecessor-version":[{"id":28580,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28550\/revisions\/28580"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28235"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28550"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28550"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28550"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}