Bedrud از چندین روش احراز هویت پشتیبانی میکند.
JWT (JSON Web Tokens)
Bedrud از JWT برای مدیریت جلسه استفاده میکند. هنگام ورود، سرور دو توکن برمیگرداند:
۱. Access Token: کوتاهمدت (مثلاً ۱ ساعت). برای دسترسی به endpointهای محافظتشده استفاده میشود. ۲. Refresh Token: طولانیمدت (مثلاً ۳۰ روز). برای دریافت Access Token جدید بدون نیاز به ورود مجدد استفاده میشود.
سرور این توکنها را در internal/middleware/auth.go تأیید میکند.
مدیریت توکن و امنیت
۱. استراتژی جفت توکن (Rotation)
Bedrud از یک استراتژی امن rotation توکن استفاده میکند. وقتی کاربر احراز هویت میشود، دریافت میکند:
- Access Token: با HS256 امضا شده، شامل شناسه کاربر، نام و دسترسیها. برای مدت کوتاهی معتبر است (از طریق
tokenDurationپیکربندی میشود). - Refresh Token: یک توکن طولانیمدت جداگانه.
Rotation: وقتی Access Token منقضی شود، کلاینت Refresh Token را به /api/auth/refresh ارسال میکند. سرور یک جفت توکن کاملاً جدید صادر میکند و refresh token ذخیرهشده در دیتابیس را بهروزرسانی میکند. این کار پنجره فرصت سوءاستفاده را حتی در صورت دزدیده شدن توکن محدود میکند.
۲. ابطال توکن (Blacklisting)
برای پشتیبانی از خروج امن، Bedrud یک Token Blacklist پیادهسازی کرده است.
- وقتی کاربری خارج میشود، Refresh Token فعلی او به جدول
blocked_refresh_tokensاضافه میشود. - قبل از refresh هر جلسه، سرور این جدول را بررسی میکند. اگر توکنی مسدود باشد، درخواست فوراً رد میشود.
- یک task پسزمینه (Scheduler) توکنهای مسدود شده را پس از انقضای طبیعیشان پاکسازی میکند.
۳. ساختار Claims توکن JWT
توکنها متادیتایی حمل میکنند که به backend و frontend اجازه میدهد بدون hit به دیتابیس تصمیمگیری سریع انجام دهند:
{
"userId": "uuid-string",
"email": "user@example.com",
"name": "Display Name",
"accesses": ["user", "admin"],
"exp": 123456789,
"iat": 123456780
}روشهای احراز هویت
۱. ایمیل و رمز عبور محلی
- رمزهای عبور با bcrypt هش میشوند — هرگز به صورت متن ساده ذخیره نمیشوند.
- هنگام ثبتنام، یک رکورد User جدید در دیتابیس ایجاد میشود.
۲. ورود اجتماعی (OAuth2)
Bedrud از کتابخانه Goth برای پشتیبانی از:
- GitHub
برای فعالسازی، بخش auth: در config.yaml را با Client ID و API Secret خود پر کنید.
۳. Passkeyها (WebAuthn/FIDO2)
Bedrud از احراز هویت بدون رمز عبور بر اساس استاندارد FIDO2 (WebAuthn) پشتیبانی میکند.
- مراسم ثبتنام:
۱. شروع: سرور یک Challenge رمزنگاریشده تولید و در جلسه کاربر ذخیره میکند.
۲. پایان: authenticator کلاینت (مثلاً TouchID، YubiKey) challenge را امضا میکند. سرور attestation را تأیید، Public Key را استخراج و در جدول
passkeysذخیره میکند. - مراسم احراز هویت: ۱. شروع: سرور یک challenge جدید صادر میکند. ۲. پایان: کلاینت challenge را با کلید خصوصی خود امضا میکند. سرور Public Key را از دیتابیس بازیابی، امضا را تأیید و Sign Counter را بررسی میکند.
- امنیت: تطبیق فیلد
Counterاز Replay Attack جلوگیری میکند. اگر counter authenticator از counter ذخیرهشده بیشتر نباشد، ورود رد میشود.
۴. ورود مهمان
به کاربران اجازه میدهد فقط با یک نام فوراً به جلسه بپیوندند. سرور یک رکورد کاربر موقت با نقش guest ایجاد میکند.
همکاریپذیری و CORS
Bedrud برای دسترسی از چند origin طراحی شده است — این موضوع برای توسعه (React dev server) و تولید (subdomainهای مختلف) حیاتی است.
- سیاست CORS: در
config.yamlتعریف شده. ازAllowCredentials: trueپشتیبانی میکند که برای session cookieهای استفادهشده در OAuth و مراسم Passkey لازم است. - Originهای مجاز: بهطور پیشفرض، domain خود سرور و
localhost:3000(پورت React dev server) مجاز هستند.
نقشهای کاربر (کنترل دسترسی)
هر کاربر لیستی از «access» (نقش) دارد.
user: کاربر استاندارد. میتواند اتاق ایجاد و به آنها بپیوندد.guest: کاربر موقت. فقط میتواند به اتاقها بپیوندد.superadmin: میتواند همه کاربران و اتاقها را از طریق داشبورد/adminمدیریت کند.
محافظ middleware.RequireAccess("superadmin") مسیرهای ادمین را حفاظت میکند.