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
package main
import (
"fmt"
"net/http"
"net/http/httptest"
)
func main() {
// buraya yaz
}Örnek çözüm
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
if token == "" {
http.Error(w, "yetkisiz", http.StatusUnauthorized)
____
}
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 |