{"id":43656,"date":"2026-07-28T08:01:06","date_gmt":"2026-07-28T05:01:06","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=43656"},"modified":"2026-07-28T08:01:42","modified_gmt":"2026-07-28T05:01:42","slug":"angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/","title":{"rendered":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi"},"content":{"rendered":"<h2>Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz modern web uygulamalar\u0131nda g\u00fcvenlik, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin en kritik unsurlar\u0131ndan biri haline gelmi\u015ftir. Kullan\u0131c\u0131 verilerinin korunmas\u0131, yetkisiz eri\u015fimlerin engellenmesi ve g\u00fcvenli oturum y\u00f6netimi, tek sayfal\u0131 uygulamalarda (Single Page Applications &#8211; SPA) \u00f6zel bir mimari yakla\u015f\u0131m gerektirir. Angular gibi g\u00fc\u00e7l\u00fc ve mod\u00fcler bir \u00f6n y\u00fcz \u00e7er\u00e7evesiyle \u00e7al\u0131\u015f\u0131rken, kimlik do\u011frulama (Authentication) ve yetkilendirme (Authorization) altyap\u0131s\u0131n\u0131 s\u0131f\u0131rdan in\u015fa etmek hem zaman al\u0131c\u0131d\u0131r hem de ciddi g\u00fcvenlik risklerini beraberinde getirebilir.<\/p>\n<p>Bu noktada Auth0, Bulut tabanl\u0131 Kimlik Hizmeti (Identity-as-a-Service &#8211; IDaaS) sa\u011flay\u0131c\u0131s\u0131 olarak devreye girer. Auth0, geli\u015ftiricilere \u00f6l\u00e7eklenebilir, g\u00fcvenli ve esnek bir kimlik do\u011frulama ekosistemi sunar. Auth0&#8217;\u0131n sundu\u011fu en pratik \u00e7\u00f6z\u00fcmlerden biri olan <strong>Auth0 Lock<\/strong>, \u00f6zelle\u015ftirilebilir, duyarl\u0131 (responsive) ve t\u00fcm modern giri\u015f senaryolar\u0131n\u0131 (kullan\u0131c\u0131 ad\u0131\/\u015fifre, sosyal medya ile giri\u015f, \u015fifresiz giri\u015f) destekleyen haz\u0131r bir kimlik do\u011frulama aray\u00fcz\u00fcd\u00fcr (Widget). Bu makalede, Angular uygulamalar\u0131nda Auth0 ve Auth0 Lock entegrasyonunu u\u00e7tan uca, mimari detaylar\u0131 ve en iyi uygulama standartlar\u0131yla ele alaca\u011f\u0131z.<\/p>\n<h2>1. Temel Kavramlar ve Mimari Yap\u0131<\/h2>\n<p>Angular uygulamas\u0131nda Auth0 ve Auth0 Lock entegrasyonuna ge\u00e7meden \u00f6nce, altta yatan protokollerin ve bile\u015fenlerin nas\u0131l \u00e7al\u0131\u015ft\u0131\u011f\u0131n\u0131 anlamak kritik \u00f6nem ta\u015f\u0131r.<\/p>\n<h3>OAuth 2.0 ve OpenID Connect (OIDC)<\/h3>\n<p>Auth0, standart olarak OAuth 2.0 yetkilendirme \u00e7er\u00e7evesini ve bunun \u00fczerine in\u015fa edilmi\u015f OpenID Connect (OIDC) kimlik do\u011frulama katman\u0131n\u0131 kullan\u0131r. OAuth 2.0, uygulaman\u0131n kullan\u0131c\u0131 ad\u0131na kaynaklara eri\u015fmesini sa\u011flarken; OIDC, kullan\u0131c\u0131n\u0131n kimli\u011fini do\u011frular ve istemciye (Angular uygulamas\u0131) kullan\u0131c\u0131 hakk\u0131nda standart bilgiler (ID Token) sa\u011flar.<\/p>\n<h3>Token Tipleri<\/h3>\n<p>Auth0 mimarisinde temel olarak iki t\u00fcr token ile \u00e7al\u0131\u015f\u0131l\u0131r:<\/p>\n<ul>\n<li><strong>ID Token:<\/strong> JSON Web Token (JWT) format\u0131ndad\u0131r. Kullan\u0131c\u0131n\u0131n kimlik bilgilerini (ad, e-posta, profil foto\u011fraf\u0131 vb.) i\u00e7erir. \u0130stemci taraf\u0131 (Angular) taraf\u0131ndan okunup kullan\u0131c\u0131 aray\u00fcz\u00fcn\u00fc \u015fekillendirmek i\u00e7in kullan\u0131l\u0131r.<\/li>\n<li><strong>Access Token:<\/strong> Uygulaman\u0131n korunan arka plan (Backend API) servislerine istek yaparken sundu\u011fu anahtard\u0131r. Bearer token olarak HTTP isteklerinin ba\u015fl\u0131klar\u0131na (Header) eklenir.<\/li>\n<\/ul>\n<h3>Auth0 Lock Nedir?<\/h3>\n<p>Auth0 Lock, tek bir bile\u015fenle t\u00fcm kimlik do\u011frulama ak\u0131\u015f\u0131n\u0131 y\u00f6neten bir JavaScript k\u00fct\u00fcphanesidir. Geli\u015ftiricileri her bir giri\u015f t\u00fcr\u00fc i\u00e7in ayr\u0131 form tasarlama, validation yazma ve sosyal a\u011f entegrasyonlar\u0131 i\u00e7in ayr\u0131 SDK&#8217;lar ba\u011flama y\u00fck\u00fcnden kurtar\u0131r. Lock k\u00fct\u00fcphanesi, Auth0 backend&#8217;i ile do\u011frudan g\u00fcvenli bir \u015fekilde haberle\u015ferek kullan\u0131c\u0131 oturumunu a\u00e7ar ve gerekli token&#8217;lar\u0131 Angular uygulamas\u0131na teslim eder.<\/p>\n<h2>2. Auth0 Dashboard \u00dczerinde Yap\u0131land\u0131rma<\/h2>\n<p>Entegrasyonun ilk ad\u0131m\u0131, Auth0 y\u00f6netim panelinde (Dashboard) bir uygulama tan\u0131mlamak ve g\u00fcvenlik parametrelerini ayarlamakt\u0131r.<\/p>\n<h3>Uygulama Olu\u015fturma<\/h3>\n<ol>\n<li>Auth0 hesab\u0131n\u0131za giri\u015f yap\u0131n ve <strong>Applications &gt; Applications<\/strong> sekmesine gidin.<\/li>\n<li><strong>Create Application<\/strong> butonuna t\u0131klay\u0131n.<\/li>\n<li>Uygulaman\u0131za bir isim verin (\u00d6rn: &#8220;Angular-Auth0-App&#8221;) ve t\u00fcr olarak <strong>Single Page Web Applications<\/strong> se\u00e7ene\u011fini i\u015faretleyin.<\/li>\n<\/ol>\n<h3>Uygulama Ayarlar\u0131 (Application Settings)<\/h3>\n<p>Olu\u015fturulan uygulaman\u0131n detay sayfas\u0131na girerek a\u015fa\u011f\u0131daki parametrelerin yap\u0131land\u0131r\u0131lmas\u0131 gerekir:<\/p>\n<ul>\n<li><strong>Domain:<\/strong> Auth0 kirac\u0131n\u0131z\u0131n (tenant) benzersiz adresidir (\u00f6rn: <code>dev-domain.us.auth0.com<\/code>).<\/li>\n<li><strong>Client ID:<\/strong> Uygulaman\u0131z\u0131 Auth0 taraf\u0131nda tan\u0131tan a\u00e7\u0131k kimlik bilgisidir.<\/li>\n<li><strong>Allowed Callback URLs:<\/strong> Auth0 Lock \u00fczerinden ba\u015far\u0131l\u0131 giri\u015f yap\u0131ld\u0131ktan sonra kullan\u0131c\u0131n\u0131n y\u00f6nlendirilece\u011fi g\u00fcvenli adreslerdir. Yerel geli\u015ftirme i\u00e7in <code>http:\/\/localhost:4200<\/code> eklenmelidir.<\/li>\n<li><strong>Allowed Logout URLs:<\/strong> Oturum kapat\u0131ld\u0131\u011f\u0131nda kullan\u0131c\u0131n\u0131n y\u00f6nlendirilece\u011fi adrestir. Yine <code>http:\/\/localhost:4200<\/code> tan\u0131mlanmal\u0131d\u0131r.<\/li>\n<li><strong>Allowed Web Origins:<\/strong> Cross-Origin Resource Sharing (CORS) g\u00fcvenlik \u00f6nlemi i\u00e7in uygulaman\u0131z\u0131n \u00e7al\u0131\u015ft\u0131\u011f\u0131 k\u00f6k adrestir (<code>http:\/\/localhost:4200<\/code>).<\/li>\n<\/ul>\n<h2>3. Angular Projesinin Haz\u0131rlanmas\u0131 ve Ba\u011f\u0131ml\u0131l\u0131klar\u0131n Kurulmas\u0131<\/h2>\n<p>Auth0 Lock k\u00fct\u00fcphanesini bir Angular projesine dahil etmek i\u00e7in gerekli npm paketlerinin kurulmas\u0131 ve ortam de\u011fi\u015fkenlerinin (environment) ayarlanmas\u0131 gerekir.<\/p>\n<h3>Paket Kurulumu<\/h3>\n<p>Terminal \u00fczerinden projenizin k\u00f6k dizininde a\u015fa\u011f\u0131daki komutu \u00e7al\u0131\u015ft\u0131rarak <code>auth0-lock<\/code> k\u00fct\u00fcphanesini ve TypeScript tip tan\u0131mlamalar\u0131n\u0131 y\u00fckleyin:<\/p>\n<pre><code>npm install auth0-lock --save\nnpm install @types\/auth0-lock --save-dev\n<\/code><\/pre>\n<h3>Environment Yap\u0131land\u0131rmas\u0131<\/h3>\n<p>Auth0 bilgilerinizi kod i\u00e7erisine sabit yazmak yerine Angular&#8217;\u0131n <code>src\/environments\/environment.ts<\/code> dosyas\u0131 i\u00e7erisinde tutmak en do\u011fru yakla\u015f\u0131md\u0131r:<\/p>\n<pre><code>export const environment = {\n  production: false,\n  auth0: {\n    domain: 'YOUR_AUTH0_DOMAIN.us.auth0.com',\n    clientId: 'YOUR_AUTH0_CLIENT_ID',\n    callbackURL: 'http:\/\/localhost:4200',\n    audience: 'https:\/\/YOUR_AUTH0_DOMAIN.us.auth0.com\/api\/v2\/'\n  }\n};\n<\/code><\/pre>\n<h2>4. Auth0 Lock Servisinin (AuthService) Tasarlanmas\u0131<\/h2>\n<p>Angular&#8217;da kimlik do\u011frulama mant\u0131\u011f\u0131n\u0131 bile\u015fenlerden (Component) ay\u0131rarak merkezi bir servis (Injectable Service) i\u00e7erisinde toplamak, kodun s\u00fcrd\u00fcr\u00fclebilirli\u011fi ve test edilebilirli\u011fi a\u00e7\u0131s\u0131ndan elzemdir.<\/p>\n<p>A\u015fa\u011f\u0131da, Auth0 Lock bile\u015fenini ba\u015flatan, olaylar\u0131 (events) dinleyen ve token y\u00f6netimini \u00fcstlenen \u00f6rnek bir <code>AuthService<\/code> uygulamas\u0131 yer almaktad\u0131r:<\/p>\n<pre><code>import { Injectable } from '@angular\/core';\nimport { Router } from '@angular\/router';\nimport Auth0Lock from 'auth0-lock';\nimport { environment } from '..\/..\/environments\/environment';\n\n@Injectable({\n  providedIn: 'root'\n})\nexport class AuthService {\n  private lock: Auth0LockStatic;\n\n  constructor(private router: Router) {\n    this.initLock();\n    this.handleAuthentication();\n  }\n\n  private initLock(): void {\n    const options: Auth0LockConstructorOptions = {\n      auth: {\n        redirectUrl: environment.auth0.callbackURL,\n        responseType: 'token id_token',\n        audience: environment.auth0.audience,\n        params: {\n          scope: 'openid profile email'\n        }\n      },\n      autoclose: true,\n      oidcConformant: true,\n      theme: {\n        logo: 'assets\/logo.png',\n        primaryColor: '#311b92'\n      },\n      languageDictionary: {\n        title: \"G\u00fcvenli Giri\u015f\"\n      }\n    };\n\n    this.lock = new Auth0Lock(\n      environment.auth0.clientId,\n      environment.auth0.domain,\n      options\n    );\n  }\n\n  public login(): void {\n    this.lock.show();\n  }\n\n  private handleAuthentication(): void {\n    this.lock.on('authenticated', (authResult: any) => {\n      if (authResult &amp;&amp; authResult.accessToken &amp;&amp; authResult.idToken) {\n        this.setSession(authResult);\n        this.router.navigate(['\/dashboard']);\n      }\n    });\n\n    this.lock.on('authorization_error', (error: any) => {\n      console.error('Kimlik do\u011frulama hatas\u0131:', error);\n    });\n  }\n\n  private setSession(authResult: any): void {\n    const expiresAt = JSON.stringify((authResult.expiresIn * 1000) + new Date().getTime());\n    localStorage.setItem('access_token', authResult.accessToken);\n    localStorage.setItem('id_token', authResult.idToken);\n    localStorage.setItem('expires_at', expiresAt);\n  }\n\n  public logout(): void {\n    localStorage.removeItem('access_token');\n    localStorage.removeItem('id_token');\n    localStorage.removeItem('expires_at');\n    this.router.navigate(['\/']);\n  }\n\n  public isAuthenticated(): boolean {\n    const expiresAt = JSON.parse(localStorage.getItem('expires_at') || '0');\n    return new Date().getTime() &lt; expiresAt;\n  }\n\n  public getAccessToken(): string | null {\n    return localStorage.getItem('access_token');\n  }\n}\n<\/code><\/pre>\n<h3>Kodun Teknik Analizi<\/h3>\n<ul>\n<li><strong>new Auth0Lock():<\/strong> Lock bile\u015fenini yap\u0131land\u0131rma ayarlar\u0131yla birlikte ba\u015flat\u0131r. <code>responseType: 'token id_token'<\/code> se\u00e7ene\u011fi, ba\u015far\u0131l\u0131 giri\u015f sonras\u0131 hem access hem de ID token d\u00f6nmesini sa\u011flar.<\/li>\n<li><strong>this.lock.on(&#8216;authenticated&#8217;):<\/strong> Kullan\u0131c\u0131 Lock ekran\u0131nda ba\u015far\u0131l\u0131 \u015fekilde oturum a\u00e7t\u0131\u011f\u0131nda tetiklenen olay dinleyicisidir. D\u00f6n\u00fc\u015f parametresi olan <code>authResult<\/code> nesnesi i\u00e7erisinden token&#8217;lar al\u0131n\u0131r.<\/li>\n<li><strong>setSession():<\/strong> Elde edilen token&#8217;lar\u0131 ve ge\u00e7erlilik s\u00fcresini (expiration time) istemci taraf\u0131na kaydeder.<\/li>\n<li><strong>isAuthenticated():<\/strong> Mevcut zaman ile token&#8217;\u0131n son kullanma tarihini kar\u015f\u0131la\u015ft\u0131rarak kullan\u0131c\u0131n\u0131n oturumunun ge\u00e7erli olup olmad\u0131\u011f\u0131n\u0131 kontrol eder.<\/li>\n<\/ul>\n<h2>5. Angular Route Guard ile Sayfa Korumas\u0131<\/h2>\n<p>Yetkisiz kullan\u0131c\u0131lar\u0131n belirli rotalara (Route) eri\u015fimini engellemek i\u00e7in Angular&#8217;\u0131n <code>CanActivate<\/code> veya g\u00fcncel fonksiyonel guard yap\u0131lar\u0131 kullan\u0131l\u0131r. Kullan\u0131c\u0131 oturum a\u00e7mam\u0131\u015fsa otomatik olarak Lock ekran\u0131na veya ana sayfaya y\u00f6nlendirilir.<\/p>\n<p>Fonksiyonel mimariye uygun \u00f6rnek bir <code>AuthGuard<\/code> tan\u0131m\u0131:<\/p>\n<pre><code>import { inject } from '@angular\/core';\nimport { CanActivateFn, Router } from '@angular\/router';\nimport { AuthService } from '.\/auth.service';\n\nexport const authGuard: CanActivateFn = (route, state) =&gt; {\n  const authService = inject(AuthService);\n  const router = inject(Router);\n\n  if (authService.isAuthenticated()) {\n    return true;\n  } else {\n    authService.login();\n    return false;\n  }\n};\n<\/code><\/pre>\n<p>Bu Guard, <code>app.routes.ts<\/code> veya <code>app-routing.module.ts<\/code> i\u00e7erisindeki rotalara \u015fu \u015fekilde eklenir:<\/p>\n<pre><code>import { Routes } from '@angular\/router';\nimport { DashboardComponent } from '.\/dashboard\/dashboard.component';\nimport { authGuard } from '.\/auth.guard';\n\nexport const routes: Routes = [\n  { \n    path: 'dashboard', \n    component: DashboardComponent, \n    canActivate: [authGuard] \n  }\n];\n<\/code><\/pre>\n<h2>6. HTTP Interceptor ile Otomatik Token Ekleme<\/h2>\n<p>Kullan\u0131c\u0131 do\u011fruland\u0131ktan sonra, Angular uygulamas\u0131n\u0131n korunan API u\u00e7 noktalar\u0131na yapaca\u011f\u0131 her istekte Access Token g\u00f6ndermesi gerekir. Bu i\u015flem manuel yap\u0131lmak yerine bir HTTP Interceptor arac\u0131l\u0131\u011f\u0131yla otomatize edilir.<\/p>\n<p>A\u015fa\u011f\u0131da, istek ba\u015fl\u0131\u011f\u0131na Bearer Token ekleyen bir Interceptor \u00f6rne\u011fi verilmi\u015ftir:<\/p>\n<pre><code>import { HttpInterceptorFn } from '@angular\/common\/http';\nimport { inject } from '@angular\/core';\nimport { AuthService } from '.\/auth.service';\n\nexport const jwtInterceptor: HttpInterceptorFn = (req, next) =&gt; {\n  const authService = inject(AuthService);\n  const token = authService.getAccessToken();\n\n  if (token &amp;&amp; authService.isAuthenticated()) {\n    const cloned = req.clone({\n      setHeaders: {\n        Authorization: <code>Bearer ${token}<\/code>\n      }\n    });\n    return next(cloned);\n  }\n\n  return next(req);\n};\n<\/code><\/pre>\n<p>HTTP Interceptor, <code>app.config.ts<\/code> dosyas\u0131 i\u00e7erisinde <code>provideHttpClient<\/code> ile birlikte kaydedilmelidir:<\/p>\n<pre><code>import { provideHttpClient, withInterceptors } from '@angular\/common\/http';\nimport { ApplicationConfig } from '@angular\/core';\nimport { jwtInterceptor } from '.\/jwt.interceptor';\n\nexport const appConfig: ApplicationConfig = {\n  providers: [\n    provideHttpClient(withInterceptors([jwtInterceptor]))\n  ]\n};\n<\/code><\/pre>\n<h2>7. Kullan\u0131c\u0131 Profili Y\u00f6netimi<\/h2>\n<p>Auth0 Lock, kullan\u0131c\u0131n\u0131n e-posta adresi, ad\u0131 ve profil resmi gibi temel bilgileri alman\u0131za imkan tan\u0131r. Bu bilgilere eri\u015fmek i\u00e7in Lock nesnesinin <code>getUserInfo<\/code> metodundan faydalan\u0131l\u0131r.<\/p>\n<p><code>AuthService<\/code> s\u0131n\u0131f\u0131na eklenebilecek profil getirme metodu:<\/p>\n<pre><code>public getUserProfile(callback: (err: any, profile: any) =&gt; void): void {\n  const accessToken = this.getAccessToken();\n  if (!accessToken) {\n    callback('Access token bulunamad\u0131', null);\n    return;\n  }\n\n  this.lock.getUserInfo(accessToken, (error, profile) =&gt; {\n    if (error) {\n      console.error('Profil bilgisi alma hatas\u0131:', error);\n      return callback(error, null);\n    }\n    callback(null, profile);\n  });\n}\n<\/code><\/pre>\n<p>Bile\u015fen (Component) taraf\u0131nda kullan\u0131m \u00f6rne\u011fi:<\/p>\n<pre><code>import { Component, OnInit } from '@angular\/core';\nimport { AuthService } from '..\/auth.service';\n\n@Component({\n  selector: 'app-user-profile',\n  template: <code>\n    &lt;div *ngIf=\"userProfile\" class=\"profile-card\"&gt;\n      &lt;img [src]=\"userProfile.picture\" alt=\"Profil Resmi\" \/&gt;\n      &lt;h3&gt;{{ userProfile.name }}&lt;\/h3&gt;\n      &lt;p&gt;{{ userProfile.email }}&lt;\/p&gt;\n    &lt;\/div&gt;\n  <\/code>\n})\nexport class UserProfileComponent implements OnInit {\n  userProfile: any;\n\n  constructor(private authService: AuthService) {}\n\n  ngOnInit(): void {\n    if (this.authService.isAuthenticated()) {\n      this.authService.getUserProfile((err, profile) =&gt; {\n        if (profile) {\n          this.userProfile = profile;\n        }\n      });\n    }\n  }\n}\n<\/code><\/pre>\n<h2>8. Auth0 Lock \u00d6zelle\u015ftirme ve Tema Ayarlar\u0131<\/h2>\n<p>Auth0 Lock&#8217;un en b\u00fcy\u00fck avantajlar\u0131ndan biri, markan\u0131z\u0131n kurumsal kimli\u011fine tam uyum sa\u011flayacak \u015fekilde \u00f6zelle\u015ftirilebilmesidir. Lock yap\u0131land\u0131rma nesnesi (<code>Auth0LockConstructorOptions<\/code>) \u00fczerinden bir\u00e7ok g\u00f6rsel ve davran\u0131\u015fsal parametre de\u011fi\u015ftirilebilir.<\/p>\n<h3>G\u00f6rsel Tema \u00d6zelle\u015ftirmesi<\/h3>\n<pre><code>theme: {\n  logo: 'https:\/\/ornek-sitemiz.com\/assets\/logo.png',\n  primaryColor: '#1E88E5',\n  labeledSubmitButton: true\n}\n<\/code><\/pre>\n<h3>T\u00fcrk\u00e7e Dil Deste\u011fi (Localization)<\/h3>\n<p>Auth0 Lock, varsay\u0131lan olarak \u0130ngilizce aray\u00fczle gelir. Ancak <code>languageDictionary<\/code> \u00f6zelli\u011fi veya dil se\u00e7ene\u011fi kullan\u0131larak tamamen T\u00fcrk\u00e7e hale getirilebilir:<\/p>\n<pre><code>language: 'tr',\nlanguageDictionary: {\n  emailInputPlaceholder: \"yol@ornek.com\",\n  title: \"Giri\u015f Yap\u0131n\",\n  signUpTitle: \"Kay\u0131t Ol\",\n  passwordInputPlaceholder: \"\u015eifreniz\"\n}\n<\/code><\/pre>\n<h3>Giri\u015f Y\u00f6ntemlerini S\u0131n\u0131rland\u0131rma<\/h3>\n<p>Uygulaman\u0131zda yaln\u0131zca sosyal medya (Google, GitHub) veya yaln\u0131zca kurumsal DB ba\u011flant\u0131lar\u0131n\u0131 izinli k\u0131labilirsiniz:<\/p>\n<pre><code>allowedConnections: ['google-oauth2', 'github', 'Username-Password-Authentication']\n<\/code><\/pre>\n<h2>9. G\u00fcvenlik Best Practices (En \u0130yi Uygulamalar)<\/h2>\n<p>Angular ve Auth0 Lock kullan\u0131rken g\u00fcvenli\u011fi en \u00fcst seviyeye \u00e7\u0131karmak i\u00e7in a\u015fa\u011f\u0131daki mimari kurallara dikkat edilmelidir:<\/p>\n<h3>1. Implicit Flow Yerine Authorization Code Flow with PKCE<\/h3>\n<p>Geleneksel SPA&#8217;larda kullan\u0131lan Implicit Flow (do\u011frudan token alma) g\u00fcvenlik standartlar\u0131nda art\u0131k \u00f6nerilmemektedir. Bunun yerine Auth0 v12+ ve modern SPA standartlar\u0131nda <strong>Authorization Code Flow with PKCE (Proof Key for Code Exchange)<\/strong> tercih edilmelidir. Lock k\u00fct\u00fcphanesi yap\u0131land\u0131rmas\u0131nda <code>oidcConformant: true<\/code> se\u00e7ilerek modern standartlara uyum sa\u011flan\u0131r.<\/p>\n<h3>2. Token Depolama G\u00fcvenli\u011fi (LocalStorage vs In-Memory)<\/h3>\n<p>Token&#8217;lar\u0131n <code>LocalStorage<\/code> i\u00e7erisinde saklanmas\u0131, uygulaman\u0131zda olu\u015fabilecek bir Cross-Site Scripting (XSS) zafiyeti durumunda token&#8217;\u0131n \u00e7al\u0131nma riskini do\u011furur. En g\u00fcvenli yakla\u015f\u0131m:<\/p>\n<ul>\n<li>Token&#8217;lar\u0131 belekte (In-Memory) tutmak ve sayfa yenilendi\u011finde Auth0 Silent Authentication (Sessiz Kimlik Do\u011frulama) ile token&#8217;\u0131 arka planda yenilemektir.<\/li>\n<li>Refresh Token kullan\u0131l\u0131yorsa, Auth0 Dashboard \u00fczerinden <strong>Refresh Token Rotation<\/strong> \u00f6zelli\u011finin aktif edilmesi \u00f6nerilir.<\/li>\n<\/ul>\n<h3>3. Content Security Policy (CSP)<\/h3>\n<p>Uygulaman\u0131z\u0131n HTML yap\u0131s\u0131na kat\u0131 CSP kurallar\u0131 ekleyerek d\u0131\u015far\u0131dan zararl\u0131 betiklerin y\u00fcr\u00fct\u00fclmesi engellenmelidir. Auth0 etki alan\u0131na (domain) ve Lock kaynaklar\u0131na CSP ba\u015fl\u0131klar\u0131nda izin verilmelidir.<\/p>\n<h2>10. Kar\u015f\u0131la\u015f\u0131lan Yayg\u0131n Sorunlar ve \u00c7\u00f6z\u00fcmleri<\/h2>\n<h3>CORS (Cross-Origin Resource Sharing) Hatalar\u0131<\/h3>\n<p>E\u011fer konsolda <code>Origin http:\/\/localhost:4200 is not allowed<\/code> \u015feklinde bir hata al\u0131yorsan\u0131z, Auth0 Dashboard \u00fczerindeki uygulaman\u0131z\u0131n <strong>Allowed Web Origins<\/strong> ve <strong>Allowed Callback URLs<\/strong> alanlar\u0131n\u0131 kontrol etmelisiniz. Bu alanlarda adres sonunda taksim i\u015fareti (<code>\/<\/code>) bulunmamas\u0131na dikkat edilmelidir.<\/p>\n<h3>Lock Ekran\u0131 Y\u00fcklenmiyor veya A\u00e7\u0131lm\u0131yor<\/h3>\n<p>Auth0 Client ID veya Domain bilgilerinin yanl\u0131\u015f yaz\u0131lmas\u0131 veya t\u0131rnak i\u015faretleri aras\u0131nda bo\u015fluk kalmas\u0131 durumunda Lock ba\u015flat\u0131lamaz. Ayr\u0131ca, taray\u0131c\u0131da \u00e7al\u0131\u015fmay\u0131 engelleyen bir reklam engelleyici (AdBlocker) olup olmad\u0131\u011f\u0131 kontrol edilmelidir.<\/p>\n<h3>JWT Token \u0130mzas\u0131 Do\u011frulama Hatas\u0131<\/h3>\n<p>Backend servisinize g\u00f6nderdi\u011finiz Access Token kabul edilmiyorsa, Auth0 Dashboard \u00fczerinde olu\u015fturulan API&#8217;nizin Identifier (Audience) de\u011feri ile Angular uygulaman\u0131zdaki <code>audience<\/code> parametresinin birebir e\u015fle\u015fti\u011finden emin olun.<\/p>\n<h2>11. Sonu\u00e7<\/h2>\n<p>Angular ve Auth0 Lock kombinasyonu, modern web uygulamalar\u0131 i\u00e7in son derece g\u00fcvenli, h\u0131zl\u0131 entegre edilebilir ve esnek bir kimlik do\u011frulama \u00e7\u00f6z\u00fcm\u00fc sunar. Geli\u015ftiricileri karma\u015f\u0131k g\u00fcvenlik protokollerini ba\u015ftan yazma zorunlulu\u011fundan kurtar\u0131rken, kullan\u0131c\u0131lara sorunsuz ve \u015f\u0131k bir giri\u015f deneyimi sa\u011flar.<\/p>\n<p>Bu rehberde kapsanan AuthService mimarisi, HTTP Interceptor kullan\u0131m\u0131, Route Guard korumas\u0131 ve g\u00fcvenlik en iyi uygulamalar\u0131 sayesinde, Angular projelerinizde kurumsal seviyede bir kimlik do\u011frulama altyap\u0131s\u0131n\u0131 g\u00fcvenle kurgulayabilirsiniz. Projenizin b\u00fcy\u00fckl\u00fc\u011f\u00fcne ba\u011fl\u0131 olarak rolled-based access control (RBAC) ve multi-factor authentication (MFA) gibi ek Auth0 \u00f6zelliklerini de bu mimariye kolayca entegre edebilirsiniz.<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/angular-auth0-lock-integration-demo\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/angular-auth0-lock-integration-demo<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"G\u00fcn\u00fcm\u00fcz modern web uygulamalar\u0131nda g\u00fcvenlik, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin en kritik unsurlar\u0131ndan biri haline gelmi\u015ftir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1488],"tags":[],"class_list":{"0":"post-43656","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-angular","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi\" \/>\n<meta property=\"og:description\" content=\"G\u00fcn\u00fcm\u00fcz modern web uygulamalar\u0131nda g\u00fcvenlik, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin en kritik unsurlar\u0131ndan biri haline gelmi\u015ftir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-28T05:01:06+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-28T05:01:42+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi\",\"datePublished\":\"2026-07-28T05:01:06+00:00\",\"dateModified\":\"2026-07-28T05:01:42+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\"},\"wordCount\":1667,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Angular\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\",\"name\":\"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-28T05:01:06+00:00\",\"dateModified\":\"2026-07-28T05:01:42+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/","og_locale":"tr_TR","og_type":"article","og_title":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi","og_description":"G\u00fcn\u00fcm\u00fcz modern web uygulamalar\u0131nda g\u00fcvenlik, yaz\u0131l\u0131m geli\u015ftirme s\u00fcre\u00e7lerinin en kritik unsurlar\u0131ndan biri haline gelmi\u015ftir.","og_url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-28T05:01:06+00:00","article_modified_time":"2026-07-28T05:01:42+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi","datePublished":"2026-07-28T05:01:06+00:00","dateModified":"2026-07-28T05:01:42+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/"},"wordCount":1667,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Angular"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/","url":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/","name":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-28T05:01:06+00:00","dateModified":"2026-07-28T05:01:42+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/angular-ve-auth0-lock-ile-guvenli-kimlik-dogrulama-rehberi\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Angular ve Auth0 Lock ile G\u00fcvenli Kimlik Do\u011frulama Rehberi"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43656","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=43656"}],"version-history":[{"count":2,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43656\/revisions"}],"predecessor-version":[{"id":43658,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43656\/revisions\/43658"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43656"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43656"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43656"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}