CodeBlanks Logo Icon CodeBlanks

Auth middleware

  • Go kursu
  • İleri seviye
  • Ders 35/68
  • 4 dk

Token doğrulayan bir auth middleware yazmayı öğrenirsin.

Auth middleware

Kimlik doğrulama middleware'i isteği işleyiciye geçirmeden önce kimlik bilgisini kontrol eder. Geçersizse 401 Unauthorized döner ve next'i çağırmaz:

func yetki(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.Header.Get("Authorization") != "Bearer gizli" {
            http.Error(w, "yetkisiz", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

Kullanıcıyı context ile taşımak

Doğrulanan kullanıcı bilgisi işleyiciye context ile aktarılır:

type ctxKey struct{}

ctx := context.WithValue(r.Context(), ctxKey{}, "ada")
next.ServeHTTP(w, r.WithContext(ctx))

// işleyicide
kullanici := r.Context().Value(ctxKey{}).(string)

Anahtar olarak dışa aktarılmamış bir tür kullanmak başka paketlerle çakışmayı önler.

Uygulama Token kontrolü

yetki(next http.Handler) http.Handler yaz: X-Token başlığı "abc" değilse http.Error(w, "yetkisiz", http.StatusUnauthorized) ile dönsün. Başlıksız bir istek gönderip rec.Code değerini yazdır.

Başlangıç kodu

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func main() {
    // buraya yaz
}

Örnek çözüm

main.go
package main

import (
    "fmt"
    "net/http"
    "net/http/httptest"
)

func yetki(next http.Handler) http.Handler {
    return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
        if r.Header.Get("X-Token") != "abc" {
            http.Error(w, "yetkisiz", http.StatusUnauthorized)
            return
        }
        next.ServeHTTP(w, r)
    })
}

func main() {
    h := yetki(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {}))
    rec := httptest.NewRecorder()
    h.ServeHTTP(rec, httptest.NewRequest("GET", "/", nil))
    fmt.Println(rec.Code)
}

Beklenen çıktı

401

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Kimlik doğrulanamadığında doğru durum kodu hangisidir?

  • 404 Not Found
  • 500 Internal Server Error
  • 302 Found
  • 401 Unauthorized Doğru cevap

Açıklama: 401 kimlik bilgisinin eksik veya geçersiz olduğunu söyler; kimlik doğru ama izin yoksa 403 Forbidden kullanılır.

2 İsteği kes

Soru
if token == "" {
    http.Error(w, "yetkisiz", http.StatusUnauthorized)
    ____
}
Cevap
if token == "" {
    http.Error(w, "yetkisiz", http.StatusUnauthorized)
    return
}

Açıklama: return, next.ServeHTTP'e ulaşmadan middleware'den çıkar; istek işleyiciye gitmez.

3 Durum kodları

Kavram Anlamı
401 Kimlik yok/geçersiz
403 İzin yok
200 Başarılı
429 Çok fazla istek

İleri seviye bölümündeki tüm dersler