هویت خیلی بیشتر از Login است
چند ماه پیش تصمیم گرفتم یکی از مهمترین سرویسهای سیستم را از صفر بازطراحی کنم: Identity Service.
اول فکر میکردم کار عمدتاً دربارهٔ احراز هویت، JWT، OAuth و access token است.
اشتباه میکردم.
هرچه عمیقتر رفتم، بیشتر فهمیدم ساختن سیستم هویت به مدلسازی دنیای واقعی نزدیکتر است تا پیادهسازی API.
معمولاً از «هویت» چه میفهمیم؟
بیشتر توسعهدهندهها هویت را با اینها یکی میدانند:
- Login
- Registration
- JWT
- OAuth
- Access tokens
اینها فقط نوک کوه یخاند:
سؤالهایی که طراحی را عوض میکنند
بخش سخت وقتی شروع میشود که بپرسید:
| سؤال | چرا جدول تخت users درد میکشد |
|---|---|
| User و Person یکی باشند؟ | حساب ≠ انسان |
| Device Session در برابر User Session؟ | سرقت و multi-device رفتار متفاوت دارند |
| چرخش refresh token؟ | Replay attack به token family نیاز دارد |
| رمزنگاری PII at rest؟ | Name و Contact دارایی حساساند |
| Organization و Employee؟ | آدمها چند نقش دارند |
| Multiple Citizenship؟ | ملیت Relationship است نه یک flag |
| Location بهعنوان entity؟ | Address و geo همیشه free-text نیستند |
پاسخ به اینها فرضهایی را که سالها حمل کرده بودم بههم زد.
مدلسازی واقعیت
معماری نرمافزار اغلب کمتر دربارهٔ فریمورک است و بیشتر دربارهٔ مدلکردن واقعیت.
آدمها هویت دارند. به سازمانها تعلق دارند. دستگاه عوض میکنند. مهاجرت میکنند. چند کانال تماس دارند. تاریخچه دارند.
و همهٔ اینها بالاخره در اسکیما ظاهر میشوند.
ناگهان طراحی سرویس هویت خیلی بیشتر از پیادهسازی JWT میشود.
ادامهٔ این کتاب
User در برابر Person
چرا User Account همان انسان نیست.
Contact و Citizenship
Channelها بهعنوان Aggregate؛ ملیت بهعنوان Relationship — نه یک flag ابدی.
Dual Session و Token Family
اول Device، بعد Account؛ rotation با reuse detection.
Auth، Org و Edge
Convergence برای OTP / password / OAuth؛ Organization و geo؛ ترتیب cookie در Next.js.
جمعبندی
این سرویس چیزی را به من یاد داد که ای کاش زودتر فهمیده بودم:
معماری دربارهٔ تکنولوژی نیست. معماری دربارهٔ فهم دامنهای است که میخواهید مدل کنید.
فریمورک عوض میشود. زبان عوض میشود. دیتابیس عوض میشود. دامنه میماند.
و اگر خوب مدلش کنید، بقیه سادهتر میشود.
فصل بعد
ادامه: چرا User و Person متفاوتاند.
نسخهٔ canonical. همچنین در Medium.