Modern Kimlik Doğrulama için Gelişmiş Auth API Kullanımı

Ashley Goolam

Ashley Goolam

14 November 2025

Modern Kimlik Doğrulama için Gelişmiş Auth API Kullanımı

Kurumsal İçin Apidog

Şirket İçi (On-Premises) Dağıtım

SSO ve RBAC

SOC 2 Uyumlu

Apidog Enterprise'ı Keşfedin

Kimlik doğrulama, her modern web uygulamasının temel taşıdır, ancak kurulumu, geliştiricilerin karşılaştığı en zaman alıcı zorluklardan biri olmaya devam ediyor. **Better Auth API** ile tanışın—kullanıcı yönetimini nasıl uyguladığımızı dönüştürmeyi vaat eden, çerçeveden bağımsız bir kimlik doğrulama çözümü. Bu kapsamlı kılavuzda, Bun'ı ışık hızında performans için kullanarak Better Auth'un gücünü ve basitliğini gösteren eksiksiz bir tam yığın uygulama oluşturmayı adım adım inceleyeceğiz.

💡
Harika API Dokümantasyonu oluşturan harika bir API Test aracı mı istiyorsunuz?

Geliştirici Ekibinizin maksimum verimlilikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?

Apidog tüm taleplerinizi karşılar ve Postman'ı çok daha uygun bir fiyata değiştirir!
düğme

Better Auth API Nedir?

Better Auth API, herhangi bir JavaScript ortamında sorunsuz çalışmak üzere tasarlanmış modern, açık kaynaklı bir kimlik doğrulama çerçevesidir. Sizi belirli ekosistemlere kilitleyen geleneksel kimlik doğrulama kütüphanelerinin aksine, Better Auth, ister ön uçta React, Vue, Svelte veya vanilla JavaScript, ister arka uçta Node.js, Bun veya Deno kullanıyor olun, yığınınızla uyum sağlayan bir birleşik API sunar. Eklenti tabanlı mimarisi, geleneksel e-posta/şifreden OAuth sağlayıcılarına, geçiş anahtarlarına ve sihirli bağlantılara kadar birden fazla kimlik doğrulama stratejisini desteklerken, tür güvenliğini ve mükemmel geliştirici deneyimini korur.

better auth

Better Auth ile Başlarken: Ön Koşullar ve Proje Kurulumu

Koda dalmadan önce aşağıdakilerin yüklü olduğundan emin olun:

vs code ide

Bu kurulum npm ile mükemmel çalışsa da, 3-5 kat daha hızlı paket kurulumu ve daha akıcı bir geliştirme deneyimi sunan Bun iş akışını göstereceğiz.

Örnek Bir Proje Oluşturma: Adım Adım Uygulama

Bir React ön ucu ve Express arka ucu ile eksiksiz bir kimlik doğrulama sistemi oluşturalım, veritabanı kalıcılığı da dahil.

Adım 1: Express ve Drizzle ORM ile Arka Uç Kurulumu

1. **Arka Uç Projesini Başlatın**

Önce, arka uç dizininizi oluşturun ve içine girin:

mkdir better-auth-backend
cd better-auth-backend
bun init -y

2. **Bağımlılıkları Yükleyin**

Sunucu için Express'e, kimlik doğrulama için Better Auth'a ve veritabanı yönetimi için Drizzle ORM'ye ihtiyacımız olacak:

bun add express better-auth drizzle-orm
bun add -D @types/bun @types/express drizzle-kit

3. **Ortam Değişkenlerini Yapılandırın**

Hassas yapılandırmayı depolamak için bir .env dosyası oluşturun:

BETTER_AUTH_SECRET=your-secret-key-here # Generate with: openssl rand -base64 32
BETTER_AUTH_URL=http://localhost:3000
DATABASE_URL=local.db

*BETTER_AUTH_SECRET* better-auth web sitesinde de oluşturulabilir.

4. **Drizzle ORM ile Veritabanı Şeması Oluşturun**

Better Auth, mükemmel TypeScript desteği sağlayan ve yerel modül sorunlarını önleyen Drizzle ile en iyi şekilde çalışır. src/db/schema.ts dosyasını oluşturun:

import { sqliteTable, text, integer } from "drizzle-orm/sqlite-core";

export const user = sqliteTable("user", {
  id: text("id").primaryKey(),
  name: text('name').notNull(),
  email: text('email').notNull().unique(),
  emailVerified: integer('email_verified', { mode: 'boolean' }).notNull().default(false),
  image: text('image'),
  createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
  updatedAt: integer('updated_at', { mode: 'timestamp' }).notNull(),
});

export const session = sqliteTable("session", {
  id: text("id").primaryKey(),
  expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),
  token: text('token').notNull().unique(),
  createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
  userId: text('user_id').notNull(),
});

export const account = sqliteTable("account", {
  id: text("id").primaryKey(),
  accountId: text('account_id').notNull(),
  providerId: text('provider_id').notNull(),
  userId: text('user_id').notNull(),
  accessToken: text('access_token'),
  refreshToken: text('refresh_token'),
  createdAt: integer('created_at', { mode: 'timestamp' }).notNull(),
});

export const verification = sqliteTable("verification", {
  id: text("id").primaryKey(),
  identifier: text('identifier').notNull(),
  value: text('value').notNull(),
  expiresAt: integer('expires_at', { mode: 'timestamp' }).notNull(),
});

5. **Veritabanı Bağlantısını Yapılandırın**

Bun'ın yerel SQLite bağlamasını kullanarak src/db/index.ts dosyasını oluşturun:

import { Database } from "bun:sqlite";
import { drizzle } from "drizzle-orm/bun-sqlite";

const sqlite = new Database("local.db");
export const db = drizzle(sqlite);

6. **Better Auth Yapılandırmasını Ayarlayın**

Better Auth API'yi yapılandırmak için src/lib/auth.ts dosyasını oluşturun:

import { betterAuth } from "better-auth";
import { drizzleAdapter } from "better-auth/adapters/drizzle";
import { db } from "../db";
import { user, session, account, verification } from "../db/schema";

export const auth = betterAuth({
  database: drizzleAdapter(db, {
    provider: "sqlite",
    schema: {
      user: user,
      session: session,
      account: account,
      verification: verification,
    },
  }),
  emailAndPassword: {
    enabled: true,
  },
  trustedOrigins: ["http://localhost:5173"],
});

7. **Express Sunucusu Oluşturun**

src/index.ts içinde Better Auth API işleyicisini bağlayın:

import express from "express";
import cors from "cors";
import { toNodeHandler } from "better-auth/node";
import { auth } from "./lib/auth";

const app = express();
const PORT = process.env.PORT || 3000;

app.use(
  cors({
    origin: "http://localhost:5173",
    credentials: true,
  })
);

// Mount Better Auth API at /api/auth
app.use("/api/auth", toNodeHandler(auth));
app.use(express.json());

app.get("/api/me", async (req, res) => {
  const session = await auth.api.getSession({
    headers: req.headers,
  });
  
  if (!session) {
    return res.status(401).json({ error: "Unauthorized" });
  }
  
  res.json({ user: session.user });
});

app.listen(PORT, () => {
  console.log(`Server running on http://localhost:${PORT}`);
});

8. **Veritabanı Geçişini Çalıştırın**

Arka uç kök dizininde drizzle.config.ts dosyasını oluşturun:

import { defineConfig } from "drizzle-kit";

export default defineConfig({
  dialect: "sqlite",
  schema: "./src/db/schema.ts",
  out: "./drizzle",
  dbCredentials: {
    url: "local.db",
  },
});

Tabloları oluşturmak için geçişi çalıştırın:

bunx drizzle-kit push
arka uç sunucu proje yapısı

Adım 2: React ve Vite ile Ön Uç Kurulumu

1. **React Uygulaması Oluşturun**

Yeni bir terminalde ön ucu başlatın:

bun create vite better-auth-frontend --template react-ts
cd better-auth-frontend

2. **Bağımlılıkları Yükleyin**

bun add better-auth

3. **Tailwind CSS'i Yapılandırın (V4 Güncellemesi)**

Tailwind CSS v4 sonrası farklı bir kurulum gerektirir. Yeni paketleri yükleyin:

bun add -D tailwindcss postcss @tailwindcss/postcss

Proje kök dizininde tailwind.config.js dosyasını oluşturun:

/** @type {import('tailwindcss').Config} */
export default {
  content: [
    "./index.html",
    "./src/**/*.{js,ts,jsx,tsx}",
  ],
  theme: {
    extend: {},
  },
  plugins: [],
}

postcss.config.js dosyasını oluşturun:

export default {
  plugins: {
    "@tailwindcss/postcss": {},
  },
}

src/index.css dosyasını oluşturun:

@import "tailwindcss";

body {
  margin: 0;
  font-family: system-ui, -apple-system, sans-serif;
}

4. **Better Auth İstemcisini Kurun**

src/lib/auth-client.ts dosyasını oluşturun:

import { createAuthClient } from "better-auth/react";

export const authClient = createAuthClient({
  baseURL: "http://localhost:3000",
});

export const { signIn, signUp, useSession } = authClient;

5. **Kimlik Doğrulama Arayüzünü Oluşturun**

src/App.tsx dosyasını eksiksiz bir kimlik doğrulama arayüzü ile değiştirin:

import { useState } from 'react';
import { useSession, signIn, signUp } from './lib/auth-client';

function App() {
  const { data: session, isPending } = useSession();
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [name, setName] = useState('');

  const handleSignUp = async (e: React.FormEvent) => {
    e.preventDefault();
    await signUp.email({
      name,
      email,
      password,
      callbackURL: '/',
    });
  };

  const handleSignIn = async (e: React.FormEvent) => {
    e.preventDefault();
    await signIn.email({
      email,
      password,
    });
  };

  const handleSignOut = async () => {
    await authClient.signOut();
  };

  if (isPending) return <div className="flex items-center justify-center min-h-screen">Yükleniyor...</div>;

  return (
    <div className="min-h-screen bg-gray-100 flex items-center justify-center p-4">
      <div className="max-w-md w-full bg-white rounded-lg shadow-md p-6">
        <h1 className="text-2xl font-bold text-center mb-6 text-gray-800">
          Better Auth API Test
        </h1>

        {session?.user ? (
          <div className="space-y-4">
            <div className="bg-green-50 p-4 rounded-md">
              <p className="text-green-800 font-semibold">Giriş yapıldı:</p>
              <p className="text-green-700">{session.user.email}</p>
              <p className="text-green-600 text-sm">{session.user.name}</p>
            </div>
            <button
              onClick={handleSignOut}
              className="w-full bg-red-500 hover:bg-red-600 text-white font-medium py-2 px-4 rounded-md transition"
            >
              Çıkış Yap
            </button>
          </div>
        ) : (
          <div className="space-y-4">
            <form onSubmit={handleSignUp} className="space-y-3">
              <h2 className="text-lg font-semibold text-gray-700">Kaydol</h2>
              <input
                type="text"
                placeholder="Ad"
                value={name}
                onChange={(e) => setName(e.target.value)}
                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                required
              />
              <input
                type="email"
                placeholder="E-posta"
                value={email}
                onChange={(e) => setEmail(e.target.value)}
                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                required
              />
              <input
                type="password"
                placeholder="Şifre"
                value={password}
                onChange={(e) => setPassword(e.target.value)}
                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                required
              />
              <button
                type="submit"
                className="w-full bg-green-500 hover:bg-green-600 text-white font-medium py-2 px-4 rounded-md transition"
              >
                Hesap Oluştur
              </button>
            </form>

            <form onSubmit={handleSignIn} className="space-y-3">
              <h2 className="text-lg font-semibold text-gray-700">Giriş Yap</h2>
              <input
                type="email"
                placeholder="E-posta"
                value={email}
                onChange={(e) => setEmail(e.target.value)}
                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                required
              />
              <input
                type="password"
                placeholder="Şifre"
                value={password}
                onChange={(e) => setPassword(e.target.value)}
                className="w-full px-3 py-2 border border-gray-300 rounded-md focus:outline-none focus:ring-2 focus:ring-blue-500"
                required
              />
              <button
                type="submit"
                className="w-full bg-blue-500 hover:bg-blue-600 text-white font-medium py-2 px-4 rounded-md transition"
              >
                Giriş Yap
              </button>
            </form>
          </div>
        )}
      </div>
    </div>
  );
}

export default App;
ön uç uygulama proje yapısı

Adım 3: Entegrasyonu Test Etme

1. **Arka Uç Sunucusunu Başlatın**

cd better-auth-backend
bun dev
better auth arka uç sunucusunu çalıştırın

2. **Ön Uç Geliştirmeyi Başlatın**

cd better-auth-frontend
bun dev
better auth ön uç uygulamasını çalıştırın

3. **Kimlik Doğrulama Akışını Test Edin**

kaydol veya giriş yap
Doğru Bilgi
yanlış bilgiyle giriş denemesi
Yanlış Bilgi
çıkış yap

Better Auth API'nin Temel Faydaları

**Better Auth API**, kendisini birkaç çekici avantajla öne çıkarır:

Sıkça Sorulan Sorular

S1: Better Auth API'yi Bun yerine npm ile kullanabilir miyim?
Cevap: Kesinlikle. Bu kılavuz performans avantajları için Bun'ı kullanırken, her komutun bir npm karşılığı vardır. bun add yerine npm install, bun dev yerine npm run dev ve bunx yerine npx kullanın. Tek Bun'a özgü kod, Node.js ortamları için better-sqlite3 ile değiştirilebilecek olan bun:sqlite içe aktarmasıdır.

S2: Neden Drizzle ORM'ye ihtiyacımız oldu? Better Auth tabloları otomatik olarak oluşturamaz mı?
Cevap: Better Auth, açık veritabanı yönetimi ilkesini takip eder. Drizzle, tür güvenli geçişler, şema sürümleme sağlar ve kazara veri kaybını önler. drizzle-kit push komutu, veritabanı evriminiz üzerinde tam kontrol sağlayan tek seferlik bir kurulumdur.

S3: "Missing parameter name" hatasıyla karşılaşırsam ne olur?
Cevap: Bu, Express'te joker karakterlerle app.all() kullanıldığında ortaya çıkar. Çözüm, bunun yerine app.use("/api/auth", toNodeHandler(auth)) kullanmaktır. Better Auth'un işleyicisi tüm alt yolları dahili olarak yönettiği için Express'in joker karakter eşleştirmesine ihtiyacı yoktur.

S4: Sosyal kimlik doğrulama sağlayıcılarını nasıl eklerim?
Cevap: Better Auth yapılandırmanızda OAuth eklentilerini etkinleştirin. Örneğin, GitHub eklemek için:

import { betterAuth } from "better-auth";
import { github } from "better-auth/plugins";

export const auth = betterAuth({
  plugins: [
    github({
      clientId: process.env.GITHUB_CLIENT_ID,
      clientSecret: process.env.GITHUB_CLIENT_SECRET,
    })
  ]
});

S5: Better Auth API üretim için hazır mı?
Cevap: Evet. Better Auth, binlerce kullanıcısı olan birkaç SaaS ürünü için kimlik doğrulamayı desteklemektedir. Çerçeve, güvenli oturum yönetimi, CSRF koruması uygular ve OWASP yönergelerini takip eder. Ancak, her zaman kendi özel uygulamanızı denetleyin ve bağımlılıkları güncel tutun.

Sonuç

**Better Auth API** gibi modern çözümlerle sıfırdan kimlik doğrulama oluşturmak artık gerekli değil. Bu kılavuzda, veritabanı şemasından kullanıcı arayüzü bileşenlerine kadar eksiksiz bir kimlik doğrulama sistemini birkaç dakika içinde oluşturduk! Better Auth'un esnekliği, Drizzle ORM'nin tür güvenliği ve Bun'ın performansının birleşimi, prototipten üretime ölçeklenebilen bir geliştirici deneyimi yaratır.

Adım adım süreç, kimlik doğrulamanın kritik olmasına rağmen karmaşık olmak zorunda olmadığını gösteriyor. Better Auth'un eklenti mimarisinden ve çerçeveden bağımsız tasarımından yararlanarak, güvenlik uygulamalarıyla uğraşmak yerine kullanıcılarınız için önemli olan özellikleri oluşturmaya odaklanabilirsiniz.

İster bir yan proje ister bir kurumsal uygulama geliştiriyor olun, Better Auth API, ihtiyaçlarınıza uyum sağlayan güvenli, ölçeklenebilir kimlik doğrulama için bir temel sağlar—tersi değil.

💡
Harika API Dokümantasyonu oluşturan harika bir API Test aracı mı istiyorsunuz?

Geliştirici Ekibinizin maksimum verimlilikle birlikte çalışması için entegre, Hepsi Bir Arada bir platform mu istiyorsunuz?

Apidog tüm taleplerinizi karşılar ve Postman'ı çok daha uygun bir fiyata değiştirir!
düğme

API Tasarım-Öncelikli Yaklaşımı Apidog'da Uygulayın

API'leri oluşturmanın ve kullanmanın daha kolay yolunu keşfedin