Next.js’da avtorizatsiya: Auth.js, Clerk yoki o‘z yechimingiz
Amaliyot4 daqInnovialabs tahririyati
Qisqacha
Clerk eng tez ishga tushadi, lekin foydalanuvchi ma’lumotlarini uchinchi tomon xizmatida saqlaydi va o‘sish bilan qimmatlashadi; Auth.js bepul va foydalanuvchilarni sizning bazangizda saqlaydi; o‘z yechimingiz to‘liq nazorat beradi. Har qanday holatda sessiyani faqat middleware’da emas, har bir server komponent va server action ichida tekshiring.
Qisqacha javob
- Clerk — tayyor kirish ekranlari, foydalanuvchilar va tashkilotlarni boshqarishga ega bulutli xizmat. Eng tez ishga tushadi; o‘sish bilan faol foydalanuvchilar uchun to‘laysiz, ma’lumotlar esa provayder serverlarida saqlanadi.
- Auth.js (avvalgi NextAuth) — open-source kutubxona. Bepul, foydalanuvchilar adapterlar orqali sizning bazangizda saqlanadi, ko‘plab OAuth provayderlar qutidan tayyor. Interfeysni o‘zingiz qilasiz.
- O‘z yechimingiz — o‘z sessiyalaringiz, parollarni xeshlash va OTP. Maksimal nazorat va vendorga bog‘liqlik yo‘q, lekin xavfsizlik uchun butun javobgarlik sizda.
Taqqoslash
| Mezon | Clerk | Auth.js | O‘z yechimingiz |
|---|---|---|---|
| Narx | Bepul tarif, keyin faol foydalanuvchilar uchun to‘lov | Bepul, faqat hosting uchun to‘laysiz | Ishlab chiqish va qo‘llab-quvvatlash vaqti |
| Ishga tushirish tezligi | Eng tez | O‘rtacha | Eng uzoq |
| Nazorat | Provayder imkoniyatlari doirasida | Yuqori | To‘liq |
| Foydalanuvchi ma’lumotlari qayerda | Provayder infratuzilmasi | Sizning bazangiz | Sizning bazangiz |
| Interfeys | Tayyor komponentlar | O‘zingizniki | O‘zingizniki |
O‘zbekistonda ma’lumot saqlanadigan joy muhim. Shaxsga doir ma’lumotlar to‘g‘risidagi qonun O‘zbekiston fuqarolarining shaxsiy ma’lumotlarini mamlakatda joylashgan serverlarda saqlashni talab qiladi. Agar bu loyihangizga tegishli bo‘lsa, xorijiy bulutli xizmat mos kelmasligi mumkin; mahalliy bazali Auth.js yoki o‘z yechimingiz ishonchliroq. Talablarni o‘z holatingiz uchun yurist bilan aniqlashtiring.
Marshrutlarni himoyalash: uch daraja
Middleware mehmonlarni yo‘naltirish uchun qulay, lekin u yagona tekshiruv bo‘lmasligi kerak. Uni birinchi filtr deb hisoblang, kirish huquqini esa ma’lumotlarga yaqin joyda tekshiring.
- Middleware (yoki Next.js’ning yangi versiyalarida proxy) — avtorizatsiyadan o‘tmaganlarni
/dashboarddan/loginga yo‘naltiradi. U tez bo‘lishi kerak: sessiya cookie’si borligini tekshirish, og‘ir hech narsa yo‘q. - Server komponentlar — ma’lumot yuklashdan oldin sessiyani tekshiradi.
- Server actions va route handlers — har bir amal ichida sessiya va huquqlarni tekshiradi.
// app/dashboard/page.tsx
import { auth } from '@/auth'
import { redirect } from 'next/navigation'
export default async function Dashboard() {
const session = await auth()
if (!session?.user) redirect('/login')
const projects = await getProjects(session.user.id)
// render projects
}
Server actions — bu ochiq endpointlar
Server action’ni interfeysda tugma yashirilgan bo‘lsa ham to‘g‘ridan-to‘g‘ri POST so‘rov bilan chaqirish mumkin. Doim autentifikatsiya va egalik huquqini tekshiring:
'use server'
import { auth } from '@/auth'
export async function deleteProject(id: string) {
const session = await auth()
if (!session?.user) throw new Error('Unauthorized')
const project = await db.project.findUnique({ where: { id } })
if (project?.ownerId !== session.user.id) throw new Error('Forbidden')
await db.project.delete({ where: { id } })
}
Yaxshi pattern — ma’lumotlarga kirish qatlami: getProjects kabi funksiyalar sessiyani o‘zi tekshiradi, shunda hech bir sahifa buni unutolmaydi.
Telefon raqami va SMS orqali kirish
O‘zbekistonda ko‘p foydalanuvchilar email emas, telefon raqamini afzal ko‘radi. Odatiy ssenariy:
- Raqamni yagona formatga keltirish, masalan
+998XXXXXXXXX. - Qisqa tasodifiy kod yaratish va faqat uning xeshini amal qilish muddati bilan saqlash.
- Kodni mahalliy SMS-shlyuz orqali yuborish.
- Tekshirishda xeshlarni solishtirish, urinishlar sonini cheklash va sessiya yaratish.
Majburiy: raqam va IP bo‘yicha rate limiting (SMS pul turadi va suiiste’mollarni jalb qiladi), kodning qisqa amal qilish muddati va bir necha noto‘g‘ri urinishdan keyin bloklash. Auth.js’da bu ssenariy Credentials provayderi orqali amalga oshiriladi; Clerk telefon orqali kirishni qo‘llab-quvvatlaydi, lekin mamlakatingiz uchun tariflar va yetkazib berishni tekshiring.
Telegram orqali kirish
Telegram mahalliy auditoriya uchun tabiiy kirish usuli. Ikkita keng tarqalgan variant:
- Saytdagi Telegram Login Widget: Telegram foydalanuvchi ma’lumotlarini
hashmaydoni bilan qaytaradi. Uni serverda HMAC-SHA256 orqali tekshiring, bunda kalit — botingiz tokenining SHA-256 qiymati, vaauth_dateyangi ekanini tekshiring. - Telegram Mini App:
initDatani serverda Telegram hujjatlaridagi algoritm bo‘yicha tekshiring, so‘ng o‘z sessiyangizni yarating.
import crypto from 'node:crypto'
export function verifyTelegramLogin(data: Record<string, string>, botToken: string) {
const { hash, ...fields } = data
const checkString = Object.keys(fields).sort().map((k) => `${k}=${fields[k]}`).join('\n')
const secret = crypto.createHash('sha256').update(botToken).digest()
const expected = crypto.createHmac('sha256', secret).update(checkString).digest('hex')
const fresh = Date.now() / 1000 - Number(fields.auth_date) < 86400
return fresh && crypto.timingSafeEqual(Buffer.from(expected), Buffer.from(hash ?? ''))
}
Mijozdan kelgan Telegram ma’lumotlariga bu tekshiruvsiz hech qachon ishonmang.
Ko‘p uchraydigan xatolar
- Faqat middleware’ga tayanib, server actions’ni himoyasiz qoldirish.
- Sessiya yoki tokenlarni
httpOnlycookie o‘rnigalocalStorageda saqlash. - OTP kodlarni ochiq matnda va urinishlar cheklovisiz saqlash.
- Ma’lumot saqlash joyi talablarini tekshirmasdan bulutli provayderni tanlash.