﻿
{"id":28484,"date":"2026-03-09T04:43:56","date_gmt":"2026-03-09T04:43:56","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28484"},"modified":"2026-03-09T04:43:56","modified_gmt":"2026-03-09T04:43:56","slug":"keycloakda-first-broker-login-flowu-inceleyelim-10","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/","title":{"rendered":"Keycloak&#8217;da First Broker Login Flow&#8217;u \u0130nceleyelim #10"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p>Merhaba,<br \/>\n<br \/>\nBiliyorsunuz ki, modern kimlik y\u00f6netimi sistemlerinde kullan\u0131c\u0131lar yaln\u0131zca uygulaman\u0131n kendi kullan\u0131c\u0131 veritaban\u0131 \u00fczerinden de\u011fil; Google, Microsoft, GitHub veya kurumsal kimlik sa\u011flay\u0131c\u0131lar\u0131 gibi harici <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/identity-provider\/\" target=\"_blank\">Identity Provider<\/a>&#8216;lar arac\u0131l\u0131\u011f\u0131yla kimlik do\u011frulamas\u0131 ger\u00e7ekle\u015ftirmektedirler. Keycloak bu senaryoyu <u>Identity Brokering<\/u> \u00f6zelli\u011fi ile desteklemekte ve harici bir provider \u00fczerinden ilk kez giri\u015f yapacak bir kullan\u0131c\u0131n\u0131n sistemde nas\u0131l temsil edilece\u011fini belirleyen kritik bir mekanizma olan <em>First Broker Login Flow<\/em>&#8216;u sunmaktad\u0131r. Bu ak\u0131\u015f, harici kimli\u011fi mevcut bir kullan\u0131c\u0131 ile e\u015fle\u015ftirme, yeni kullan\u0131c\u0131 olu\u015fturma veya kullan\u0131c\u0131dan ek do\u011frulamalar alma gibi kararlar\u0131n tamam\u0131n\u0131n kontrol edildi\u011fi bir merkezi nokta sa\u011flamaktad\u0131r. \u015eimdi gelin bu i\u00e7erik boyunca ilgili ak\u0131\u015f\u0131 tam teferruatl\u0131 inceleyip de\u011ferlendirmeye ba\u015flayal\u0131m&#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-4'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Keycloakda_First_Broker_Login_Flow_Nedir\" >Keycloak&#8217;da First Broker Login Flow Nedir?<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Gercek_Hayat_Ornegi\" >Ger\u00e7ek Hayat \u00d6rne\u011fi<\/a><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#First_Broker_Login_Flowun_Amaci_Nedir\" >First Broker Login Flow&#8217;un Amac\u0131 Nedir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#First_Broker_Login_Flowun_Ic_Yapisi\" >First Broker Login Flow&#8217;un \u0130\u00e7 Yap\u0131s\u0131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#First_Broker_Login_Flowu_Kullanirken_Nelere_Dikkat_Edilmelidir\" >First Broker Login Flow&#8217;u Kullan\u0131rken Nelere Dikkat Edilmelidir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#13_Kritik_Soru_13_Kritik_Cevap\" >13 Kritik Soru \/ 13 Kritik Cevap<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Keycloakda_First_Broker_Login_Flow_Yapilandirmasini_Inceleyelim\" >Keycloak&#8217;da First Broker Login Flow Yap\u0131land\u0131rmas\u0131n\u0131 \u0130nceleyelim<\/a><ul class='ez-toc-list-level-5' ><li class='ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-8\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#1_External_Identity_Providerin_Yapilandirilmasi_Google\" >1. External Identity Provider&#8217;\u0131n Yap\u0131land\u0131r\u0131lmas\u0131 (Google)<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-5'><a class=\"ez-toc-link ez-toc-heading-9\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#2_Internal_Identity_Providerin_Yapilandirilmasi_Keycloak\" >2. Internal Identity Provider&#8217;\u0131n Yap\u0131land\u0131r\u0131lmas\u0131 (Keycloak)<\/a><ul class='ez-toc-list-level-6' ><li class='ez-toc-heading-level-6'><a class=\"ez-toc-link ez-toc-heading-10\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Advanced_Settings\" >Advanced Settings<\/a><\/li><\/ul><\/li><\/ul><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-11\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Direkt_AspNET_Core_Projesinden_External_Identity_Provider_Ile_Login_Yapma\" >Direkt Asp.NET Core Projesinden External Identity Provider \u0130le Login Yapma<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-12\" href=\"https:\/\/www.gencayyildiz.com\/blog\/keycloakda-first-broker-login-flowu-inceleyelim-10\/#Direkt_SPAda_External_Identity_Provider_Ile_Login_Yapma\" >Direkt SPA&#8217;da External Identity Provider \u0130le Login Yapma<\/a><\/li><\/ul><\/nav><\/div>\n<h4><span class=\"ez-toc-section\" id=\"Keycloakda_First_Broker_Login_Flow_Nedir\"><\/span>Keycloak&#8217;da First Broker Login Flow Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>First Broker Login Flow, Keycloak&#8217;a Google, Github, Azure AD, SAML IdP yahut ba\u015fka bir Keycloak gibi harici bir kimlik sa\u011flay\u0131c\u0131 (Identity Provider \/ IdP) \u00fczerinden ilk kez giri\u015f yapan bir kullan\u0131c\u0131n\u0131n nas\u0131l i\u015flenece\u011fini belirleyen bir ak\u0131\u015ft\u0131r. Burada zaten dikkat ederseniz kritik kelime <strong><em>First (ilk)<\/em><\/strong>&#8216;t\u00fcr. Yani buradan \u015funu anlayabiliriz ki; kullan\u0131c\u0131n\u0131n, harici bir IdP ile <u>ilk<\/u> defa giri\u015f yapt\u0131\u011f\u0131 ve Keycloak&#8217;da bu IdP ile e\u015fle\u015fmi\u015f bir kullan\u0131c\u0131n\u0131n hen\u00fcz olmad\u0131\u011f\u0131 durumlarda kullan\u0131lan bir ak\u0131\u015ftan bahsediyoruz&#8230;<\/p>\n<p>Tabi First Broker Login Flow&#8217;u tam sindirebilmek i\u00e7in \u00f6ncelikle b\u00fcy\u00fck resmi anlamak gerekti\u011fini d\u00fc\u015f\u00fcn\u00fcyorum. Malumunuz, temelde Keycloak&#8217;da iki farkl\u0131 login senaryosu mevcuttur. Bunlardan biri kullan\u0131c\u0131n\u0131n Keycloak \u00fczerinden username ve password bilgilerini kullanarak <a href=\"https:\/\/www.gencayyildiz.com\/blog\/tag\/browser-flow\/\" target=\"_blank\">Browser Flow<\/a> ile giri\u015f yapt\u0131\u011f\u0131 normal login ak\u0131\u015f\u0131yken, di\u011feri ise Google, Azure AD vs. gibi harici sa\u011flay\u0131c\u0131lardan giri\u015f yapt\u0131\u011f\u0131 mevzu bahis Broker Login Flow&#8217;dur.<\/p>\n<blockquote style=\"font-size:13px;\"><p><em>E\u011fer ki, kullan\u0131c\u0131 harici sa\u011flay\u0131c\u0131 \u00fczerinden daha \u00f6nce e\u015fle\u015ftirilmi\u015fse buna <strong>Post Broker Login Flow<\/strong>, yok e\u011fer kullan\u0131c\u0131 ilk defa harici kaynaktan geliyorsa buna da <strong>First Broker Login Flow<\/strong> denmektedir.<\/em><\/p><\/blockquote>\n<h5><span class=\"ez-toc-section\" id=\"Gercek_Hayat_Ornegi\"><\/span>Ger\u00e7ek Hayat \u00d6rne\u011fi<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Diyelim ki, login ekran\u0131nda Google, GitHub ve Azure AD se\u00e7enekleri olan myapp.com domaininde bir uygulamam\u0131z olsun ve kullan\u0131c\u0131 Google \u00fczerinden login olmaya \u00e7al\u0131\u015fs\u0131n&#8230; S\u00fcre\u00e7 \u015f\u00f6yle cereyan edecektir:<\/p>\n<p>  Her \u015feyden \u00f6nce Keycloak <em>-bu kullan\u0131c\u0131 bende var m\u0131?-<\/em> sorusunu soracakt\u0131r&#8230; ve ald\u0131\u011f\u0131 cevaba g\u00f6re a\u015fa\u011f\u0131daki iki durum s\u00f6z konusu olacakt\u0131r.<\/p>\n<div style=\"display:flex;gap:24px;align-items:stretch;margin:32px 0;font-family:inherit;\">\n<div style=\"flex:1;border:1px solid #e5e7eb;border-radius:12px;padding:24px;background:#f9fafb;\">\n    <span style=\"margin-top:0;margin-bottom:16px;font-size:15px;\">Durum 1 \u2014 Kullan\u0131c\u0131 YOK (\u0130lk Giri\u015f)<\/span><\/p>\n<p style=\"margin-top:0;margin-bottom:16px;line-height:1.6;font-size:15px;\">\n      Bu senaryoda sistem, <strong>First Broker Login Flow<\/strong> s\u00fcrecini ba\u015flatacakt\u0131r ve kullan\u0131c\u0131n\u0131n sistemdeki durumuna g\u00f6re a\u015fa\u011f\u0131daki kararlar\u0131 verecektir:\n    <\/p>\n<ul style=\"padding-left:18px;margin:0;line-height:1.8;font-size:15px;\">\n<li>Yeni kullan\u0131c\u0131 olu\u015fturulsun mu?<\/li>\n<li>Mevcut bir kullan\u0131c\u0131yla e\u015fle\u015ftirilsin mi?<\/li>\n<li>Email do\u011frulamas\u0131 gerekli mi?<\/li>\n<li>Kullan\u0131c\u0131dan ek bilgi istenmeli mi?<\/li>\n<li>Hesap linking i\u015flemi yap\u0131ls\u0131n m\u0131?<\/li>\n<\/ul><\/div>\n<div style=\"flex:1;border:1px solid #e5e7eb;border-radius:12px;padding:24px;background:#ffffff;\">\n    <span style=\"margin-top:0;margin-bottom:16px;font-size:15px;\">Durum 2 \u2014 Kullan\u0131c\u0131 VAR<\/span><\/p>\n<p style=\"margin-top:0;margin-bottom:16px;line-height:1.6;font-size:15px;\">\n      Bu durumda <strong>First Broker Login Flow<\/strong> \u00e7al\u0131\u015fmayacak, bunun yerine <strong>Post Broker Login Flow<\/strong> devreye girecek ve kullan\u0131c\u0131 do\u011frudan giri\u015f yapacakt\u0131r.\n    <\/p>\n<\/p><\/div>\n<\/div>\n<h4><span class=\"ez-toc-section\" id=\"First_Broker_Login_Flowun_Amaci_Nedir\"><\/span>First Broker Login Flow&#8217;un Amac\u0131 Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Keycloak&#8217;da first broker login flow, bir kullan\u0131c\u0131 harici bir kimlik sa\u011flay\u0131c\u0131dan ilk kez giri\u015f yapt\u0131\u011f\u0131nda devreye giren \u00f6zel bir kimlik do\u011frulama s\u00fcrecidir ve as\u0131l amac\u0131 bu harici kimli\u011fi Keycloak i\u00e7indeki yerel kullan\u0131c\u0131 hesaplar\u0131yla g\u00fcvenli ve tutarl\u0131 bir \u015fekilde ili\u015fkilendirmektir.<\/p>\n<p>Misal olarak kullan\u0131c\u0131, Google veya GitHub hesab\u0131yla giri\u015f yapt\u0131\u011f\u0131nda, Keycloak \u00f6nce bu kullan\u0131c\u0131n\u0131n sistemde zaten kay\u0131tl\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol eder, e\u011fer ayn\u0131 e-posta adresiyle manuel olu\u015fturulmu\u015f bir hesap varsa kullan\u0131c\u0131dan bu hesaplar\u0131 birle\u015ftirmesi istenir. B\u00f6ylece ayn\u0131 ki\u015finin farkl\u0131 giri\u015f y\u00f6ntemleriyle birden fazla hesap olu\u015fturmas\u0131n\u0131n \u00f6n\u00fcne ge\u00e7ilmi\u015f olur. Yok e\u011fer kullan\u0131c\u0131 tamamen yeni ise o taktirde profil bilgileri g\u00f6zden ge\u00e7irilerek do\u011frudan yeni bir kullan\u0131c\u0131 kayd\u0131 olu\u015fturulur.<\/p>\n<p>Bu ak\u0131\u015f ayn\u0131 zamanda kurulu\u015flar\u0131n g\u00fcvenlik politikalar\u0131na uygun olarak ek do\u011frulama ad\u0131mlar\u0131 eklemesine de olanak tan\u0131maktad\u0131r. \u00d6rnek vermemiz gerekirse e\u011fer; ilk harici giri\u015fte iki fakt\u00f6rl\u00fc kimlik do\u011frulama veya e-posta do\u011frulamas\u0131 zorunlu k\u0131l\u0131nabilir.<\/p>\n<p>First broker login flow, bu ve bunlara benzer davran\u0131\u015flar\u0131 sergilememizi sa\u011flayarak \u00f6zellikle birden fazla ba\u011f\u0131ms\u0131z kimlik ve eri\u015fim y\u00f6netimi gerektiren federasyonel senaryolarda kullan\u0131c\u0131 deneyimini d\u00fczg\u00fcn bir \u015fekilde y\u00f6netmek, veri b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc korumak ve hesap ele ge\u00e7irme gibi g\u00fcvenlik risklerini minimize etmek i\u00e7in kritik \u00f6neme sahip bir mekanizmad\u0131r.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"First_Broker_Login_Flowun_Ic_Yapisi\"><\/span>First Broker Login Flow&#8217;un \u0130\u00e7 Yap\u0131s\u0131<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>First broker login flow&#8217;un i\u00e7 yap\u0131s\u0131ndaki ak\u0131\u015f mant\u0131\u011f\u0131 a\u015fa\u011f\u0131daki gibidir:<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;font-size:14px;white-space:pre;line-height:0.8;padding:12px;\">\nFirst Broker Login Flow<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 Review Profile<br \/>\n\u2502   \u2514\u2500\u2500 External IdP&#8217;den gelen kullan\u0131c\u0131 bilgilerinin g\u00f6zden ge\u00e7irilmesini sa\u011flar.<br \/>\n\u2502       (email, username, firstName, lastName)<br \/>\n\u2502       Eksik veya yanl\u0131\u015f bilgi varsa kullan\u0131c\u0131 d\u00fczeltir.<br \/>\n\u2502<br \/>\n\u251c\u2500\u2500 User creation or linking<br \/>\n\u2502   \u2502<br \/>\n\u2502   \u251c\u2500\u2500 Create User If Unique<br \/>\n\u2502   \u2502   \u2514\u2500\u2500 Keycloak&#8217;ta ayn\u0131 email veya username yoksa:<br \/>\n\u2502   \u2502       \u2192 Yeni bir Keycloak user olu\u015fturur.<br \/>\n\u2502   \u2502<br \/>\n\u2502   \u2514\u2500\u2500 Handle Existing Account<br \/>\n\u2502       \u2502<br \/>\n\u2502       \u251c\u2500\u2500 Confirm link existing account<br \/>\n\u2502       \u2502   \u2514\u2500\u2500 Ayn\u0131 email ile mevcut user varsa:<br \/>\n\u2502       \u2502       \u2192 Bu external identity mevcut hesaba ba\u011flans\u0131n m\u0131 diye sorar.<br \/>\n\u2502       \u2502<br \/>\n\u2502       \u2514\u2500\u2500 Account verification options<br \/>\n\u2502           \u2502<br \/>\n\u2502           \u251c\u2500\u2500 Verify existing account by Email<br \/>\n\u2502           \u2502   \u2514\u2500\u2500 Kullan\u0131c\u0131n\u0131n email adresine do\u011frulama maili g\u00f6nderir.<br \/>\n\u2502           \u2502       \u2192 Email sahibi ger\u00e7ekten bu kullan\u0131c\u0131 m\u0131 do\u011frulan\u0131r.<br \/>\n\u2502           \u2502<br \/>\n\u2502           \u2514\u2500\u2500 Verify Existing Account by Re-authentication<br \/>\n\u2502               \u2502<br \/>\n\u2502               \u2514\u2500\u2500 Username Password Form for identity provider reauthentication<br \/>\n\u2502                   \u2514\u2500\u2500 Kullan\u0131c\u0131dan mevcut Keycloak hesab\u0131n\u0131n:<br \/>\n\u2502                       \u2192 username<br \/>\n\u2502                       \u2192 password<br \/>\n\u2502                       girmesi istenir.<br \/>\n\u2502                       Ama\u00e7: Hesap ger\u00e7ekten bu kullan\u0131c\u0131ya m\u0131 ait do\u011frulamak.<br \/>\n\u2502<br \/>\n\u2514\u2500\u2500 First broker login &#8211; Conditional 2FA<br \/>\n    \u2502<br \/>\n    \u251c\u2500\u2500 Condition \u2013 user configured<br \/>\n    \u2502   \u2514\u2500\u2500 Kullan\u0131c\u0131n\u0131n 2FA yap\u0131land\u0131rmas\u0131 var m\u0131 kontrol eder.<br \/>\n    \u2502<br \/>\n    \u251c\u2500\u2500 Condition \u2013 credential<br \/>\n    \u2502   \u2514\u2500\u2500 Kullan\u0131c\u0131n\u0131n OTP \/ WebAuthn credential&#8217;\u0131 var m\u0131 kontrol eder.<br \/>\n    \u2502<br \/>\n    \u251c\u2500\u2500 OTP Form<br \/>\n    \u2502   \u2514\u2500\u2500 E\u011fer kullan\u0131c\u0131 OTP kullan\u0131yorsa:<br \/>\n    \u2502       \u2192 Google Authenticator vb. kod ister.<br \/>\n    \u2502<br \/>\n    \u251c\u2500\u2500 WebAuthn Authenticator<br \/>\n    \u2502   \u2514\u2500\u2500 E\u011fer kullan\u0131c\u0131 WebAuthn kullan\u0131yorsa:<br \/>\n    \u2502       \u2192 Security key \/ biometrik do\u011frulama ister.<br \/>\n    \u2502<br \/>\n    \u2514\u2500\u2500 Recovery Authentication Code Form<br \/>\n        \u2514\u2500\u2500 E\u011fer kullan\u0131c\u0131 recovery code kullan\u0131yorsa:<br \/>\n            \u2192 recovery code girmesini ister.\n<\/div>\n<p>Dikkat ederseniz, her ad\u0131m\u0131n kendine has bir mimari g\u00f6revi mevcuttur. Her ne kadar yukar\u0131daki \u015fema gerekli a\u00e7\u0131klamalar\u0131 veriyor olsa da bizler a\u015fa\u011f\u0131da t\u00fcm ad\u0131mlar\u0131 k\u0131saca izah edelim:<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>Review Profile<\/em><\/strong> : External identity bilgisini normalize etmektedir.<\/li>\n<li><strong><em>Create User If Unique<\/em><\/strong> : Yeni internal user olu\u015fturmaktad\u0131r.<\/li>\n<li><strong><em>Handle Existing Account<\/em><\/strong> : External identity&#8217;yi existing user&#8217;a ba\u011flamaktad\u0131r.<\/li>\n<li><strong><em>Verify existing account<\/em><\/strong> : Account takeover sald\u0131r\u0131s\u0131n\u0131 \u00f6nlemektedir.<\/li>\n<li><strong><em>Re-authentication<\/em><\/strong> : Ger\u00e7ek kullan\u0131c\u0131 do\u011frulamas\u0131 yapmaktad\u0131r.<\/li>\n<li><strong><em>Conditional 2FA<\/em><\/strong> : Ek g\u00fcvenlik katman\u0131 eklemektedir.<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"First_Broker_Login_Flowu_Kullanirken_Nelere_Dikkat_Edilmelidir\"><\/span>First Broker Login Flow&#8217;u Kullan\u0131rken Nelere Dikkat Edilmelidir?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>First broker login flow, <code>external identity<\/code> \u2192 <code>internal user mapping<\/code> s\u00fcreci s\u00f6z konusu oldu\u011fundan Keycloak&#8217;ta en \u00e7ok yanl\u0131\u015f yap\u0131land\u0131r\u0131lan ve en \u00e7ok g\u00fcvenlik a\u00e7\u0131\u011f\u0131 olu\u015fturabilen flow&#8217;lardan birisidir. Ki yanl\u0131\u015f yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131 taktirde, kullan\u0131c\u0131 hesaplar\u0131n\u0131n ele ge\u00e7irilmesi s\u00f6z konusu olabilir! Bu a\u00e7\u0131dan olay\u0131 de\u011ferlendirdi\u011fimizde bu ak\u0131\u015fa dair dikkat edilmesi gereken kritik noktalar\u0131 ele almakta fayda g\u00f6rmekteyim:<\/p>\n<ol style=\"font-size:14px;\">\n<li>\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>Account Takeover nedir?<\/em><\/strong><br \/>\nAccount takeover (ATO), bir sald\u0131rgan\u0131n bir kullan\u0131c\u0131 hesab\u0131na yetkisi olmad\u0131\u011f\u0131 halde eri\u015fim elde etmesi ve o kullan\u0131c\u0131 gibi hareket edebilmesidir. Yani sald\u0131rgan, ger\u00e7ek kullan\u0131c\u0131n\u0131n hesab\u0131n\u0131 ele ge\u00e7irir ve sistem a\u00e7\u0131s\u0131ndan art\u0131k &#8216;o ki\u015fi&#8217; olarak kabul edilir.<\/p>\n<p>\u00d6rne\u011fin; Keycloak&#8217;da <code>ali@gmail.com<\/code> email&#8217;ine sahip bir kullan\u0131c\u0131n\u0131n zaten var oldu\u011funu d\u00fc\u015f\u00fcnelim. E\u011fer sald\u0131rgan ayn\u0131 email adresiyle bir Google hesab\u0131 olu\u015fturur ve Keycloak, hi\u00e7bir ek do\u011frulama yapmadan bu Google hesab\u0131n\u0131 mevcut Keycloak hesab\u0131na otomatik olarak link ederse, sald\u0131rgan ger\u00e7ek kullan\u0131c\u0131n\u0131n \u015fifresini bilmeden o hesaba eri\u015febilmi\u015f olacakt\u0131r. \u0130\u015fte bu durum account takeover olarak adland\u0131r\u0131lmaktad\u0131r.<\/p>\n<p>Genel olarak account takeover \u015fu y\u00f6ntemlerle ger\u00e7ekle\u015ftirilir:<\/p>\n<ul style=\"font-size:12px;\">\n<li>\u00c7al\u0131nm\u0131\u015f \u015fifreleri kullan\u0131lmas\u0131 (data breach sonras\u0131)<\/li>\n<li>Phishing (sahte login sayfas\u0131yla \u015fifrenin \u00e7al\u0131nmas\u0131)<\/li>\n<li>Zay\u0131f ve tekrar kullan\u0131lan \u015fifreler<\/li>\n<li>Email adresinin ele ge\u00e7irilmesi yahut eri\u015fimin sa\u011flanmas\u0131<\/li>\n<li>Yanl\u0131\u015f yap\u0131land\u0131r\u0131lm\u0131\u015f authentication ve identity linking<\/li>\n<\/ul>\n<\/div>\n<p><strong><em>Account Takeover riskine dikkat edilmelidir!<\/em><\/strong><br \/>\nKeycloak&#8217;ta first broker login flow s\u0131ras\u0131nda &#8216;ba\u011flant\u0131&#8217; sa\u011flamak (ya da link etmek), Google gibi external bir Identity Provider&#8217;dan gelen kullan\u0131c\u0131 ile Keycloak&#8217;da zaten var olan bir kullan\u0131c\u0131 hesab\u0131n\u0131n ayn\u0131 ki\u015fiye ait olup olmad\u0131\u011f\u0131n\u0131n do\u011frulan\u0131p, ayn\u0131 ki\u015fi oldu\u011fu kan\u0131tland\u0131\u011f\u0131 taktirde bu iki kimli\u011fi birbirine ba\u011flama i\u015flemidir. Yani kullan\u0131c\u0131 daha \u00f6nce Keycloak&#8217;ta email ve \u015fifre ile olu\u015fturulmu\u015f bir hesaba sahipse ve sonradan Google ile login olmaya \u00e7al\u0131\u015f\u0131yorsa, Keycloak bu Google hesab\u0131n\u0131 otomatik olarak o mevcut hesaba ba\u011flamamaktad\u0131r! Bunun yerine kullan\u0131c\u0131dan email do\u011frulamas\u0131 yapmas\u0131n\u0131 veya mevcut hesab\u0131n\u0131n \u015fifresini girmesini isteyerek ger\u00e7ekten hesap sahibi oldu\u011funu kan\u0131tlamas\u0131n\u0131 istemektedir. Bu s\u00fcre\u00e7 neticesinde Google kimli\u011fi ile Keycloak&#8217;taki kullan\u0131c\u0131 hesab\u0131 aras\u0131nda kal\u0131c\u0131 bir ili\u015fki (federated identity mapping) olu\u015fturulmu\u015f olacakt\u0131r ve b\u00f6ylece, kullan\u0131c\u0131 bundan b\u00f6yle hem Google ile hem de normal Keycloak login bilgileriyle ayn\u0131 hesaba g\u00fcvenli \u015fekilde eri\u015febilme imkan\u0131 elde etmi\u015f olacakt\u0131r.<\/p>\n<p><em>Peki bunun account takeover ile alakas\u0131 nedir?<\/em> diye sorarsan\u0131z;<br \/>\nE\u011fer ki Keycloak, external identity provider&#8217;dan gelen bir kullan\u0131c\u0131y\u0131 s\u0131rf mail adresi ayn\u0131 diye hi\u00e7bir ek do\u011frulama yapmadan mevcut bir Keycloak hesab\u0131na otomatik olarak ba\u011flarsa, k\u00f6t\u00fc niyetli bir ki\u015fi kurban\u0131n email adresini kullanarak kendi harici hesab\u0131n\u0131 (\u00f6rne\u011fin Google) olu\u015fturup o email ile login olabilir ve Keycloak da bunu ger\u00e7ek kullan\u0131c\u0131 sanarak kurban\u0131n mevcut hesab\u0131na ba\u011flayabilir. Bu durumda sald\u0131rgan, kurban\u0131n Keycloak hesab\u0131na \u015fifre bilmeden eri\u015fmi\u015f ve hesab\u0131 ele ge\u00e7irmi\u015f olur. First broker login flow i\u00e7indeki <em>&#8216;Confirm Link Existing Account&#8217;<\/em>, <em>&#8216;Verify Existing Account by Email&#8217;<\/em> ve <em>&#8216;Re-authenticaiton&#8217;<\/em> gibi ad\u0131mlar\u0131n temel gayesi de tam olarak bu durumu engellemektir. Keycloak, external kimlik ile mevcut hesab\u0131 linklemeden \u00f6nce kullan\u0131c\u0131dan email do\u011frulamas\u0131 veya mevcut hesap \u015fifresini isteyerek external identity&#8217;yi ba\u011flamaya \u00e7al\u0131\u015fan ki\u015finin ger\u00e7ekten o hesab\u0131n sahibi olup olmad\u0131\u011f\u0131n\u0131 kan\u0131tlamas\u0131n\u0131 isteyerek bir g\u00fcvenlik \u00f6nlemi olu\u015fturur.\n<\/li>\n<li><strong><em>Email verified claim&#8217;ine k\u00f6r\u00fc k\u00f6r\u00fcne g\u00fcvenmemelidir!<\/em><\/strong><br \/>\nBaz\u0131 identity provider&#8217;lar kullan\u0131c\u0131 bilgilerini g\u00f6nderirken email adresinin do\u011frulanm\u0131\u015f oldu\u011funu ifade eden <code>email_verified = true<\/code> claim&#8217;ini de g\u00f6nderirler. Evet, o email adresi do\u011frulanm\u0131\u015f olabilir ancak bizler k\u00f6r\u00fc k\u00f6r\u00fcne bu bilgiye g\u00fcvenmemeliyiz. \u00c7\u00fcnk\u00fc bu de\u011fer yanl\u0131\u015f, eksik veya k\u00f6t\u00fc niyetli olacak \u015fekilde aktif olarak i\u015faretlenmi\u015f olabilir ve esas\u0131nda email adresinin ger\u00e7ek sahibi olmayan ki\u015fi, do\u011frulanm\u0131\u015f gibi kabul edilerek kullan\u0131c\u0131 hesab\u0131na eri\u015febilir ve b\u00f6ylece account takeover riski s\u00f6z konusu olabilir. Bu nedenle en g\u00fcvenli yakla\u015f\u0131m, external provider&#8217;\u0131n g\u00f6nderdi\u011fi <code>email_verified<\/code> bilgisine tamamen g\u00fcvenmek yerine, Keycloak&#8217;un kendi <em>&#8216;Verify Email&#8217;<\/em> mekanizmas\u0131n\u0131n kullan\u0131lmas\u0131d\u0131r.\n<\/li>\n<li><strong><em>&#8220;Automatically link existing accounts&#8221; ayar\u0131na dikkat edilmelidir!<\/em><\/strong><br \/>\nKeycloak&#8217;ta identity provider yap\u0131land\u0131rmas\u0131nda bulunan <em>&#8216;Automatically link existing accounts&#8217;<\/em> veya benzer \u015fekilde \u00e7al\u0131\u015fan <em>&#8216;Trust Email&#8217;<\/em> ayarlar\u0131 aktif edilirse, external identity provider&#8217;dan gelen kullan\u0131c\u0131n\u0131n email adresi, Keycloak&#8217;ta zaten var olan bir kullan\u0131c\u0131yla e\u015fle\u015fti\u011fi anda Keycloak bu iki hesab\u0131 hi\u00e7bir ek do\u011frulama yapmadan otomatik olarak birbirine ba\u011flama davran\u0131\u015f\u0131 sergileyerek istemeden ciddi bir g\u00fcvenlik riski durumu yarat\u0131labilir. \u00c7\u00fcnk\u00fc, sald\u0131rgan kurban\u0131n email adresini kullanarak kendi external hesab\u0131n\u0131 olu\u015fturup sisteme giri\u015f yaparsa, Keycloak bunu ger\u00e7ek kullan\u0131c\u0131 sanarak mevcut hesaba otomatik olarak ba\u011flayabilir ve b\u00f6ylece sald\u0131rgan o hesab\u0131 ele ge\u00e7irebilir. Yani yukar\u0131daki sat\u0131rlarda bass bass vurgulad\u0131\u011f\u0131m\u0131z account takeover durumu bu ayarlar neticesinde yine cereyan edebilir. Bu riski \u00f6nlemek i\u00e7in otomatik ba\u011flama yerine first broker login flow i\u00e7inde yer alan <em>&#8216;Confirm Link Existing Account&#8217; gibi ad\u0131mlar aktif tutulmal\u0131 ve b\u00f6ylece external hesab\u0131 mevcut hesaba ba\u011flamadan \u00f6nce kullan\u0131c\u0131dan \u015fifresini girmesi veya emailini do\u011frulamas\u0131 istenmelidir.<\/em>\n<\/li>\n<li><strong><em>&#8220;Create User If Unique&#8221; execution&#8217;\u0131 kritiktir! Dikkat edilmeli!<\/em><\/strong><br \/>\nKeycloak&#8217;taki <em>&#8216;Create User If Unique&#8217;<\/em> execution&#8217;\u0131, external identity provider&#8217;dan gelen kullan\u0131c\u0131 bilgilerine bakarak Keycloak&#8217;ta ayn\u0131 email veya username&#8217;e sahip bir kullan\u0131c\u0131 olup olmad\u0131\u011f\u0131n\u0131 kontrol etmekte ve e\u011fer b\u00f6yle bir kullan\u0131c\u0131 yoksa otomatik olarak yeni bir kullan\u0131c\u0131 olu\u015fturmaktad\u0131r.<\/p>\n<p>Ancak burada dikkat edilmesi gereken \u00f6nemli bir husus vard\u0131r, o da, identity provider&#8217;dan gelen username bilgisinin her daim g\u00fcvenilir veya benzersiz olmayabilece\u011fidir. \u00c7\u00fcnk\u00fc kimi provider&#8217;lar username g\u00f6ndermezken, kimileri ise \u00e7ak\u0131\u015fabilecek de\u011ferler g\u00f6nderebilir&#8230; Ee bu da yanl\u0131\u015f kullan\u0131c\u0131 olu\u015fturulmas\u0131na veya \u00e7ak\u0131\u015fmalara neden olabilir. Bu riski \u00f6nlemek i\u00e7in identity provider mapper yap\u0131land\u0131rmas\u0131nda username alan\u0131n\u0131n email veya email prefix gibi sistemde benzersiz olacak bir de\u011ferden t\u00fcretilmesi \u00f6nerilmektedir. B\u00f6ylece her external kullan\u0131c\u0131 Keycloak i\u00e7inde do\u011fru ve benzersiz bir kullan\u0131c\u0131 olarak olu\u015fturulur ve kimlik e\u015fle\u015ftirme s\u00fcreci g\u00fcvenli ve tutarl\u0131 bir \u015fekilde ger\u00e7ekle\u015ftirilmi\u015f olur.\n<\/li>\n<li><strong><em>Username&#8217;in bo\u015f gelmesi durumuna dikkat edilmelidir!<\/em><\/strong><br \/>\nBaz\u0131 identity provider&#8217;lar (\u00f6zellikle Google) kullan\u0131c\u0131ya ait email bilgisini g\u00f6nderirken ayr\u0131 bir username alan\u0131 g\u00f6ndermeyebilir ve bu durumda Keycloak yeni kullan\u0131c\u0131 olu\u015ftururken kullanaca\u011f\u0131 username de\u011ferini otomatik olarak belirleyemez! E\u011fer b\u00f6yle bir senaryoda first broker login flow i\u00e7erisindeki <em>&#8216;Review Profile&#8217;<\/em> execution&#8217;\u0131 aktif de\u011filse, Keycloak eksik bilgi nedeniyle hatal\u0131 kullan\u0131c\u0131 olu\u015fturabilir veya beklenmedik bir username atayarak ileride kimlik e\u015fle\u015ftirme ve kullan\u0131c\u0131 y\u00f6netimi a\u00e7\u0131s\u0131ndan kimi sorunlara temel atabilir. Bu nedenle <em>&#8216;Review Profile&#8217;<\/em> ad\u0131m\u0131 aktif tutuldu\u011funda Keycloak, external provider&#8217;dan gelen bilgileri kullan\u0131c\u0131ya g\u00f6sterir ve eksik olan username alan\u0131n\u0131n kullan\u0131c\u0131 taraf\u0131ndan doldurulmas\u0131n\u0131 sa\u011flar. B\u00f6ylece olu\u015fturlan kullan\u0131c\u0131 kayd\u0131 do\u011fru, tutarl\u0131 ve sistemle uyumlu bir hale gelmi\u015f olacakt\u0131r.\n<\/li>\n<li><strong><em>Duplicate user creation riskine dikkat edilmelidir!<\/em><\/strong><br \/>\nKeycloak&#8217;ta identity provider entegrasyonu s\u0131ras\u0131nda mapper yap\u0131land\u0131rmas\u0131 yanl\u0131\u015f yap\u0131l\u0131rsa, ayn\u0131 email adresine sahip external kullan\u0131c\u0131y\u0131 her login oldu\u011funda mevcut kullan\u0131c\u0131yla e\u015fle\u015ftirmek yerine yeni bir kullan\u0131c\u0131 olarak olu\u015fturabilir ve bu durum sistemde ayn\u0131 email adresine sahip birden fazla kullan\u0131c\u0131 kayd\u0131n\u0131n olu\u015fmas\u0131na, yani duplicate user problemine yol a\u00e7abilir. Bu hem g\u00fcvenlik hem de kimlik y\u00f6netimi a\u00e7\u0131s\u0131ndan ciddi sorunlar do\u011furabilir \u00e7\u00fcnk\u00fc ayn\u0131 ki\u015fiye ait birden fazla hesap demek, do\u011fru kimlik e\u015fle\u015ftirmesi yap\u0131lamayacak demektir. Bu riski \u00f6nlemek i\u00e7in realm ayarlar\u0131ndan <em>&#8216;Email unique&#8217;<\/em> se\u00e7ene\u011fi aktif hale getirilerek, Keycloak&#8217;da ayn\u0131 email adresiyle birden fazla kullan\u0131c\u0131n\u0131n olu\u015fturulmas\u0131 engellenebilir ve kimlik b\u00fct\u00fcnl\u00fc\u011f\u00fc korunabilir.\n<\/li>\n<li><strong><em>Domain restriction kullan\u0131lmas\u0131 \u00f6nerilmektedir!<\/em><\/strong><br \/>\nEnterprise sistemlerde genellikle sadece belirli bir kuruma ait kullan\u0131c\u0131lar\u0131n giri\u015f yapmas\u0131na izin verilmesi gerekmekte ve bu nedenle external identity provider&#8217;dan gelen kullan\u0131c\u0131lar\u0131n email adreslerinin belirli bir domain&#8217;e ait olup olmad\u0131\u011f\u0131 kontrol edilmesi gerekmektedir.<\/p>\n<p>Bu kontrol yap\u0131lmad\u0131\u011f\u0131 taktirde herhangi bir ki\u015fi kendi ki\u015fisel email adresiyle external provider \u00fczerinden login olabilir ve sistemde yetkisiz eri\u015fim elde edebilir. Haliyle bu durum ciddi bir g\u00fcvenlik a\u00e7\u0131\u011f\u0131 olu\u015fturacakt\u0131r. Bu riski \u00f6nlemek i\u00e7in first broker login flow i\u00e7ine eklenecek bir kontrol mekanizmas\u0131 veya custom authenticator ile kullan\u0131c\u0131n\u0131n email adresinin izin verilen domain ile bitip bitmedi\u011fi do\u011frulanmal\u0131 ve sadece belirlenen domain&#8217;e ait kullan\u0131c\u0131lar\u0131n sisteme giri\u015f yapmas\u0131na izin verilerek sistemin yaln\u0131zca yetkili organizasyon kullan\u0131c\u0131lar\u0131na a\u00e7\u0131k olmas\u0131 sa\u011flanmal\u0131d\u0131r.\n<\/li>\n<li><strong><em>Identity Provider spoofing riskine dikkat edilmelidir!<\/em><\/strong><br \/>\nBir sistemde birden fazla identity provider tan\u0131ml\u0131ysa e\u011fer ayn\u0131 emailin farkl\u0131 provider&#8217;lar \u00fczerinden gelebilme ihtimali s\u00f6z konusudur. Ancak bu email adresi ayn\u0131 olsa dahi bu kimliklerin ger\u00e7ekte ayn\u0131 ki\u015fiye ait oldu\u011funun ise ilk etapta bir garantisi olmayacakt\u0131r. Keycloak, bu iki kimli\u011fi sadece email adresleri ayn\u0131 diye otomatik olarak ayn\u0131 kullan\u0131c\u0131 hesab\u0131na ba\u011flarsa, yine burada account takeover zaafiyeti s\u00f6z konusu olabilir. Bu nedenle, first broker login flow i\u00e7indeki <em>&#8216;Configrm Link Existing Account&#8217;<\/em> ad\u0131m\u0131 olduk\u00e7a kritik \u00f6neme sahiptir. \u00c7\u00fcnk\u00fc Keycloak, external identity&#8217;yi mevcut hesaba ba\u011flamadan \u00f6nce kullan\u0131c\u0131dan ek do\u011frulama yapmas\u0131n\u0131 isteyecek ve b\u00f6ylece farkl\u0131 identity provider&#8217;lardan gelen kimliklerin ger\u00e7ekten ayn\u0131 kullan\u0131c\u0131ya ait olup olmad\u0131\u011f\u0131 g\u00fcvenli \u015fekilde do\u011frulam\u0131\u015f olacakt\u0131r.\n<\/li>\n<li><strong><em>Mapper&#8217;lar\u0131n do\u011fru yap\u0131land\u0131r\u0131lmas\u0131 kritik arz etmektedir!<\/em><\/strong><br \/>\nKeycloak&#8217;ta identity provider entegrasyonu s\u0131ras\u0131nda mapper&#8217;lar, external provider&#8217;dan gelen kullan\u0131c\u0131 bilgilerinin Keycloak i\u00e7indeki kullan\u0131c\u0131 alanlar\u0131na nas\u0131l aktar\u0131laca\u011f\u0131n\u0131 belirlemektedir. Bu yap\u0131land\u0131rman\u0131n do\u011fru yap\u0131lmas\u0131 kritik \u00f6neme sahiptir \u00e7\u00fcnk\u00fc email, username, firstName, lastName ve emailVerified gibi alanlar do\u011fru \u015fekilde e\u015fle\u015ftirilmezse Keycloak kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011fru \u015fekilde tan\u0131mlayamaz, bu da her login&#8217;de yeni kullan\u0131c\u0131 olu\u015fturulmas\u0131na, mevcut kullan\u0131c\u0131yla e\u015fle\u015ftirme yap\u0131lamamas\u0131na veya g\u00fcvenlik do\u011frulamalar\u0131n\u0131n hatal\u0131 \u00e7al\u0131\u015fmas\u0131na neden olabilir.<\/p>\n<p>\u00d6zellikle email alan\u0131 en kritik aland\u0131r, \u00e7\u00fcnk\u00fc Keycloak \u00e7o\u011fu durumda kullan\u0131c\u0131 e\u015fle\u015ftirmesini email \u00fczerinden yapar ve email yanl\u0131\u015f map edilirse ayn\u0131 kullan\u0131c\u0131 i\u00e7in birden fazla hesap olu\u015fabilir veya yanl\u0131\u015f kullan\u0131c\u0131ya eri\u015fim sa\u011flanabilir, bu nedenle identity provider mapper&#8217;lar\u0131n\u0131n dikkatli ve do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131, hem kimlik b\u00fct\u00fcnl\u00fc\u011f\u00fcn\u00fc hem de g\u00fcvenli\u011fi sa\u011flamak a\u00e7\u0131s\u0131ndan elzemdir!\n<\/li>\n<li><strong><em>Test ve prod ortamlar\u0131n\u0131n flow&#8217;lar\u0131n\u0131n farkl\u0131 olmas\u0131na \u00f6zen g\u00f6sterilmelidir!<\/em><\/strong><br \/>\nTest ortamlar\u0131nda genellikle geli\u015ftirme ve entegrasyon s\u00fcre\u00e7lerini h\u0131zland\u0131rmak amac\u0131yla external identity provider&#8217;dan gelen kullan\u0131c\u0131lar\u0131n otomatik olarak sisteme dahil edilmesine izin verilir. Bu nedenle first broker login flow i\u00e7inde <em>&#8216;Create User If Unique&#8217;<\/em> gibi ad\u0131mlar aktif tutularak yeni kullan\u0131c\u0131lar\u0131n herhangi bir ek onaya gerek kalmadan otomatik olarak olu\u015fturulmas\u0131 test s\u00fcre\u00e7lerinde m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>Ancak production ortam\u0131nda ayn\u0131 yakla\u015f\u0131m ciddi g\u00fcvenlik riskleri do\u011furabilece\u011finden, her external kullan\u0131c\u0131n\u0131n otomatik olarak sisteme eri\u015fim kazanmas\u0131 yerine, yaln\u0131zca belirli bir domain&#8217;e ait kullan\u0131c\u0131lar\u0131n kabul edilmesi veya yeni kullan\u0131c\u0131lar\u0131n admin onay\u0131ndan ge\u00e7tikten sonra aktif edilmesi gibi daha k\u0131s\u0131tlay\u0131c\u0131 ve kontroll\u00fc mekanizmalar\u0131n uygulanmas\u0131 daha uygundur. B\u00f6ylece sistem yaln\u0131zca yetkili ve do\u011frulanm\u0131\u015f kullan\u0131c\u0131lar\u0131n eri\u015fimine a\u00e7\u0131k tutulur ve yetkisiz ki\u015filerin sisteme dahil olmas\u0131 da engellenmi\u015f olur.\n<\/li>\n<\/ol>\n<h4><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><\/h4>\n<p>\u015eimdi \u00e7o\u011fu kritik incelemelerde yapt\u0131\u011f\u0131m\u0131z gibi bu i\u00e7eri\u011fimizde de first broker login flow&#8217;a dair akla gelen gelmeyen t\u00fcm sorular\u0131 kendimizce sorup cevapland\u0131ral\u0131m ve b\u00f6ylece konuya dair olabilecek t\u00fcm k\u0131r\u0131nt\u0131lar\u0131 toparlayal\u0131m&#8230;<\/p>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 1 | <span style=\"color:#877572;\">First Broker Login Flow tam olarak ne zaman tetiklenir?<\/span><\/summary>\n<p>Sadece \u015fu iki ko\u015ful ayn\u0131 anda sa\u011flan\u0131rsa tetiklenir:<\/p>\n<ol>\n<li>Kullan\u0131c\u0131 Google, Azure AD yahut ba\u015fka bir Keycloak vs. gibi external identity provider ile login oluyorsa<\/li>\n<li>Keycloak&#8217;ta bu external identity ile e\u015fle\u015fmi\u015f bir user hen\u00fcz yoksa<\/li>\n<\/ol>\n<p>Unutmay\u0131n! E\u011fer kullan\u0131c\u0131 daha \u00f6nceden link edilmi\u015fse (yani mevcut bir kullan\u0131c\u0131yla ba\u011flant\u0131lanm\u0131\u015fsa) bu flow \u00e7al\u0131\u015fmayacakt\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 2 | <span style=\"color:#877572;\">First Broker Login Flow&#8217;un temel amac\u0131 nedir?<\/span><\/summary>\n<p>External identity ile Keycloak&#8217;da ki internal user aras\u0131nda mapping olu\u015fturmakt\u0131r.<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:350px;font-size:12px;\">\nExternal identity:<br \/>\nGoogle \u2192 sub=123456<\/p>\n<p>Internal identity:<br \/>\nKeycloak \u2192 userId=abcd-xyz<\/p>\n<p>Mapping olu\u015fturulur:<br \/>\nGoogle(sub=123456) \u2194 Keycloak(userId=abcd-xyz)\n<\/p><\/div>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 3 | <span style=\"color:#877572;\">Bu flow her login s\u00fcrecinde \u00e7al\u0131\u015f\u0131r m\u0131?<\/span><\/summary>\n<p>Hay\u0131r! Yaln\u0131zca ilk login&#8217;de \u00e7al\u0131\u015facakt\u0131r. Sonraki login&#8217;lerde ise <strong><em>Post Broker Login Flow<\/em><\/strong> \u00e7al\u0131\u015facakt\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 4 | <span style=\"color:#877572;\">Keycloak external user&#8217;\u0131 nas\u0131l tan\u0131r?<\/span><\/summary>\n<p>Keycloak \u015fu bilgiyi kullan\u0131r:<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:360px;font-size:12px;\">\nidentity_provider + external_user_id (genelde sub claim)\n<\/div>\n<p>Misal olarak: <\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:300px;font-size:12px;\">\nidentity_provider = google<br \/>\nexternal_user_id = 123456789\n<\/div>\n<p>Bu verileri Keycloak internal tabloda \u015fu formatta saklar:<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:300px;font-size:12px;\">\nFEDERATED_IDENTITY<\/p>\n<p>user_id<br \/>\nidentity_provider<br \/>\nexternal_user_id\n<\/p><\/div>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 5 | <span style=\"color:#877572;\">&#8220;Create User If Unique&#8221; execution ne yapar?<\/span><\/summary>\n<p>External identity&#8217;den gelen email veya username bilgileri benzersiz mi kontrol eder. E\u011fer benzersizse yeni bir user olu\u015fturur, yok de\u011filse &#8220;Handle Existing Account&#8221; execution&#8217;\u0131 devreye girer ve bu external kimli\u011fin mevcut hesaba g\u00fcvenli \u015fekilde ba\u011flanmas\u0131n\u0131 y\u00f6netir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 6 | <span style=\"color:#877572;\">Confirm Link Existing Account neden kritiktir?<\/span><\/summary>\n<p>Account takeover sald\u0131r\u0131s\u0131n\u0131 \u00f6nledi\u011fi i\u00e7in kritiktir!<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 7 | <span style=\"color:#877572;\">&#8220;Verify Email&#8221; execution neden \u00f6nemlidir?<\/span><\/summary>\n<p>External IdP&#8217;dan gelen email her daim g\u00fcvenilir olmayabilir, ki baz\u0131 IdP&#8217;ler <code>email_verified = true<\/code> claim&#8217;ini yanl\u0131\u015f g\u00f6nderebilmektedirler. &#8220;Verify Email&#8221; execution email do\u011frulamas\u0131n\u0131 sa\u011flayarak g\u00fcvence sa\u011flamaktad\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 8 | <span style=\"color:#877572;\">First Broker Login Flow&#8217;da user creation&#8217;\u0131 engelleyebilir miyiz?<\/span><\/summary>\n<p>Evet, external identity geldi\u011fi taktirde yeni bir kullan\u0131c\u0131 olu\u015fturulmas\u0131n\u0131 istersek engelleyebiliriz. Bunun i\u00e7in &#8220;Create User If Unique&#8221; exeecution&#8217;\u0131n\u0131n kald\u0131r\u0131lmas\u0131 yahut DISABLED edilmesi yeterli olacakt\u0131r. B\u00f6ylece yeni bir user olu\u015fturulmayacak yaln\u0131zca mevcut user&#8217;lar login olabilecektir, ki bu davran\u0131\u015f enterprise sistemlerde olduk\u00e7a yayg\u0131nd\u0131r.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 9 | <span style=\"color:#877572;\">External identity ile existing user nas\u0131l e\u015fle\u015ftirilir?<\/span><\/summary>\n<p>External identity ile existing user aras\u0131ndaki e\u015fle\u015ftirme Keycloak&#8217;da \u015fu s\u0131rayla cereyan etmektedir:<\/p>\n<ol>\n<li>Federated identity mapping<\/li>\n<li>email match<\/li>\n<li>username match<\/li>\n<\/ol>\n<p>E\u011fer match s\u00f6z konusuysa &#8220;Handle Existing Account&#8221; execution devreye girecek ve gerekli external identity ile mevcut user aras\u0131nda ba\u011flant\u0131 sa\u011flanacakt\u0131r.<\/p>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 10 | <span style=\"color:#877572;\">First Broker Login Flow ile Post Broker Login Flow fark\u0131 nedir?<\/span><\/summary>\n<table style=\"width:100%;border-collapse:collapse;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Helvetica,Arial,sans-serif;background:#181818;color:#eaeaea;border-radius:8px;overflow:hidden;border:1px solid #2a2a2a;\">\n<thead>\n<tr>\n<th style=\"padding:12px 18px;text-align:left;background:#202020;font-size:15px;font-weight:600;border-bottom:1px solid #2a2a2a;color:#ffffff;\">First Broker Login Flow<\/th>\n<th style=\"padding:12px 18px;text-align:left;background:#202020;font-size:15px;font-weight:600;border-bottom:1px solid #2a2a2a;color:#ffffff;\">Post Broker Login Flow<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr style=\"background:#181818;\">\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">ilk login&#8217;de \u00e7al\u0131\u015f\u0131r<\/td>\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">sonraki loginlerde \u00e7al\u0131\u015f\u0131r<\/td>\n<\/tr>\n<tr style=\"background:#1c1c1c;\">\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">user creation yap\u0131labilir<\/td>\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">yap\u0131lmaz<\/td>\n<\/tr>\n<tr style=\"background:#181818;\">\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">account linking yap\u0131l\u0131r<\/td>\n<td style=\"padding:10px 18px;border-bottom:1px solid #242424;color:#d6d6d6;\">yap\u0131lmaz<\/td>\n<\/tr>\n<tr style=\"background:#1c1c1c;\">\n<td style=\"padding:10px 18px;color:#d6d6d6;\">mapping olu\u015fturulur<\/td>\n<td style=\"padding:10px 18px;color:#d6d6d6;\">mapping zaten vard\u0131r<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 11 | <span style=\"color:#877572;\">First Broker Login Flow security boundary(g\u00fcvenlik s\u0131n\u0131r\u0131) midir?<\/span><\/summary>\n<p>Evet, ne de olsa bu flow external identity&#8217;nin internal identity olarak aktar\u0131lmas\u0131n\u0131 sa\u011flamaktad\u0131r. Yani bir ge\u00e7i\u015f noktas\u0131d\u0131r. Dolay\u0131s\u0131yla en kritik g\u00fcvenlik s\u0131n\u0131rlar\u0131ndan birisidir.<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 12 | <span style=\"color:#877572;\">Bu flow olmadan Identity Federation \u00e7al\u0131\u015f\u0131r m\u0131?<\/span><\/summary>\n<p>Identity federation demek, external identity ile internal user&#8217;\u0131 e\u015fle\u015ftirmek demektir. Dolay\u0131s\u0131yla bu e\u015fle\u015ftirme yap\u0131lmad\u0131\u011f\u0131 s\u00fcrece login tamamlanmayacakt\u0131r. First broker login flow, bu e\u015fle\u015ftirmenin ilk kez olu\u015fturuldu\u011fu yerdir. Haliyle bu flow olmaks\u0131z\u0131n identity federation \u00e7al\u0131\u015fmayacakt\u0131r!<br \/>\n<\/details>\n<details style=\"font-size:14px;\">\n<summary style=\"color:#BA8073;\">Soru 13 | <span style=\"color:#877572;\">External identity mapping silinirse ne olur?<\/span><\/summary>\n<p>Kullan\u0131c\u0131 external IdP ile login oldu\u011funda first broker login flow tekrar \u00e7al\u0131\u015facakt\u0131r.<br \/>\n<\/details>\n<h4><span class=\"ez-toc-section\" id=\"Keycloakda_First_Broker_Login_Flow_Yapilandirmasini_Inceleyelim\"><\/span>Keycloak&#8217;da First Broker Login Flow Yap\u0131land\u0131rmas\u0131n\u0131 \u0130nceleyelim<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u015eimdi Keycloak&#8217;da first broker login flow yap\u0131land\u0131rmas\u0131n\u0131 incelemeye ge\u00e7ebiliriz. Tabi bunun i\u00e7in \u00f6ncelikle yap\u0131lmas\u0131 gereken esas\u0131nda en az bir tane olacak \u015fekilde external identity provider ayarlamakt\u0131r. Mesela bizler bu i\u00e7eri\u011fimizde yaln\u0131zca Google \u00fczerinden \u00f6rneklendirmede bulunuyor olsak da sizler GitHub, Azure AD vs.&#8217;ide s\u00fcrece dahil edebilir ve \u00e7al\u0131\u015fman\u0131z\u0131 daha da zenginle\u015ftirebilirsiniz.<\/p>\n<h5><span class=\"ez-toc-section\" id=\"1_External_Identity_Providerin_Yapilandirilmasi_Google\"><\/span>1. External Identity Provider&#8217;\u0131n Yap\u0131land\u0131r\u0131lmas\u0131 (Google)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>\u0130lk olarak external identity provider&#8217;\u0131m\u0131z olan Google&#8217;\u0131 <em><a href=\"https:\/\/console.cloud.google.com\/\" target=\"_blank\">Google Cloud Console<\/a><\/em> \u00fczerinden yap\u0131land\u0131rmaya ba\u015flayal\u0131m.<\/p>\n<ul style=\"font-size:14px;\">\n<li><em style=\"color:green;\"><u>1 Ad\u0131m<\/u> <span style=\"color:gray;\">(Yeni Proje Olu\u015fturma)<\/span><\/em><br \/>\nYapaca\u011f\u0131m\u0131z \u00e7al\u0131\u015fmayla ilgili yeni bir proje olu\u015ftural\u0131m. Tabi iste\u011finiz do\u011frultusunda mevcut olan projelerden birini de tercih edebilirsiniz.\n<\/li>\n<li><em style=\"color:green;\"><u>2 Ad\u0131m<\/u> <span style=\"color:gray;\">(OAuth Consent Screen&#8217;i Ayarlama)<\/span><\/em><br \/>\n<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"252\" height=\"189\" class=\"alignleft size-full wp-image-28500\" \/><\/a>Google&#8217;\u0131n kullan\u0131c\u0131ya g\u00f6sterece\u011fi onay ekran\u0131n\u0131 yap\u0131land\u0131ral\u0131m. Bunun i\u00e7in Google Console&#8217;da yandaki g\u00f6rselde oldu\u011fu gibi <em>OAuth Consent Screen<\/em>&#8216;i aray\u0131p bulal\u0131m ve a\u00e7\u0131lan sayfada istenilen alanlar\u0131 uygun \u015fekilde doldurup ve audience k\u0131sm\u0131n\u0131 da external olacak \u015fekilde ayarlay\u0131p yap\u0131land\u0131rmay\u0131 sa\u011flayal\u0131m.<\/p>\n<p>Tabi burada yap\u0131lan i\u015flemlerin login ak\u0131\u015f\u0131n\u0131n teknik k\u0131sm\u0131yla ilgili olmad\u0131\u011f\u0131n\u0131, yaln\u0131zca client olu\u015fturmam\u0131z\u0131 sa\u011flayacak olan bir zemin haz\u0131rlad\u0131\u011f\u0131n\u0131 s\u00f6ylemekte fayda g\u00f6rmekteyim&#8230;\n<\/li>\n<li><em style=\"color:green;\"><u>3 Ad\u0131m<\/u> <span style=\"color:gray;\">(OAuth Client Olu\u015fturma)<\/span><\/em><br \/>\n\u015eimdi ise Keycloak&#8217;da yapt\u0131\u011f\u0131m\u0131z gibi Google&#8217;da da uygulamam\u0131za kar\u015f\u0131l\u0131k gelecek bir client olu\u015fturmam\u0131z gerekmektedir. Ki <em>Client ID<\/em> ve <em>Client Secret<\/em> de\u011ferlerini elde edebilelim.<\/p>\n<p>Bunun i\u00e7in olu\u015fturdu\u011fumuz (ya da mevcut olan) projenin ana sayfas\u0131ndan <em>&#8216;Create OAuth client&#8217;<\/em> butonuna t\u0131klayal\u0131m ve a\u00e7\u0131lan sayfay\u0131 a\u015fa\u011f\u0131daki g\u00f6rselde oldu\u011fu gibi doldural\u0131m:<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-1.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"482\" height=\"693\" class=\"aligncenter size-full wp-image-28501\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-1.png 482w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-1-209x300.png 209w\" sizes=\"auto, (max-width: 482px) 100vw, 482px\" \/><\/a>Client&#8217;\u0131 olu\u015fturduktan sonra sistem bizlere Client ID ve Client Secret de\u011ferlerini verecektir. Bu de\u011ferleri <em>Clients<\/em> men\u00fcs\u00fcnden ilgili client detaylar\u0131na gelerek g\u00f6rebilirsiniz&#8230;\n<\/li>\n<\/ul>\n<h5><span class=\"ez-toc-section\" id=\"2_Internal_Identity_Providerin_Yapilandirilmasi_Keycloak\"><\/span>2. Internal Identity Provider&#8217;\u0131n Yap\u0131land\u0131r\u0131lmas\u0131 (Keycloak)<span class=\"ez-toc-section-end\"><\/span><\/h5>\n<p>Evet&#8230; \u015eimdi de olu\u015fturdu\u011fumuz bu Google client&#8217;\u0131, <em>Client ID<\/em> ile <em>Client Secret<\/em> de\u011ferleri \u00fczerinden Keycloak&#8217;la ili\u015fkilendirecek konfig\u00fcrasyonu ger\u00e7ekle\u015ftirelim ve b\u00f6ylece Google login yap\u0131land\u0131rmas\u0131n\u0131 tamamlayal\u0131m. Tabi bunun i\u00e7in Keycloak Dashboard&#8217;da <code>Identity providers<\/code> sayfas\u0131 \u00fczerinden Google provider&#8217;\u0131na gelinmesi gerekmektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"1834\" height=\"709\" class=\"aligncenter size-full wp-image-28503\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2.png 1834w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2-300x116.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2-1024x396.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2-768x297.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-2-1536x594.png 1536w\" sizes=\"auto, (max-width: 1834px) 100vw, 1834px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-3.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"1030\" height=\"656\" class=\"aligncenter size-full wp-image-28504\" \/><\/a>Buradaki yap\u0131land\u0131rma ayarlar\u0131na g\u00f6z atarsak e\u011fer;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>Redirect URI<\/em><\/strong> : Google login i\u015fleminden sonra kullan\u0131c\u0131y\u0131 geri g\u00f6nderece\u011fi adrestir. Bu adresin, bir \u00f6nceki external identity provider yap\u0131land\u0131rmas\u0131 s\u00fcrecindeki 3. ad\u0131mda <em>Authorized redirect URIs<\/em> k\u0131sm\u0131nda kullan\u0131ld\u0131\u011f\u0131n\u0131 hat\u0131rlat\u0131r\u0131m&#8230;<\/li>\n<li><strong><em>Alias<\/em><\/strong> : Bu provider&#8217;\u0131n sistem i\u00e7indeki teknik ad\u0131d\u0131r. Google login butonuna verilen adreste URL&#8217;de <code>\/broker\/google\/login<\/code> \u015feklinde g\u00f6r\u00fclmektedir.<\/li>\n<li><strong><em>Display Name<\/em><\/strong> : Login ekran\u0131nda kullan\u0131c\u0131ya g\u00f6z\u00fckecek isimdir. Bo\u015f kald\u0131\u011f\u0131 taktirde alias kullan\u0131lacakt\u0131r.<\/li>\n<li><strong><em>Display Order<\/em><\/strong> : Birden fazla provider&#8217;\u0131n oldu\u011fu senaryolarda login ekran\u0131nda hangi s\u0131rada g\u00f6z\u00fckece\u011fini belirler. S\u0131ralama say\u0131lar\u0131n b\u00fcy\u00fckl\u00fc\u011f\u00fcyle ters orant\u0131l\u0131d\u0131r.<\/li>\n<li><strong><em>Prompt<\/em><\/strong> : Google taraf\u0131nda login ekran\u0131n\u0131n hangi davran\u0131\u015fla y\u00f6nlendirme yap\u0131laca\u011f\u0131n\u0131 s\u00f6yler. Misal olarak;\n<ul>\n<li><code>E\u011fer bo\u015f b\u0131rak\u0131rsan<\/code> : Kullan\u0131c\u0131 zaten Google&#8217;a login ise direkt devam edecektir, yok e\u011fer login de\u011filse login ekran\u0131n\u0131 g\u00f6sterecektir. Ayr\u0131ca daha \u00f6nce izin verilmi\u015fse tekrar sormayacakt\u0131r. Bu en normal ve \u00f6nerilen ayard\u0131r!<\/li>\n<li><code>login<\/code> : Google&#8217;da kullan\u0131c\u0131 login olmu\u015f olsa bile tekrar \u015fifre soracakt\u0131r. Bir nevi <em>force login<\/em>&#8216;dir.<\/li>\n<li><code>consent<\/code> : Kullan\u0131c\u0131 daha \u00f6nce izin vermi\u015f olsa bile izin ekran\u0131n\u0131 tekrar g\u00f6sterir. Yani her giri\u015fte onay ister!<\/li>\n<li><code>none<\/code> : Bu ayar ise en kritik olan\u0131d\u0131r diyebiliriz. Kullan\u0131c\u0131dan hi\u00e7bir etkile\u015fim istemeden sessizce login ger\u00e7ekle\u015ftirir. <\/li>\n<\/ul>\n<\/li>\n<li><strong><em>Hosted Domain<\/em><\/strong> : Sadece belirli bir Google Workspace domain&#8217;ine izin vermek i\u00e7in kullan\u0131l\u0131r. \u00d6rne\u011fin yaln\u0131zca <code>firma.com<\/code> uzant\u0131l\u0131 Google hesaplar\u0131 login olsun isteniyorsa bu alana <code>firma.com<\/code> yaz\u0131lmal\u0131d\u0131r.<\/li>\n<li><strong><em>Use userIp param<\/em><\/strong> : Google&#8217;a kullan\u0131c\u0131n\u0131n IP bilgisini g\u00f6nderir. Genelde kapal\u0131 kal\u0131r, \u00e7o\u011fu senaryoda gerekmemektedir.<\/li>\n<li><strong><em>Request refresh token<\/em><\/strong> : Google&#8217;dan refresh token talep eder.<\/li>\n<\/ul>\n<p>\u015eimdi de provider yap\u0131land\u0131rmas\u0131n\u0131 daha da ciddi noktaya ta\u015f\u0131yal\u0131m ve scroll bar\u0131 sayfan\u0131n biraz a\u015fa\u011f\u0131s\u0131na indirerek Advanced settings k\u0131sm\u0131n\u0131 inceyelim.<\/p>\n<h6><span class=\"ez-toc-section\" id=\"Advanced_Settings\"><\/span>Advanced Settings<span class=\"ez-toc-section-end\"><\/span><\/h6>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-4.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"829\" height=\"717\" class=\"aligncenter size-full wp-image-28506\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-4.png 829w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-4-300x259.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-4-768x664.png 768w\" sizes=\"auto, (max-width: 829px) 100vw, 829px\" \/><\/a><\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>Scopes<\/em><\/strong> : Google&#8217;dan hangi bilgilerin istendi\u011fini ifade eder. Varsay\u0131lan olarak genelde <code>openid<\/code> <code>email<\/code> <code>profile<\/code> bilgileri istenmektedir.\n<p><em><u>Peki buraya neler yazabiliriz?<\/u><\/em><br \/>\n\ud83d\udd39Google Calendar eri\u015fimi<\/p>\n<div style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;width:430px;\">\n<strong style=\"color:#60a5fa;font-size:12px;\">openid email profile https:\/\/www.googleapis.com\/auth\/calendar.readonly<br \/>\n<\/strong>\n<\/div>\n<p>\ud83d\udd39Google Drive eri\u015fimi<\/p>\n<div style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;width:430px;\">\n<strong style=\"color:#60a5fa;font-size:12px;\">openid email profile https:\/\/www.googleapis.com\/auth\/drive.readonly<br \/>\n<\/strong>\n<\/div>\n<p>\ud83d\udd39Gmail eri\u015fimi<\/p>\n<div style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;width:430px;\">\n<strong style=\"color:#60a5fa;font-size:12px;\">openid email profile https:\/\/www.googleapis.com\/auth\/gmail.readonly<br \/>\n<\/strong>\n<\/div>\n<\/li>\n<li><strong><em>Store Tokens<\/em><\/strong> : Google&#8217;dan gelen access ve refresh token&#8217;lar\u0131n Keycloak i\u00e7inde saklanmas\u0131n\u0131 sa\u011flar.\n<p>E\u011fer a\u00e7\u0131l\u0131rsa Google API&#8217;lerine Keycloak \u00fczerinden eri\u015fim sa\u011flanabilir, yok e\u011fer kapal\u0131ysa da sadece login i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong><em>Accepts prompt=none forward from client<\/em><\/strong> : E\u011fer bu ayar a\u00e7\u0131l\u0131rsa, client (ya da frontend) <code>prompt=none<\/code> ayar\u0131n\u0131 Google&#8217;a y\u00f6nlendirecektir. \u0130leri seviye SSO senaryolar\u0131 i\u00e7in kullan\u0131lmaktad\u0131r.<\/li>\n<li><strong><em>Disable User Info<\/em><\/strong> : Google&#8217;dan ek olarak userinfo endpoint \u00e7a\u011fr\u0131s\u0131 yap\u0131lmas\u0131n\u0131 engeller. Default olarak kapal\u0131 olsa da a\u00e7\u0131ld\u0131\u011f\u0131 taktirde baz\u0131 claim&#8217;ler gelmeyebilir.<\/li>\n<li><strong><em>Trust Email \u26a0\ufe0f \u00d6NEML\u0130<\/em><\/strong> : Google&#8217;dan gelen email&#8217;in do\u011frulanm\u0131\u015f kabul edilip edilmeyece\u011fini yap\u0131land\u0131r\u0131r. Yani Google&#8217;\u0131n <code>email_verified<\/code> claim&#8217;ine g\u00fcvenecektir. Kapal\u0131 oldu\u011fu taktirde ise Keycloak ayr\u0131ca email do\u011frulamas\u0131 isteyebilir.\n<p>Google i\u00e7in genelde a\u00e7\u0131labilir ancak kurumsal g\u00fcvenlik gerektiren noktalarda kapal\u0131 kullan\u0131lmas\u0131 \u00f6nerilmektedir.<\/li>\n<li><strong><em>Account Linking Only<\/em><\/strong> : Bu provider&#8217;dan yeni bir kullan\u0131c\u0131n\u0131n olu\u015fturulup olu\u015fturulmayaca\u011f\u0131n\u0131 yap\u0131land\u0131rd\u0131\u011f\u0131m\u0131z ayard\u0131r. Yani aktifle\u015ftirilirse yaln\u0131zca mevcut hesaplara link ger\u00e7ekle\u015ftirilir ve yeni user creation s\u00fcreci engellenmi\u015f olur. \u00d6zellikle production s\u00fcre\u00e7lerinde g\u00fcvenlik i\u00e7in s\u0131k kullan\u0131lmaktad\u0131r.<\/li>\n<li><strong><em>Hide on Login Page<\/em><\/strong> : Login ekran\u0131nda Google ile giri\u015f butonu g\u00f6r\u00fcnmez ama URL ile yine de \u00e7a\u011fr\u0131labilir.<\/li>\n<li><strong><em>Show in Account Console<\/em><\/strong> : Kullan\u0131c\u0131 profil sayfas\u0131nda bu provider g\u00f6r\u00fcns\u00fcn m\u00fc?<\/li>\n<li><strong><em>Verify Essential Claim<\/em><\/strong> : OIDC &#8216;essential claim&#8217; kontrol\u00fc yapar.<\/li>\n<li><strong><em>First Login Flow Override<\/em><\/strong> : Bu provider&#8217;dan ilk kez login olan kullan\u0131c\u0131 i\u00e7in hangi flow&#8217;un \u00e7al\u0131\u015fac\u011fa\u0131n\u0131 belirler.<\/li>\n<li><strong><em>Post Login Flow<\/em><\/strong> : Login ba\u015far\u0131yla tamamland\u0131ktan sonra ekstradan bir flow daha \u00e7al\u0131\u015ft\u0131rabilmemizi sa\u011flar.<\/li>\n<li><strong><em>Sync Mode \u26a0\ufe0f \u00c7OK \u00d6NEML\u0130<\/em><\/strong> : Google&#8217;dan gelen kullan\u0131c\u0131 bilgilerinin nas\u0131l senkronize edilece\u011fini yap\u0131land\u0131r\u0131r.\n<ul>\n<li><code>Import<\/code> : \u0130lk login&#8217;de sonradan de\u011fi\u015fmeyecek \u015fekilde import edilir.<\/li>\n<li><code>Force<\/code> : Her login&#8217;de Google&#8217;daki de\u011fi\u015fiklikler g\u00fcncellenir.<\/li>\n<li><code>Legacy<\/code> : Keycloak&#8217;un eski versiyonlar\u0131ndaki karma davran\u0131\u015f\u0131 korur. Yani ne tam olarak import ne de force davran\u0131\u015f\u0131 sergiler.<\/li>\n<\/ul>\n<\/li>\n<li><strong><em>Case-sensitive username<\/em><\/strong> : Username b\u00fcy\u00fck\/k\u00fc\u00e7\u00fck harf duyarl\u0131l\u0131\u011f\u0131n\u0131 yap\u0131land\u0131r\u0131r.<\/li>\n<\/ul>\n<h4><span class=\"ez-toc-section\" id=\"Direkt_AspNET_Core_Projesinden_External_Identity_Provider_Ile_Login_Yapma\"><\/span>Direkt Asp.NET Core Projesinden External Identity Provider \u0130le Login Yapma<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u015eimdi de Asp.NET Core uygulamalar\u0131nda kullan\u0131c\u0131y\u0131 Keycloak&#8217;a y\u00f6nlendirmeksizin, Keycloak&#8217;daki Google login yap\u0131land\u0131rmas\u0131n\u0131 kullanarak direkt bir buton arac\u0131l\u0131\u011f\u0131yla Google \u00fczerinden giri\u015f nas\u0131l yap\u0131labilece\u011fini inceleyelim&#8230;<\/p>\n<p>Tabi \u00f6ncelikle bunun i\u00e7in Keycloak&#8217;da standard flow ak\u0131\u015f\u0131na sahip client authentication olarak yap\u0131land\u0131r\u0131lm\u0131\u015f a\u015fa\u011f\u0131daki ayarlarda <code>application-client<\/code> isimli bir client olu\u015ftural\u0131m.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-5.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"335\" height=\"634\" class=\"aligncenter size-full wp-image-28519\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-5.png 335w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-5-159x300.png 159w\" sizes=\"auto, (max-width: 335px) 100vw, 335px\" \/><\/a>Ard\u0131ndan bu client&#8217;la ili\u015fkilendirilmi\u015f Asp.NET Core uygulamas\u0131n\u0131 a\u015fa\u011f\u0131daki gibi yap\u0131land\u0131ral\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services.AddAuthentication(options =&gt;\r\n{\r\n    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;\r\n    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;\r\n})\r\n    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =&gt;\r\n    {\r\n        options.LoginPath = &quot;\/login&quot;;\r\n        options.LogoutPath = &quot;\/logout&quot;;\r\n    })\r\n    .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =&gt;\r\n    {\r\n        options.Authority = &quot;http:\/\/127.0.0.1:8080\/realms\/master&quot;;\r\n        options.ClientId = &quot;application-client&quot;;\r\n        options.ClientSecret = &quot;xtiFpVpuOxNS3CoN2v78h7ay7ns06t9z&quot;;\r\n        options.ResponseType = &quot;code&quot;;\r\n\r\n        options.SaveTokens = true;\r\n        options.GetClaimsFromUserInfoEndpoint = true;\r\n        options.RequireHttpsMetadata = false;\r\n\r\n        options.Scope.Clear();\r\n        options.Scope.Add(&quot;openid&quot;);\r\n        options.Scope.Add(&quot;profile&quot;);\r\n        options.Scope.Add(&quot;email&quot;);\r\n\r\n        options.CallbackPath = &quot;\/signin-oidc&quot;;\r\n\r\n        options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Disable;\r\n\r\n        options.TokenValidationParameters = new()\r\n        {\r\n            NameClaimType = JwtRegisteredClaimNames.PreferredUsername,\r\n        };\r\n\r\n        options.Events = new OpenIdConnectEvents\r\n        {\r\n            OnRedirectToIdentityProvider = context =&gt;\r\n            {\r\n                if (context.Properties.Items.TryGetValue(&quot;kc_idp_hint&quot;, out var provider))\r\n                {\r\n                    context.ProtocolMessage.SetParameter(&quot;kc_idp_hint&quot;, provider);\r\n                }\r\n\r\n                return Task.CompletedTask;\r\n            }\r\n        };\r\n    });\r\n<\/pre>\n<\/div>\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>Pushed Authorization Requests (PAR) nedir?<\/em><\/strong><br \/>\nKeycloak&#8217;da, authorization endpoint&#8217;ine uzun ve hassas parametrelerin URL \u00fczerinden gitmesini engelleyen daha g\u00fcvenli bir yetkilendirme ba\u015flatma mekanizmas\u0131d\u0131r.<\/p>\n<p>Standart authorization flow&#8217;da client, kullan\u0131c\u0131y\u0131 \u015f\u00f6yle y\u00f6nlendirir:<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;font-size:8px;white-space:pre;line-height:0.8;padding:13px;\">\nGET \/authorize?<br \/>\n client_id=webapp<br \/>\n &#038;redirect_uri=https:\/\/app.com\/callback<br \/>\n &#038;scope=openid profile email<br \/>\n &#038;state=abc<br \/>\n &#038;code_challenge=xyz\n<\/div>\n<p>Yani t\u00fcm parametreler URL query string i\u00e7inde gider. Bu yakla\u015f\u0131m, haddinden uzun URL yap\u0131s\u0131na sebep olabilece\u011fi gibi parametrelerin browser history&#8217;sinde g\u00f6z\u00fckmesine neden olabilir. Ayr\u0131ca proxy ve log sistemlerinde de parametreler kaydedilebilir ve bu tarz durumlardan kaynakl\u0131 manip\u00fclasyon riski s\u00f6z konusu olabilir.<\/p>\n<p>PAR&#8217;da ise client authorization parametreleri \u00f6nce arka planda Keycloak&#8217;a post ile g\u00f6nderilir. Ard\u0131ndan kullan\u0131c\u0131 a\u015fa\u011f\u0131daki gibi k\u0131sa referansla y\u00f6nlendirilir:<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;font-size:8px;white-space:pre;line-height:0.8;padding:13px;\">\nGET \/auth?request_uri=urn:ietf:params:oauth:request_uri:abc123\n<\/div>\n<p>B\u00f6ylece PAR sayesinde authorization iste\u011fi \u00f6nce server&#8217;a kaydedilip, ard\u0131ndan sadece referans\u0131 kullan\u0131larak g\u00fcvenli bir \u015fekilde login ba\u015flat\u0131lm\u0131\u015f olur.\n<\/p><\/div>\n<p>Burada can al\u0131c\u0131 iki nokta mevcuttur.<\/p>\n<p>Birincisi, 29. sat\u0131rdaki <code style=\"color:red;style=\"font-size:12px;\">options.PushedAuthorizationBehavior = PushedAuthorizationBehavior.Disable<\/code> komutudur. Burada dikkat ederseniz Pushed Authorization Requests (PAR) yap\u0131land\u0131rmas\u0131n\u0131 disable olarak ayarlamaktay\u0131z. Bunun nedeni, Keycloak&#8217;un 26.x s\u00fcr\u00fcm\u00fcyle birlikte PAR&#8217;\u0131n varsay\u0131lan olarak zorunlu hale gelmi\u015f olmas\u0131d\u0131r. Ki bu zorunluluk neticesinde bir login y\u00f6nlendirme parametresi olan <code>kc_idp_hint<\/code> Keycloak taraf\u0131ndan i\u015flenememektedir. O y\u00fczden PAR mekanizmas\u0131 bu noktada devre d\u0131\u015f\u0131 b\u0131rak\u0131lmaktad\u0131r.<\/p>\n<blockquote><p><em><code>kc_idp_hint<\/code>, Keycloak&#8217;a kullan\u0131c\u0131n hangi Identity Provider ile giri\u015f yapaca\u011f\u0131n\u0131 s\u00f6yleyen bir y\u00f6nlendirme parametresidir.<\/em><\/p><\/blockquote>\n<p>\u0130kinci can al\u0131c\u0131 nokta ise 36 ile 47. sat\u0131r aral\u0131\u011f\u0131nda, olu\u015fturulan Keycloak&#8217;a y\u00f6nlendirme URL&#8217;ine <code>kc_idp_hint<\/code> parametresinin eklenmesidir. Kullan\u0131c\u0131n\u0131n Keycloak login sayfas\u0131n\u0131 g\u00f6rmeksizin hangi Identity Provider (IdP) ile giri\u015f yapaca\u011f\u0131n\u0131 belirlememizi sa\u011flayan <code>kc_idp_hint<\/code> parametresi, i\u015fte tam da bu noktada authorization flow URL&#8217;ine m\u00fcdahale ederek kullan\u0131c\u0131n\u0131n y\u00f6nlendirilece\u011fi URL&#8217;in Google login URL&#8217;i olaca\u011f\u0131n\u0131 ifade etmektedir. Burada dikkat ederseniz Keycloak&#8217;a y\u00f6nlendirme iste\u011fi olu\u015fturulmadan hemen \u00f6nce <code>OpenIdConnectEvents<\/code> ile araya girilmekte ve y\u00f6nlendirmenin ba\u015flat\u0131ld\u0131\u011f\u0131 noktadan g\u00f6nderilen property&#8217;ler kontrol edilerek, i\u00e7erisinde <code>kc_idp_hint<\/code> var m\u0131 yok mu de\u011ferlendirilmektedir. E\u011fer bu de\u011fer varsa olu\u015fturulacak y\u00f6nlendirme URL&#8217;ine eklenmekte ve Google login s\u00fcreci tam olarak konfig\u00fcre edilmektedir.<\/p>\n<p>Asp.NET Core uygulamas\u0131n\u0131n yap\u0131land\u0131rmas\u0131n\u0131 bu \u015fekilde yapt\u0131ktan sonra geriye yaln\u0131zca a\u015fa\u011f\u0131daki gibi Google ile login yapmam\u0131z\u0131 sa\u011flayacak olan noktay\u0131, yani bir action&#8217;\u0131 olu\u015fturmak kalmaktad\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\n        &#x5B;HttpPost()]\r\n        public IActionResult LoginWithGoogle(LoginViewModel model)\r\n        {\r\n            return Challenge(new AuthenticationProperties { RedirectUri = &quot;\/&quot;, Items = { &#x5B;&quot;kc_idp_hint&quot;] = &quot;google&quot; } }, OpenIdConnectDefaults.AuthenticationScheme);\r\n        }\r\n.\r\n.\r\n.\r\n<\/pre>\n<\/div>\n<p>Burada da dikkat ederseniz <code>LoginWithGoogle<\/code> action metodunun i\u00e7erisinde <code>Challenge<\/code> yap\u0131l\u0131rken <code>AuthenticationProperties<\/code>&#8216;e <em>RedirectUri<\/em>&#8216;nin yan\u0131nda bir de <em>Items<\/em> eklemekte ve mevzu bahis olan <code>kc_idp_hint<\/code> parametresi burada Dictionary olarak tan\u0131mlan\u0131p identity provider&#8217;\u0131n <em>&#8220;google&#8221;<\/em> olaca\u011f\u0131 ifade edilmektedir.<\/p>\n<p>Evet&#8230; Asp.NET Core ile Keycloak yap\u0131land\u0131rmal\u0131 Google ile login \u00e7al\u0131\u015fmas\u0131 bundan ibarettir. Daha fazla teknik detay i\u00e7in i\u00e7eri\u011fimizin sonundaki GitHub reposuna g\u00f6z atabilirsiniz.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Direkt_SPAda_External_Identity_Provider_Ile_Login_Yapma\"><\/span>Direkt SPA&#8217;da External Identity Provider \u0130le Login Yapma<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Benzer mant\u0131kla bir SPA&#8217;de de Keycloak&#8217;da yap\u0131land\u0131r\u0131lm\u0131\u015f ve direkt Google login&#8217;e y\u00f6nlendiren bir butona ihtiyac\u0131m\u0131z olabilir. Bunun i\u00e7in yap\u0131lmas\u0131 gerekenler olduk\u00e7a basittir. \u015eimdi gelin bunu bir Angular uygulamas\u0131 \u00fczerinden k\u0131saca deneyimlemeye \u00e7al\u0131\u015fal\u0131m&#8230;<\/p>\n<p>\u00d6ncelikle Keycloak&#8217;da standard flow ak\u0131\u015f\u0131na sahip a\u015fa\u011f\u0131daki g\u00f6rseldeki gibi yap\u0131land\u0131r\u0131lm\u0131\u015f <code>angular-client<\/code> isimli bir client olu\u015ftural\u0131m:<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-6.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-6.png\" alt=\"Keycloak&#039;da First Broker Login Flow&#039;u \u0130nceleyelim #10\" width=\"448\" height=\"837\" class=\"aligncenter size-full wp-image-28524\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-6.png 448w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/03\/Keycloakda-First-Broker-Login-Flowu-Inceleyelim-10-6-161x300.png 161w\" sizes=\"auto, (max-width: 448px) 100vw, 448px\" \/><\/a><br \/>\nArd\u0131ndan ilgili Angular projesine <code><a href=\"https:\/\/www.npmjs.com\/package\/keycloak-js\" target=\"_blank\">keycloak-js<\/a><\/code> k\u00fct\u00fcphanesini y\u00fckleyelim.<\/p>\n<div style=\"background: #0f172a;color: #38bdf8;padding: 16px 20px;border-radius: 12px;font-family: system-ui, -apple-system, sans-serif;border: 1px solid #334155;margin: 1.2em 0;box-shadow: 0 4px 15px rgba(0,0,0,0.25);text-decoration: none;font-weight: 500;word-break: break-all;transition: color 0.2s;width:200px;\">\n    <strong style=\"color:#60a5fa;font-size:15px;\">npm install keycloak-js<br \/>\n<\/strong>\n<\/div>\n<p>Ve devam\u0131nda a\u015fa\u011f\u0131daki yap\u0131land\u0131rmaya sahip bir konfig\u00fcrasyon dosyas\u0131 olu\u015ftural\u0131m:<\/p>\n<p><em>keycloak.configurations.ts<\/em>;<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport Keycloak from 'keycloak-js';\r\n\r\nconst keycloak = new Keycloak({\r\n    url: 'http:\/\/127.0.0.1:8080',\r\n    realm: 'master',\r\n    clientId: 'angular-client'\r\n});\r\n\r\nexport default keycloak;\r\n<\/pre>\n<\/div>\n<p>Ve uygulama ayarlar\u0131n\u0131n yap\u0131ld\u0131\u011f\u0131 <em>app.config.ts<\/em> dosyas\u0131nda da a\u015fa\u011f\u0131daki yap\u0131land\u0131rmada bulunal\u0131m:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n.\r\n.\r\n.\r\nimport keycloak from '.\/configurations\/keycloak.configurations';\r\n\r\nexport const appConfig: ApplicationConfig = {\r\n  providers: &#x5B;\r\n    provideBrowserGlobalErrorListeners(),\r\n    provideRouter(routes),\r\n    provideAppInitializer(() =&gt; {\r\n      keycloak.init({\r\n        onLoad: 'check-sso',\r\n        pkceMethod: 'S256',\r\n        checkLoginIframe: false\r\n      })\r\n    })\r\n  ]\r\n};\r\n<\/pre>\n<\/div>\n<p>Evet, art\u0131k uygulamam\u0131z belirtilen Keycloak sunucusunda yap\u0131land\u0131r\u0131lm\u0131\u015f olan Google ile login s\u00fcrecine olduk\u00e7a haz\u0131r. Bunu test edebilmek i\u00e7in a\u015fa\u011f\u0131daki gibi basit bir component tasarlamam\u0131z yeterli olacakt\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nimport keycloak from '.\/configurations\/keycloak.configurations';\r\n\r\n@Component({\r\n  selector: 'app-root',\r\n  imports: &#x5B;RouterOutlet],\r\n  template: `\r\n  &lt;button (click)=&quot;loginWithGoogle()&quot;&gt;Google ile giri\u015f&lt;\/button&gt;\r\n  `\r\n})\r\nexport class App {\r\n  async loginWithGoogle() {\r\n    await keycloak.login({\r\n      idpHint: 'google',\r\n      redirectUri: window.location.origin\r\n    });\r\n  }\r\n}\r\n<\/pre>\n<\/div>\n<p>\u0130\u015fte bu kadar \ud83d\ude42<\/p>\n<p>Bizler i\u00e7erik boyunca teknik a\u00e7\u0131dan Google ile login s\u00fcrecini tecr\u00fcbe etmi\u015f bulunmaktay\u0131z. Tabi ki de sizler farkl\u0131 external identity provider&#8217;lar\u0131 deneyebilir ve varsa k\u00fc\u00e7\u00fck n\u00fcanslar bizleri de ayd\u0131nlatabilirsiniz.<\/p>\n<p>Nihai olarak;<\/p>\n<p>First Broker Login Flow, modern kimlik federasyonunun bel kemi\u011fini olu\u015fturan ve external identity provider&#8217;lar ile kurumsal kullan\u0131c\u0131 y\u00f6netimi aras\u0131ndaki kritik k\u00f6pr\u00fcy\u00fc g\u00fcvenli bir \u015fekilde in\u015fa etmemizi sa\u011flayan vazge\u00e7ilmez bir mekanizmad\u0131r. Do\u011fru yap\u0131land\u0131r\u0131ld\u0131\u011f\u0131 taktirde hem kullan\u0131c\u0131 deneyimini kusursuzla\u015ft\u0131ran hem de hesap ele ge\u00e7irme gibi ciddi g\u00fcvenlik risklerini bertaraf eden bu ak\u0131\u015f, Keycloak&#8217;un identity brokering yeteneklerini tam anlam\u0131yla ete kemi\u011fe b\u00fcr\u00fcnd\u00fcrmektedir. Unutulmamal\u0131d\u0131r ki, her external provider&#8217;dan giri\u015f esas\u0131nda bir g\u00fcven meselesidir. Bu meselenin yap\u0131land\u0131rmas\u0131 ne kadar sa\u011flam ve bilin\u00e7li bir \u015fekilde sa\u011flan\u0131rsa, dijital kimlik altyap\u0131s\u0131 o kadar diren\u00e7li ve g\u00fcvenilir olacakt\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<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/Keycloak.Examples<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili konuya dair \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden incelemede bulunabilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/Keycloak.Examples\/tree\/Keycloak7.AspNETCore-%C4%B0le-First-Broker-Login-Flow-%C3%96rne%C4%9Fi\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\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, Biliyorsunuz ki, modern kimlik y\u00f6netimi sistemlerinde kullan\u0131c\u0131lar yaln\u0131zca uygulaman\u0131n kendi kullan\u0131c\u0131 veritaban\u0131 \u00fczerinden de\u011fil; Google, Microsoft, GitHub veya kurumsal kimlik sa\u011flay\u0131c\u0131lar\u0131 gibi harici Identity Provider&#8216;lar arac\u0131l\u0131\u011f\u0131yla kimlik do\u011frulamas\u0131 ger\u00e7ekle\u015ftirmektedirler. Keycloak bu senaryoyu Identity&#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":[5554],"tags":[5672,5670,5669,5626,5678,5555,5677,5671,5676],"class_list":["post-28484","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-keycloak","tag-account-takeover","tag-broker-login-flow","tag-first-broker-login-flow","tag-identity-brokering","tag-kc_idp_hint","tag-keycloak","tag-par","tag-post-broker-login-flow","tag-pushed-authorization-requests"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28484","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=28484"}],"version-history":[{"count":22,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28484\/revisions"}],"predecessor-version":[{"id":28526,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28484\/revisions\/28526"}],"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=28484"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28484"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28484"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}