Bedrud birden fazla kimlik doğrulama yöntemini destekler.
JWT (JSON Web Tokens)
Bedrud oturum yönetimi için JWT kullanır. Giriş sırasında sunucu iki jeton döndürür:
- Erişim Jetonu (Access Token): Kısa ömürlü (ör. 1 saat). Korumalı API uç noktalarına erişmek için kullanılır.
- Yenileme Jetonu (Refresh Token): Uzun ömürlü (ör. 30 gün). Tekrar giriş yapmadan yeni bir Erişim Jetonu almak için kullanılır.
Arka uç bu jetonları internal/middleware/auth.go dosyasında doğrular.
Jeton Yönetimi ve Güvenlik
1. Jeton Çifti Stratejisi (Rotasyon)
Bedrud güvenli bir jeton rotasyonu stratejisi kullanır. Bir kullanıcı kimlik doğrulaması yaptığında şunları alır:
- Erişim Jetonu: HS256 ile imzalanmış olup kullanıcı kimliği, adı ve izinlerini içerir. Kısa bir süre için geçerlidir (
tokenDurationile yapılandırılır). - Yenileme Jetonu: Ayrı, uzun ömürlü bir jeton.
Rotasyon: Erişim Jetonu sona erdiğinde, istemci Yenileme Jetonunu /api/auth/refresh uç noktasına gönderir. Sunucu daha sonra yepyeni bir jeton çifti yayınlar ve veritabanında saklanan yenileme jetonunu günceller. Bu, bir jeton çalınmış olsa bile fırsat penceresini sınırlar.
2. Jeton İptali (Kara Liste)
Güvenli oturum kapatmayı desteklemek için Bedrud bir Jeton Kara Listesi uygular.
- Bir kullanıcı oturumu kapattığında, geçerli Yenileme Jetonu
blocked_refresh_tokenstablosuna eklenir. - Herhangi bir oturumu yenilemeden önce sunucu bu tabloyu denetler. Bir jeton engellenmişse, istek hemen reddedilir.
- Bir arka plan görevi (Zamanlayıcı), engellenen bu jetonları doğal olarak sona erdikten sonra temizlemek üzere tasarlanmıştır.
3. JWT Claims Yapısı
Jetonlar, arka ucun ve ön ucun veritabanı sorgusu yapmadan hızlı kararlar almasını sağlayan meta veriler taşır:
{
"userId": "uuid-string",
"email": "user@example.com",
"name": "Display Name",
"accesses": ["user", "admin"],
"exp": 123456789,
"iat": 123456780
}Kimlik Doğrulama Yöntemleri
1. Yerel E-posta ve Parola
- Parolalar bcrypt ile hashlenir - asla düz metin olarak saklanmaz.
- Kayıt olduğunuzda, veritabanında yeni bir Kullanıcı kaydı oluşturulur.
2. Sosyal Giriş (OAuth2)
Bedrud, şu sağlayıcıları desteklemek için Goth kütüphanesini kullanır:
- GitHub
Bunları, config.yaml dosyanızdaki auth: bölümüne İstemci Kimliğinizi ve API Gizli Anahtarınızı girerek etkinleştirebilirsiniz.
3. Passkey’ler (WebAuthn/FIDO2)
Bedrud, FIDO2 standardı (WebAuthn) aracılığıyla parolasız kimlik doğrulamayı destekler.
- Kayıt Seremonisi:
- Başlangıç: Sunucu kriptografik olarak güvenli bir Challenge üretir ve kullanıcının oturumunda saklar.
- Bitiş: İstemcinin kimlik doğrulayıcısı (ör. TouchID, YubiKey) challenge’ı imzalar. Sunucu kanıtı (attestation) doğrular, Açık Anahtarı çıkarır ve
passkeystablosuna kaydeder.
- Kimlik Doğrulama Seremonisi:
- Başlangıç: Sunucu yeni bir challenge yayınlar.
- Bitiş: İstemci, özel anahtarıyla challenge’ı imzalar. Sunucu veritabanından Açık Anahtarı getirir, imzayı doğrular ve İmza Sayacını (Sign Counter) denetler.
- Güvenlik:
Counteralanının eşleştirilmesi Tekrar Oynatma Saldırılarını (Replay Attacks) engeller. Kimlik doğrulayıcının sayısı saklanan sayıdan yüksek değilse, giriş reddedilir.
4. Misafir Girişi
Kullanıcıların yalnızca bir adla anında bir toplantıya katılmasına olanak tanır. Sunucu guest rolüyle geçici bir kullanıcı kaydı oluşturur.
E-posta Doğrulama
Yapılandırmada requireEmailVerification: true olduğunda, yerel (OAuth olmayan) kayıt ve giriş işlemleri e-posta onayı gerektirir:
- Kayıt kullanıcıyı oluşturur ancak
EmailVerifiedAt’inilolarak ayarlar. Kullanıcı doğrulanana kadar giriş yapamaz. - Giriş doğrulanmamış hesaplar için
403ve{"requiresVerification": true}döndürür. - Yeniden gönder
POST /api/auth/verify/resendile —verificationEmailCooldownMinsve ayrı bir hız sınırlama kovası (authResendMaxRequests) tarafından sınırlanır. - Otomatik temizlik
unverifiedAccountTTLHours(varsayılan 48s, 0 devre dışı) sonrasında doğrulanmamış hesapları siler. - E-posta değişikliği yeni bir doğrulama akışı başlatır. Kullanıcı oturumu açık kalır; yeni jeton düzenlenir.
Misafir kullanıcılar muaftır — e-postaları yoktur.
Şifre Sıfırlama
Şifre sıfırlama akışı (SMTP gerektirir):
POST /api/auth/forgot-passwordile{"email": "..."}— sunucu e-postaya sıfırlama bağlantısı gönderirPOST /api/auth/reset-passwordile{"token": "...", "newPassword": "..."}— yeni şifre belirler
Sıfırlama jetonu TTL’si resetTokenTTLHours (varsayılan 1 saat) tarafından kontrol edilir. Forgot-password uç noktası, auth hız sınırlama kovasını paylaşır.
Soğuma Süresi & Hız Sınırlama
Bedrud dört ayrı hız sınırlama kovası kullanır:
| Kova | Uç Noktalar | Varsayılan | Pencere |
|---|---|---|---|
| Auth | login, register, refresh, passkey, forgot-password | 10 | 60s |
| Misafir | guest-login | 5 | 60s |
| API | genel API | 30 | 60s |
| Yeniden Gönder | verify/resend | 3 | 60s |
Kova 0 = devre dışı. Tüm limitler uzak IP başınadır. Aşılan istekler 429 Too Many Requests ve Retry-After başlığı döndürür.
Birlikte Çalışabilirlik ve CORS
Bedrud, birden fazla kökenden erişilebilir olacak şekilde tasarlanmıştır; bu, geliştirme (React geliştirme sunucusu) ve üretim (farklı alt alan adları) için kritik öneme sahiptir.
- CORS Politikası:
config.yamliçinde tanımlanır. OAuth ve Passkey seremonileri sırasında kullanılan oturum çerezleri için gerekli olanAllowCredentials: true’yu destekler. - İzin Verilen Kökenler: Varsayılan olarak sunucunun kendi alan adına ve
localhost:3000’e (React geliştirme sunucusu portu) izin verir.
Kullanıcı Rolleri (Erişim Kontrolü)
Her kullanıcının aynı anda birden fazla erişim seviyesi içerebilen bir accesses dizisi vardır. JWT claims, middleware’in ayrıntılı izinleri kontrol etmesine olanak tanıyan tam accesses dizisini içerir.
Erişim Seviyeleri
| Erişim Seviyesi | Kapsam | Yetkiler |
|---|---|---|
superadmin | Sistem geneli | Yönetici paneline (/dashboard/admin) tam erişim, tüm admin API uç noktaları (/api/admin/*), kullanıcı yönetimi, oda yönetimi, sistem ayarları, davet jetonları. Tüm oda moderasyon eylemleri için genel atlama görevi görür. RequireAccess("superadmin") middleware’i ile korunur. |
admin | Tanımlı, zorlanmıyor | accesses dizisinde mevcut ancak şu anda hiçbir middleware tarafından kullanılmıyor. Yalnızca bilgilendirme amaçlı. Gelecekteki rol tabanlı erişim kontrolü özellikleri için ayrılmıştır. |
moderator | Oda kapsamlı | Belirli bir odayı yönetebilir: sohbeti engelleme, katılımcıları sağırlaştırma/sesini açma, spot ışığı, ekran paylaşımını durdurma, videoyu devre dışı bırakma. Bir çağrı sırasında oda oluşturan veya bir superadmin tarafından PromoteParticipant ile yükseltilir. isRoomModerator() yardımcısı ile kontrol edilir. |
user | Standart | Tüm kayıtlar için varsayılan. Oda oluşturabilir, odalara katılabilir, profili yönetebilir ve kendi passkey’lerini yönetebilir. Protected() middleware’i ile korunur. |
guest | Sınırlı | Misafir girişi ile genel odalara katılmak için geçici kullanıcı. Oda oluşturamaz veya korumalı özelliklere erişemez. |
Rol Hiyerarşisi
superadmin > admin > moderator > user > guest
Bir superadmin, oda moderatörü olarak yükseltilmeden herhangi bir odada herhangi bir moderasyon eylemini gerçekleştirebilir. Oda oluşturanlar otomatik olarak oda adminidir ve katılımcıları moderatörlüğe yükseltebilir.
Rol Atama
Roller birden fazla kanal aracılığıyla yönetilir:
- CLI:
bedrud user create(userolarak oluşturur),bedrud user promote(superadminekler),bedrud user demote(superadmini kaldırır) - Yönetici Paneli: Kullanıcı detay sayfasında yükselt/düşür düğmeleri bulunur
- Admin API: İstenen
accessesdizisi ilePUT /api/admin/users/:id/accesses - Toplantı İçi: Oda oluşturan, katılımcıları oda seviyesinde moderatörlüğe yükseltebilir
Not: İlk superadmin’i oluşturmak için bir API uç noktası veya web arayüzü yoktur. Kurulumdan sonra, ilk admin erişimini başlatmak için CLI kullanmalısınız (
bedrud user create+bedrud user promote). Bu, bilinçli bir güvenlik önlemidir.